• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/quic/core/quic_framer.h"
6 
7 #include <sys/types.h>
8 
9 #include <cstddef>
10 #include <cstdint>
11 #include <limits>
12 #include <memory>
13 #include <optional>
14 #include <string>
15 #include <type_traits>
16 #include <utility>
17 
18 #include "absl/base/attributes.h"
19 #include "absl/base/macros.h"
20 #include "absl/base/optimization.h"
21 #include "absl/cleanup/cleanup.h"
22 #include "absl/strings/escaping.h"
23 #include "absl/strings/numbers.h"
24 #include "absl/strings/str_cat.h"
25 #include "absl/strings/str_split.h"
26 #include "absl/strings/string_view.h"
27 #include "quiche/quic/core/crypto/crypto_framer.h"
28 #include "quiche/quic/core/crypto/crypto_handshake.h"
29 #include "quiche/quic/core/crypto/crypto_handshake_message.h"
30 #include "quiche/quic/core/crypto/crypto_protocol.h"
31 #include "quiche/quic/core/crypto/crypto_utils.h"
32 #include "quiche/quic/core/crypto/null_decrypter.h"
33 #include "quiche/quic/core/crypto/null_encrypter.h"
34 #include "quiche/quic/core/crypto/quic_decrypter.h"
35 #include "quiche/quic/core/crypto/quic_encrypter.h"
36 #include "quiche/quic/core/crypto/quic_random.h"
37 #include "quiche/quic/core/frames/quic_ack_frequency_frame.h"
38 #include "quiche/quic/core/quic_connection_context.h"
39 #include "quiche/quic/core/quic_connection_id.h"
40 #include "quiche/quic/core/quic_constants.h"
41 #include "quiche/quic/core/quic_data_reader.h"
42 #include "quiche/quic/core/quic_data_writer.h"
43 #include "quiche/quic/core/quic_error_codes.h"
44 #include "quiche/quic/core/quic_packets.h"
45 #include "quiche/quic/core/quic_socket_address_coder.h"
46 #include "quiche/quic/core/quic_stream_frame_data_producer.h"
47 #include "quiche/quic/core/quic_time.h"
48 #include "quiche/quic/core/quic_types.h"
49 #include "quiche/quic/core/quic_utils.h"
50 #include "quiche/quic/core/quic_versions.h"
51 #include "quiche/quic/platform/api/quic_bug_tracker.h"
52 #include "quiche/quic/platform/api/quic_client_stats.h"
53 #include "quiche/quic/platform/api/quic_flag_utils.h"
54 #include "quiche/quic/platform/api/quic_flags.h"
55 #include "quiche/quic/platform/api/quic_ip_address_family.h"
56 #include "quiche/quic/platform/api/quic_logging.h"
57 #include "quiche/quic/platform/api/quic_stack_trace.h"
58 #include "quiche/common/quiche_text_utils.h"
59 
60 namespace quic {
61 
62 namespace {
63 
64 #define ENDPOINT \
65   (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
66 
67 // There are two interpretations for the Frame Type byte in the QUIC protocol,
68 // resulting in two Frame Types: Special Frame Types and Regular Frame Types.
69 //
70 // Regular Frame Types use the Frame Type byte simply. Currently defined
71 // Regular Frame Types are:
72 // Padding            : 0b 00000000 (0x00)
73 // ResetStream        : 0b 00000001 (0x01)
74 // ConnectionClose    : 0b 00000010 (0x02)
75 // GoAway             : 0b 00000011 (0x03)
76 // WindowUpdate       : 0b 00000100 (0x04)
77 // Blocked            : 0b 00000101 (0x05)
78 //
79 // Special Frame Types encode both a Frame Type and corresponding flags
80 // all in the Frame Type byte. Currently defined Special Frame Types
81 // are:
82 // Stream             : 0b 1xxxxxxx
83 // Ack                : 0b 01xxxxxx
84 //
85 // Semantics of the flag bits above (the x bits) depends on the frame type.
86 
87 // Masks to determine if the frame type is a special use
88 // and for specific special frame types.
89 const uint8_t kQuicFrameTypeSpecialMask = 0xC0;  // 0b 11000000
90 const uint8_t kQuicFrameTypeStreamMask = 0x80;
91 const uint8_t kQuicFrameTypeAckMask = 0x40;
92 static_assert(kQuicFrameTypeSpecialMask ==
93                   (kQuicFrameTypeStreamMask | kQuicFrameTypeAckMask),
94               "Invalid kQuicFrameTypeSpecialMask");
95 
96 // The stream type format is 1FDOOOSS, where
97 //    F is the fin bit.
98 //    D is the data length bit (0 or 2 bytes).
99 //    OO/OOO are the size of the offset.
100 //    SS is the size of the stream ID.
101 // Note that the stream encoding can not be determined by inspection. It can
102 // be determined only by knowing the QUIC Version.
103 // Stream frame relative shifts and masks for interpreting the stream flags.
104 // StreamID may be 1, 2, 3, or 4 bytes.
105 const uint8_t kQuicStreamIdShift = 2;
106 const uint8_t kQuicStreamIDLengthMask = 0x03;
107 
108 // Offset may be 0, 2, 4, or 8 bytes.
109 const uint8_t kQuicStreamShift = 3;
110 const uint8_t kQuicStreamOffsetMask = 0x07;
111 
112 // Data length may be 0 or 2 bytes.
113 const uint8_t kQuicStreamDataLengthShift = 1;
114 const uint8_t kQuicStreamDataLengthMask = 0x01;
115 
116 // Fin bit may be set or not.
117 const uint8_t kQuicStreamFinShift = 1;
118 const uint8_t kQuicStreamFinMask = 0x01;
119 
120 // The format is 01M0LLOO, where
121 //   M if set, there are multiple ack blocks in the frame.
122 //  LL is the size of the largest ack field.
123 //  OO is the size of the ack blocks offset field.
124 // packet number size shift used in AckFrames.
125 const uint8_t kQuicSequenceNumberLengthNumBits = 2;
126 const uint8_t kActBlockLengthOffset = 0;
127 const uint8_t kLargestAckedOffset = 2;
128 
129 // Acks may have only one ack block.
130 const uint8_t kQuicHasMultipleAckBlocksOffset = 5;
131 
132 // Timestamps are 4 bytes followed by 2 bytes.
133 const uint8_t kQuicNumTimestampsLength = 1;
134 const uint8_t kQuicFirstTimestampLength = 4;
135 const uint8_t kQuicTimestampLength = 2;
136 // Gaps between packet numbers are 1 byte.
137 const uint8_t kQuicTimestampPacketNumberGapLength = 1;
138 
139 // Maximum length of encoded error strings.
140 const int kMaxErrorStringLength = 256;
141 
142 const uint8_t kConnectionIdLengthAdjustment = 3;
143 const uint8_t kDestinationConnectionIdLengthMask = 0xF0;
144 const uint8_t kSourceConnectionIdLengthMask = 0x0F;
145 
146 // Returns the absolute value of the difference between |a| and |b|.
Delta(uint64_t a,uint64_t b)147 uint64_t Delta(uint64_t a, uint64_t b) {
148   // Since these are unsigned numbers, we can't just return abs(a - b)
149   if (a < b) {
150     return b - a;
151   }
152   return a - b;
153 }
154 
ClosestTo(uint64_t target,uint64_t a,uint64_t b)155 uint64_t ClosestTo(uint64_t target, uint64_t a, uint64_t b) {
156   return (Delta(target, a) < Delta(target, b)) ? a : b;
157 }
158 
ReadAckPacketNumberLength(uint8_t flags)159 QuicPacketNumberLength ReadAckPacketNumberLength(uint8_t flags) {
160   switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
161     case PACKET_FLAGS_8BYTE_PACKET:
162       return PACKET_6BYTE_PACKET_NUMBER;
163     case PACKET_FLAGS_4BYTE_PACKET:
164       return PACKET_4BYTE_PACKET_NUMBER;
165     case PACKET_FLAGS_2BYTE_PACKET:
166       return PACKET_2BYTE_PACKET_NUMBER;
167     case PACKET_FLAGS_1BYTE_PACKET:
168       return PACKET_1BYTE_PACKET_NUMBER;
169     default:
170       QUIC_BUG(quic_bug_10850_2) << "Unreachable case statement.";
171       return PACKET_6BYTE_PACKET_NUMBER;
172   }
173 }
174 
PacketNumberLengthToOnWireValue(QuicPacketNumberLength packet_number_length)175 uint8_t PacketNumberLengthToOnWireValue(
176     QuicPacketNumberLength packet_number_length) {
177   return packet_number_length - 1;
178 }
179 
GetShortHeaderPacketNumberLength(uint8_t type)180 QuicPacketNumberLength GetShortHeaderPacketNumberLength(uint8_t type) {
181   QUICHE_DCHECK(!(type & FLAGS_LONG_HEADER));
182   return static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
183 }
184 
LongHeaderTypeToOnWireValue(QuicLongHeaderType type,const ParsedQuicVersion & version)185 uint8_t LongHeaderTypeToOnWireValue(QuicLongHeaderType type,
186                                     const ParsedQuicVersion& version) {
187   switch (type) {
188     case INITIAL:
189       return version.UsesV2PacketTypes() ? (1 << 4) : 0;
190     case ZERO_RTT_PROTECTED:
191       return version.UsesV2PacketTypes() ? (2 << 4) : (1 << 4);
192     case HANDSHAKE:
193       return version.UsesV2PacketTypes() ? (3 << 4) : (2 << 4);
194     case RETRY:
195       return version.UsesV2PacketTypes() ? 0 : (3 << 4);
196     case VERSION_NEGOTIATION:
197       return 0xF0;  // Value does not matter
198     default:
199       QUIC_BUG(quic_bug_10850_3) << "Invalid long header type: " << type;
200       return 0xFF;
201   }
202 }
203 
GetLongHeaderType(uint8_t type,const ParsedQuicVersion & version)204 QuicLongHeaderType GetLongHeaderType(uint8_t type,
205                                      const ParsedQuicVersion& version) {
206   QUICHE_DCHECK((type & FLAGS_LONG_HEADER));
207   switch ((type & 0x30) >> 4) {
208     case 0:
209       return version.UsesV2PacketTypes() ? RETRY : INITIAL;
210     case 1:
211       return version.UsesV2PacketTypes() ? INITIAL : ZERO_RTT_PROTECTED;
212     case 2:
213       return version.UsesV2PacketTypes() ? ZERO_RTT_PROTECTED : HANDSHAKE;
214     case 3:
215       return version.UsesV2PacketTypes() ? HANDSHAKE : RETRY;
216     default:
217       QUIC_BUG(quic_bug_10850_4) << "Unreachable statement";
218       return INVALID_PACKET_TYPE;
219   }
220 }
221 
GetLongHeaderPacketNumberLength(uint8_t type)222 QuicPacketNumberLength GetLongHeaderPacketNumberLength(uint8_t type) {
223   return static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
224 }
225 
226 // Used to get packet number space before packet gets decrypted.
GetPacketNumberSpace(const QuicPacketHeader & header)227 PacketNumberSpace GetPacketNumberSpace(const QuicPacketHeader& header) {
228   switch (header.form) {
229     case GOOGLE_QUIC_PACKET:
230       QUIC_BUG(quic_bug_10850_5)
231           << "Try to get packet number space of Google QUIC packet";
232       break;
233     case IETF_QUIC_SHORT_HEADER_PACKET:
234       return APPLICATION_DATA;
235     case IETF_QUIC_LONG_HEADER_PACKET:
236       switch (header.long_packet_type) {
237         case INITIAL:
238           return INITIAL_DATA;
239         case HANDSHAKE:
240           return HANDSHAKE_DATA;
241         case ZERO_RTT_PROTECTED:
242           return APPLICATION_DATA;
243         case VERSION_NEGOTIATION:
244         case RETRY:
245         case INVALID_PACKET_TYPE:
246           QUIC_BUG(quic_bug_10850_6)
247               << "Try to get packet number space of long header type: "
248               << QuicUtils::QuicLongHeaderTypetoString(header.long_packet_type);
249           break;
250       }
251   }
252 
253   return NUM_PACKET_NUMBER_SPACES;
254 }
255 
GetEncryptionLevel(const QuicPacketHeader & header)256 EncryptionLevel GetEncryptionLevel(const QuicPacketHeader& header) {
257   switch (header.form) {
258     case GOOGLE_QUIC_PACKET:
259       QUIC_BUG(quic_bug_10850_7)
260           << "Cannot determine EncryptionLevel from Google QUIC header";
261       break;
262     case IETF_QUIC_SHORT_HEADER_PACKET:
263       return ENCRYPTION_FORWARD_SECURE;
264     case IETF_QUIC_LONG_HEADER_PACKET:
265       switch (header.long_packet_type) {
266         case INITIAL:
267           return ENCRYPTION_INITIAL;
268         case HANDSHAKE:
269           return ENCRYPTION_HANDSHAKE;
270         case ZERO_RTT_PROTECTED:
271           return ENCRYPTION_ZERO_RTT;
272         case VERSION_NEGOTIATION:
273         case RETRY:
274         case INVALID_PACKET_TYPE:
275           QUIC_BUG(quic_bug_10850_8)
276               << "No encryption used with type "
277               << QuicUtils::QuicLongHeaderTypetoString(header.long_packet_type);
278       }
279   }
280   return NUM_ENCRYPTION_LEVELS;
281 }
282 
TruncateErrorString(absl::string_view error)283 absl::string_view TruncateErrorString(absl::string_view error) {
284   if (error.length() <= kMaxErrorStringLength) {
285     return error;
286   }
287   return absl::string_view(error.data(), kMaxErrorStringLength);
288 }
289 
TruncatedErrorStringSize(const absl::string_view & error)290 size_t TruncatedErrorStringSize(const absl::string_view& error) {
291   if (error.length() < kMaxErrorStringLength) {
292     return error.length();
293   }
294   return kMaxErrorStringLength;
295 }
296 
GetConnectionIdLengthValue(uint8_t length)297 uint8_t GetConnectionIdLengthValue(uint8_t length) {
298   if (length == 0) {
299     return 0;
300   }
301   return static_cast<uint8_t>(length - kConnectionIdLengthAdjustment);
302 }
303 
IsValidPacketNumberLength(QuicPacketNumberLength packet_number_length)304 bool IsValidPacketNumberLength(QuicPacketNumberLength packet_number_length) {
305   size_t length = packet_number_length;
306   return length == 1 || length == 2 || length == 4 || length == 6 ||
307          length == 8;
308 }
309 
IsValidFullPacketNumber(uint64_t full_packet_number,ParsedQuicVersion version)310 bool IsValidFullPacketNumber(uint64_t full_packet_number,
311                              ParsedQuicVersion version) {
312   return full_packet_number > 0 || version.HasIetfQuicFrames();
313 }
314 
AppendIetfConnectionIds(bool version_flag,bool use_length_prefix,QuicConnectionId destination_connection_id,QuicConnectionId source_connection_id,QuicDataWriter * writer)315 bool AppendIetfConnectionIds(bool version_flag, bool use_length_prefix,
316                              QuicConnectionId destination_connection_id,
317                              QuicConnectionId source_connection_id,
318                              QuicDataWriter* writer) {
319   if (!version_flag) {
320     return writer->WriteConnectionId(destination_connection_id);
321   }
322 
323   if (use_length_prefix) {
324     return writer->WriteLengthPrefixedConnectionId(destination_connection_id) &&
325            writer->WriteLengthPrefixedConnectionId(source_connection_id);
326   }
327 
328   // Compute connection ID length byte.
329   uint8_t dcil = GetConnectionIdLengthValue(destination_connection_id.length());
330   uint8_t scil = GetConnectionIdLengthValue(source_connection_id.length());
331   uint8_t connection_id_length = dcil << 4 | scil;
332 
333   return writer->WriteUInt8(connection_id_length) &&
334          writer->WriteConnectionId(destination_connection_id) &&
335          writer->WriteConnectionId(source_connection_id);
336 }
337 
338 enum class DroppedPacketReason {
339   // General errors
340   INVALID_PUBLIC_HEADER,
341   VERSION_MISMATCH,
342   // Version negotiation packet errors
343   INVALID_VERSION_NEGOTIATION_PACKET,
344   // Public reset packet errors, pre-v44
345   INVALID_PUBLIC_RESET_PACKET,
346   // Data packet errors
347   INVALID_PACKET_NUMBER,
348   INVALID_DIVERSIFICATION_NONCE,
349   DECRYPTION_FAILURE,
350   NUM_REASONS,
351 };
352 
RecordDroppedPacketReason(DroppedPacketReason reason)353 void RecordDroppedPacketReason(DroppedPacketReason reason) {
354   QUIC_CLIENT_HISTOGRAM_ENUM("QuicDroppedPacketReason", reason,
355                              DroppedPacketReason::NUM_REASONS,
356                              "The reason a packet was not processed. Recorded "
357                              "each time such a packet is dropped");
358 }
359 
GetIetfPacketHeaderFormat(uint8_t type_byte)360 PacketHeaderFormat GetIetfPacketHeaderFormat(uint8_t type_byte) {
361   return type_byte & FLAGS_LONG_HEADER ? IETF_QUIC_LONG_HEADER_PACKET
362                                        : IETF_QUIC_SHORT_HEADER_PACKET;
363 }
364 
GenerateErrorString(std::string initial_error_string,QuicErrorCode quic_error_code)365 std::string GenerateErrorString(std::string initial_error_string,
366                                 QuicErrorCode quic_error_code) {
367   if (quic_error_code == QUIC_IETF_GQUIC_ERROR_MISSING) {
368     // QUIC_IETF_GQUIC_ERROR_MISSING is special -- it means not to encode
369     // the error value in the string.
370     return initial_error_string;
371   }
372   return absl::StrCat(std::to_string(static_cast<unsigned>(quic_error_code)),
373                       ":", initial_error_string);
374 }
375 
376 // Return the minimum size of the ECN fields in an ACK frame
AckEcnCountSize(const QuicAckFrame & ack_frame)377 size_t AckEcnCountSize(const QuicAckFrame& ack_frame) {
378   if (!ack_frame.ecn_counters.has_value()) {
379     return 0;
380   }
381   return (QuicDataWriter::GetVarInt62Len(ack_frame.ecn_counters->ect0) +
382           QuicDataWriter::GetVarInt62Len(ack_frame.ecn_counters->ect1) +
383           QuicDataWriter::GetVarInt62Len(ack_frame.ecn_counters->ce));
384 }
385 
386 }  // namespace
387 
QuicFramer(const ParsedQuicVersionVector & supported_versions,QuicTime creation_time,Perspective perspective,uint8_t expected_server_connection_id_length)388 QuicFramer::QuicFramer(const ParsedQuicVersionVector& supported_versions,
389                        QuicTime creation_time, Perspective perspective,
390                        uint8_t expected_server_connection_id_length)
391     : visitor_(nullptr),
392       error_(QUIC_NO_ERROR),
393       last_serialized_server_connection_id_(EmptyQuicConnectionId()),
394       version_(ParsedQuicVersion::Unsupported()),
395       supported_versions_(supported_versions),
396       decrypter_level_(ENCRYPTION_INITIAL),
397       alternative_decrypter_level_(NUM_ENCRYPTION_LEVELS),
398       alternative_decrypter_latch_(false),
399       perspective_(perspective),
400       validate_flags_(true),
401       process_timestamps_(false),
402       max_receive_timestamps_per_ack_(std::numeric_limits<uint32_t>::max()),
403       receive_timestamps_exponent_(0),
404       creation_time_(creation_time),
405       last_timestamp_(QuicTime::Delta::Zero()),
406       support_key_update_for_connection_(false),
407       current_key_phase_bit_(false),
408       potential_peer_key_update_attempt_count_(0),
409       first_sending_packet_number_(FirstSendingPacketNumber()),
410       data_producer_(nullptr),
411       expected_server_connection_id_length_(
412           expected_server_connection_id_length),
413       expected_client_connection_id_length_(0),
414       supports_multiple_packet_number_spaces_(false),
415       last_written_packet_number_length_(0),
416       peer_ack_delay_exponent_(kDefaultAckDelayExponent),
417       local_ack_delay_exponent_(kDefaultAckDelayExponent),
418       current_received_frame_type_(0),
419       previously_received_frame_type_(0) {
420   QUICHE_DCHECK(!supported_versions.empty());
421   version_ = supported_versions_[0];
422   QUICHE_DCHECK(version_.IsKnown())
423       << ParsedQuicVersionVectorToString(supported_versions_);
424 }
425 
~QuicFramer()426 QuicFramer::~QuicFramer() {}
427 
428 // static
GetMinStreamFrameSize(QuicTransportVersion version,QuicStreamId stream_id,QuicStreamOffset offset,bool last_frame_in_packet,size_t data_length)429 size_t QuicFramer::GetMinStreamFrameSize(QuicTransportVersion version,
430                                          QuicStreamId stream_id,
431                                          QuicStreamOffset offset,
432                                          bool last_frame_in_packet,
433                                          size_t data_length) {
434   if (VersionHasIetfQuicFrames(version)) {
435     return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(stream_id) +
436            (last_frame_in_packet
437                 ? 0
438                 : QuicDataWriter::GetVarInt62Len(data_length)) +
439            (offset != 0 ? QuicDataWriter::GetVarInt62Len(offset) : 0);
440   }
441   return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
442          GetStreamOffsetSize(offset) +
443          (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize);
444 }
445 
446 // static
GetMinCryptoFrameSize(QuicStreamOffset offset,QuicPacketLength data_length)447 size_t QuicFramer::GetMinCryptoFrameSize(QuicStreamOffset offset,
448                                          QuicPacketLength data_length) {
449   return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(offset) +
450          QuicDataWriter::GetVarInt62Len(data_length);
451 }
452 
453 // static
GetMessageFrameSize(bool last_frame_in_packet,QuicByteCount length)454 size_t QuicFramer::GetMessageFrameSize(bool last_frame_in_packet,
455                                        QuicByteCount length) {
456   return kQuicFrameTypeSize +
457          (last_frame_in_packet ? 0 : QuicDataWriter::GetVarInt62Len(length)) +
458          length;
459 }
460 
461 // static
GetMinAckFrameSize(QuicTransportVersion version,const QuicAckFrame & ack_frame,uint32_t local_ack_delay_exponent,bool use_ietf_ack_with_receive_timestamp)462 size_t QuicFramer::GetMinAckFrameSize(
463     QuicTransportVersion version, const QuicAckFrame& ack_frame,
464     uint32_t local_ack_delay_exponent,
465     bool use_ietf_ack_with_receive_timestamp) {
466   if (VersionHasIetfQuicFrames(version)) {
467     // The minimal ack frame consists of the following fields: Largest
468     // Acknowledged, ACK Delay, 0 ACK Block Count, First ACK Block and either 0
469     // Timestamp Range Count or ECN counts.
470     // Type byte + largest acked.
471     size_t min_size =
472         kQuicFrameTypeSize +
473         QuicDataWriter::GetVarInt62Len(LargestAcked(ack_frame).ToUint64());
474     // Ack delay.
475     min_size += QuicDataWriter::GetVarInt62Len(
476         ack_frame.ack_delay_time.ToMicroseconds() >> local_ack_delay_exponent);
477     // 0 ack block count.
478     min_size += QuicDataWriter::GetVarInt62Len(0);
479     // First ack block.
480     min_size += QuicDataWriter::GetVarInt62Len(
481         ack_frame.packets.Empty() ? 0
482                                   : ack_frame.packets.rbegin()->Length() - 1);
483 
484     if (use_ietf_ack_with_receive_timestamp) {
485       // 0 Timestamp Range Count.
486       min_size += QuicDataWriter::GetVarInt62Len(0);
487     } else {
488       min_size += AckEcnCountSize(ack_frame);
489     }
490     return min_size;
491   }
492   return kQuicFrameTypeSize +
493          GetMinPacketNumberLength(LargestAcked(ack_frame)) +
494          kQuicDeltaTimeLargestObservedSize + kQuicNumTimestampsSize;
495 }
496 
497 // static
GetStopWaitingFrameSize(QuicPacketNumberLength packet_number_length)498 size_t QuicFramer::GetStopWaitingFrameSize(
499     QuicPacketNumberLength packet_number_length) {
500   size_t min_size = kQuicFrameTypeSize + packet_number_length;
501   return min_size;
502 }
503 
504 // static
GetRstStreamFrameSize(QuicTransportVersion version,const QuicRstStreamFrame & frame)505 size_t QuicFramer::GetRstStreamFrameSize(QuicTransportVersion version,
506                                          const QuicRstStreamFrame& frame) {
507   if (VersionHasIetfQuicFrames(version)) {
508     return QuicDataWriter::GetVarInt62Len(frame.stream_id) +
509            QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
510            kQuicFrameTypeSize +
511            QuicDataWriter::GetVarInt62Len(frame.ietf_error_code);
512   }
513   return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize +
514          kQuicErrorCodeSize;
515 }
516 
517 // static
GetConnectionCloseFrameSize(QuicTransportVersion version,const QuicConnectionCloseFrame & frame)518 size_t QuicFramer::GetConnectionCloseFrameSize(
519     QuicTransportVersion version, const QuicConnectionCloseFrame& frame) {
520   if (!VersionHasIetfQuicFrames(version)) {
521     // Not IETF QUIC, return Google QUIC CONNECTION CLOSE frame size.
522     return kQuicFrameTypeSize + kQuicErrorCodeSize +
523            kQuicErrorDetailsLengthSize +
524            TruncatedErrorStringSize(frame.error_details);
525   }
526 
527   // Prepend the extra error information to the string and get the result's
528   // length.
529   const size_t truncated_error_string_size = TruncatedErrorStringSize(
530       GenerateErrorString(frame.error_details, frame.quic_error_code));
531 
532   const size_t frame_size =
533       truncated_error_string_size +
534       QuicDataWriter::GetVarInt62Len(truncated_error_string_size) +
535       kQuicFrameTypeSize +
536       QuicDataWriter::GetVarInt62Len(frame.wire_error_code);
537   if (frame.close_type == IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
538     return frame_size;
539   }
540   // The Transport close frame has the transport_close_frame_type, so include
541   // its length.
542   return frame_size +
543          QuicDataWriter::GetVarInt62Len(frame.transport_close_frame_type);
544 }
545 
546 // static
GetMinGoAwayFrameSize()547 size_t QuicFramer::GetMinGoAwayFrameSize() {
548   return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
549          kQuicMaxStreamIdSize;
550 }
551 
552 // static
GetWindowUpdateFrameSize(QuicTransportVersion version,const QuicWindowUpdateFrame & frame)553 size_t QuicFramer::GetWindowUpdateFrameSize(
554     QuicTransportVersion version, const QuicWindowUpdateFrame& frame) {
555   if (!VersionHasIetfQuicFrames(version)) {
556     return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
557   }
558   if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
559     // Frame would be a MAX DATA frame, which has only a Maximum Data field.
560     return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.max_data);
561   }
562   // Frame would be MAX STREAM DATA, has Maximum Stream Data and Stream ID
563   // fields.
564   return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.max_data) +
565          QuicDataWriter::GetVarInt62Len(frame.stream_id);
566 }
567 
568 // static
GetMaxStreamsFrameSize(QuicTransportVersion version,const QuicMaxStreamsFrame & frame)569 size_t QuicFramer::GetMaxStreamsFrameSize(QuicTransportVersion version,
570                                           const QuicMaxStreamsFrame& frame) {
571   if (!VersionHasIetfQuicFrames(version)) {
572     QUIC_BUG(quic_bug_10850_9)
573         << "In version " << version
574         << ", which does not support IETF Frames, and tried to serialize "
575            "MaxStreams Frame.";
576   }
577   return kQuicFrameTypeSize +
578          QuicDataWriter::GetVarInt62Len(frame.stream_count);
579 }
580 
581 // static
GetStreamsBlockedFrameSize(QuicTransportVersion version,const QuicStreamsBlockedFrame & frame)582 size_t QuicFramer::GetStreamsBlockedFrameSize(
583     QuicTransportVersion version, const QuicStreamsBlockedFrame& frame) {
584   if (!VersionHasIetfQuicFrames(version)) {
585     QUIC_BUG(quic_bug_10850_10)
586         << "In version " << version
587         << ", which does not support IETF frames, and tried to serialize "
588            "StreamsBlocked Frame.";
589   }
590 
591   return kQuicFrameTypeSize +
592          QuicDataWriter::GetVarInt62Len(frame.stream_count);
593 }
594 
595 // static
GetBlockedFrameSize(QuicTransportVersion version,const QuicBlockedFrame & frame)596 size_t QuicFramer::GetBlockedFrameSize(QuicTransportVersion version,
597                                        const QuicBlockedFrame& frame) {
598   if (!VersionHasIetfQuicFrames(version)) {
599     return kQuicFrameTypeSize + kQuicMaxStreamIdSize;
600   }
601   if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
602     // return size of IETF QUIC Blocked frame
603     return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset);
604   }
605   // return size of IETF QUIC Stream Blocked frame.
606   return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset) +
607          QuicDataWriter::GetVarInt62Len(frame.stream_id);
608 }
609 
610 // static
GetStopSendingFrameSize(const QuicStopSendingFrame & frame)611 size_t QuicFramer::GetStopSendingFrameSize(const QuicStopSendingFrame& frame) {
612   return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.stream_id) +
613          QuicDataWriter::GetVarInt62Len(frame.ietf_error_code);
614 }
615 
616 // static
GetAckFrequencyFrameSize(const QuicAckFrequencyFrame & frame)617 size_t QuicFramer::GetAckFrequencyFrameSize(
618     const QuicAckFrequencyFrame& frame) {
619   return QuicDataWriter::GetVarInt62Len(IETF_ACK_FREQUENCY) +
620          QuicDataWriter::GetVarInt62Len(frame.sequence_number) +
621          QuicDataWriter::GetVarInt62Len(frame.packet_tolerance) +
622          QuicDataWriter::GetVarInt62Len(frame.max_ack_delay.ToMicroseconds()) +
623          // One byte for encoding boolean
624          1;
625 }
626 
627 // static
GetPathChallengeFrameSize(const QuicPathChallengeFrame & frame)628 size_t QuicFramer::GetPathChallengeFrameSize(
629     const QuicPathChallengeFrame& frame) {
630   return kQuicFrameTypeSize + sizeof(frame.data_buffer);
631 }
632 
633 // static
GetPathResponseFrameSize(const QuicPathResponseFrame & frame)634 size_t QuicFramer::GetPathResponseFrameSize(
635     const QuicPathResponseFrame& frame) {
636   return kQuicFrameTypeSize + sizeof(frame.data_buffer);
637 }
638 
639 // static
GetRetransmittableControlFrameSize(QuicTransportVersion version,const QuicFrame & frame)640 size_t QuicFramer::GetRetransmittableControlFrameSize(
641     QuicTransportVersion version, const QuicFrame& frame) {
642   switch (frame.type) {
643     case PING_FRAME:
644       // Ping has no payload.
645       return kQuicFrameTypeSize;
646     case RST_STREAM_FRAME:
647       return GetRstStreamFrameSize(version, *frame.rst_stream_frame);
648     case CONNECTION_CLOSE_FRAME:
649       return GetConnectionCloseFrameSize(version,
650                                          *frame.connection_close_frame);
651     case GOAWAY_FRAME:
652       return GetMinGoAwayFrameSize() +
653              TruncatedErrorStringSize(frame.goaway_frame->reason_phrase);
654     case WINDOW_UPDATE_FRAME:
655       // For IETF QUIC, this could be either a MAX DATA or MAX STREAM DATA.
656       // GetWindowUpdateFrameSize figures this out and returns the correct
657       // length.
658       return GetWindowUpdateFrameSize(version, frame.window_update_frame);
659     case BLOCKED_FRAME:
660       return GetBlockedFrameSize(version, frame.blocked_frame);
661     case NEW_CONNECTION_ID_FRAME:
662       return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
663     case RETIRE_CONNECTION_ID_FRAME:
664       return GetRetireConnectionIdFrameSize(*frame.retire_connection_id_frame);
665     case NEW_TOKEN_FRAME:
666       return GetNewTokenFrameSize(*frame.new_token_frame);
667     case MAX_STREAMS_FRAME:
668       return GetMaxStreamsFrameSize(version, frame.max_streams_frame);
669     case STREAMS_BLOCKED_FRAME:
670       return GetStreamsBlockedFrameSize(version, frame.streams_blocked_frame);
671     case PATH_RESPONSE_FRAME:
672       return GetPathResponseFrameSize(frame.path_response_frame);
673     case PATH_CHALLENGE_FRAME:
674       return GetPathChallengeFrameSize(frame.path_challenge_frame);
675     case STOP_SENDING_FRAME:
676       return GetStopSendingFrameSize(frame.stop_sending_frame);
677     case HANDSHAKE_DONE_FRAME:
678       // HANDSHAKE_DONE has no payload.
679       return kQuicFrameTypeSize;
680     case ACK_FREQUENCY_FRAME:
681       return GetAckFrequencyFrameSize(*frame.ack_frequency_frame);
682     case STREAM_FRAME:
683     case ACK_FRAME:
684     case STOP_WAITING_FRAME:
685     case MTU_DISCOVERY_FRAME:
686     case PADDING_FRAME:
687     case MESSAGE_FRAME:
688     case CRYPTO_FRAME:
689     case NUM_FRAME_TYPES:
690       QUICHE_DCHECK(false);
691       return 0;
692   }
693 
694   // Not reachable, but some Chrome compilers can't figure that out.  *sigh*
695   QUICHE_DCHECK(false);
696   return 0;
697 }
698 
699 // static
GetStreamIdSize(QuicStreamId stream_id)700 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
701   // Sizes are 1 through 4 bytes.
702   for (int i = 1; i <= 4; ++i) {
703     stream_id >>= 8;
704     if (stream_id == 0) {
705       return i;
706     }
707   }
708   QUIC_BUG(quic_bug_10850_11) << "Failed to determine StreamIDSize.";
709   return 4;
710 }
711 
712 // static
GetStreamOffsetSize(QuicStreamOffset offset)713 size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) {
714   // 0 is a special case.
715   if (offset == 0) {
716     return 0;
717   }
718   // 2 through 8 are the remaining sizes.
719   offset >>= 8;
720   for (int i = 2; i <= 8; ++i) {
721     offset >>= 8;
722     if (offset == 0) {
723       return i;
724     }
725   }
726   QUIC_BUG(quic_bug_10850_12) << "Failed to determine StreamOffsetSize.";
727   return 8;
728 }
729 
730 // static
GetNewConnectionIdFrameSize(const QuicNewConnectionIdFrame & frame)731 size_t QuicFramer::GetNewConnectionIdFrameSize(
732     const QuicNewConnectionIdFrame& frame) {
733   return kQuicFrameTypeSize +
734          QuicDataWriter::GetVarInt62Len(frame.sequence_number) +
735          QuicDataWriter::GetVarInt62Len(frame.retire_prior_to) +
736          kConnectionIdLengthSize + frame.connection_id.length() +
737          sizeof(frame.stateless_reset_token);
738 }
739 
740 // static
GetRetireConnectionIdFrameSize(const QuicRetireConnectionIdFrame & frame)741 size_t QuicFramer::GetRetireConnectionIdFrameSize(
742     const QuicRetireConnectionIdFrame& frame) {
743   return kQuicFrameTypeSize +
744          QuicDataWriter::GetVarInt62Len(frame.sequence_number);
745 }
746 
747 // static
GetNewTokenFrameSize(const QuicNewTokenFrame & frame)748 size_t QuicFramer::GetNewTokenFrameSize(const QuicNewTokenFrame& frame) {
749   return kQuicFrameTypeSize +
750          QuicDataWriter::GetVarInt62Len(frame.token.length()) +
751          frame.token.length();
752 }
753 
IsSupportedVersion(const ParsedQuicVersion version) const754 bool QuicFramer::IsSupportedVersion(const ParsedQuicVersion version) const {
755   for (const ParsedQuicVersion& supported_version : supported_versions_) {
756     if (version == supported_version) {
757       return true;
758     }
759   }
760   return false;
761 }
762 
GetSerializedFrameLength(const QuicFrame & frame,size_t free_bytes,bool first_frame,bool last_frame,QuicPacketNumberLength packet_number_length)763 size_t QuicFramer::GetSerializedFrameLength(
764     const QuicFrame& frame, size_t free_bytes, bool first_frame,
765     bool last_frame, QuicPacketNumberLength packet_number_length) {
766   // Prevent a rare crash reported in b/19458523.
767   if (frame.type == ACK_FRAME && frame.ack_frame == nullptr) {
768     QUIC_BUG(quic_bug_10850_13)
769         << "Cannot compute the length of a null ack frame. free_bytes:"
770         << free_bytes << " first_frame:" << first_frame
771         << " last_frame:" << last_frame
772         << " seq num length:" << packet_number_length;
773     set_error(QUIC_INTERNAL_ERROR);
774     visitor_->OnError(this);
775     return 0;
776   }
777   if (frame.type == PADDING_FRAME) {
778     if (frame.padding_frame.num_padding_bytes == -1) {
779       // Full padding to the end of the packet.
780       return free_bytes;
781     } else {
782       // Lite padding.
783       return free_bytes <
784                      static_cast<size_t>(frame.padding_frame.num_padding_bytes)
785                  ? free_bytes
786                  : frame.padding_frame.num_padding_bytes;
787     }
788   }
789 
790   size_t frame_len =
791       ComputeFrameLength(frame, last_frame, packet_number_length);
792   if (frame_len <= free_bytes) {
793     // Frame fits within packet. Note that acks may be truncated.
794     return frame_len;
795   }
796   // Only truncate the first frame in a packet, so if subsequent ones go
797   // over, stop including more frames.
798   if (!first_frame) {
799     return 0;
800   }
801   bool can_truncate =
802       frame.type == ACK_FRAME &&
803       free_bytes >=
804           GetMinAckFrameSize(version_.transport_version, *frame.ack_frame,
805                              local_ack_delay_exponent_,
806                              UseIetfAckWithReceiveTimestamp(*frame.ack_frame));
807   if (can_truncate) {
808     // Truncate the frame so the packet will not exceed kMaxOutgoingPacketSize.
809     // Note that we may not use every byte of the writer in this case.
810     QUIC_DLOG(INFO) << ENDPOINT
811                     << "Truncating large frame, free bytes: " << free_bytes;
812     return free_bytes;
813   }
814   return 0;
815 }
816 
AckFrameInfo()817 QuicFramer::AckFrameInfo::AckFrameInfo()
818     : max_block_length(0), first_block_length(0), num_ack_blocks(0) {}
819 
820 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default;
821 
~AckFrameInfo()822 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
823 
WriteIetfLongHeaderLength(const QuicPacketHeader & header,QuicDataWriter * writer,size_t length_field_offset,EncryptionLevel level)824 bool QuicFramer::WriteIetfLongHeaderLength(const QuicPacketHeader& header,
825                                            QuicDataWriter* writer,
826                                            size_t length_field_offset,
827                                            EncryptionLevel level) {
828   if (!QuicVersionHasLongHeaderLengths(transport_version()) ||
829       !header.version_flag || length_field_offset == 0) {
830     return true;
831   }
832   if (writer->length() < length_field_offset ||
833       writer->length() - length_field_offset <
834           quiche::kQuicheDefaultLongHeaderLengthLength) {
835     set_detailed_error("Invalid length_field_offset.");
836     QUIC_BUG(quic_bug_10850_14) << "Invalid length_field_offset.";
837     return false;
838   }
839   size_t length_to_write = writer->length() - length_field_offset -
840                            quiche::kQuicheDefaultLongHeaderLengthLength;
841   // Add length of auth tag.
842   length_to_write = GetCiphertextSize(level, length_to_write);
843 
844   QuicDataWriter length_writer(writer->length() - length_field_offset,
845                                writer->data() + length_field_offset);
846   if (!length_writer.WriteVarInt62WithForcedLength(
847           length_to_write, quiche::kQuicheDefaultLongHeaderLengthLength)) {
848     set_detailed_error("Failed to overwrite long header length.");
849     QUIC_BUG(quic_bug_10850_15) << "Failed to overwrite long header length.";
850     return false;
851   }
852   return true;
853 }
854 
BuildDataPacket(const QuicPacketHeader & header,const QuicFrames & frames,char * buffer,size_t packet_length,EncryptionLevel level)855 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
856                                    const QuicFrames& frames, char* buffer,
857                                    size_t packet_length,
858                                    EncryptionLevel level) {
859   QUIC_BUG_IF(quic_bug_12975_2, header.version_flag &&
860                                     header.long_packet_type == RETRY &&
861                                     !frames.empty())
862       << "IETF RETRY packets cannot contain frames " << header;
863   QuicDataWriter writer(packet_length, buffer);
864   size_t length_field_offset = 0;
865   if (!AppendIetfPacketHeader(header, &writer, &length_field_offset)) {
866     QUIC_BUG(quic_bug_10850_16) << "AppendPacketHeader failed";
867     return 0;
868   }
869 
870   if (VersionHasIetfQuicFrames(transport_version())) {
871     if (AppendIetfFrames(frames, &writer) == 0) {
872       return 0;
873     }
874     if (!WriteIetfLongHeaderLength(header, &writer, length_field_offset,
875                                    level)) {
876       return 0;
877     }
878     return writer.length();
879   }
880 
881   size_t i = 0;
882   for (const QuicFrame& frame : frames) {
883     // Determine if we should write stream frame length in header.
884     const bool last_frame_in_packet = i == frames.size() - 1;
885     if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) {
886       QUIC_BUG(quic_bug_10850_17) << "AppendTypeByte failed";
887       return 0;
888     }
889 
890     switch (frame.type) {
891       case PADDING_FRAME:
892         if (!AppendPaddingFrame(frame.padding_frame, &writer)) {
893           QUIC_BUG(quic_bug_10850_18)
894               << "AppendPaddingFrame of "
895               << frame.padding_frame.num_padding_bytes << " failed";
896           return 0;
897         }
898         break;
899       case STREAM_FRAME:
900         if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
901                                &writer)) {
902           QUIC_BUG(quic_bug_10850_19) << "AppendStreamFrame failed";
903           return 0;
904         }
905         break;
906       case ACK_FRAME:
907         if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) {
908           QUIC_BUG(quic_bug_10850_20)
909               << "AppendAckFrameAndTypeByte failed: " << detailed_error_;
910           return 0;
911         }
912         break;
913       case MTU_DISCOVERY_FRAME:
914         // MTU discovery frames are serialized as ping frames.
915         ABSL_FALLTHROUGH_INTENDED;
916       case PING_FRAME:
917         // Ping has no payload.
918         break;
919       case RST_STREAM_FRAME:
920         if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
921           QUIC_BUG(quic_bug_10850_22) << "AppendRstStreamFrame failed";
922           return 0;
923         }
924         break;
925       case CONNECTION_CLOSE_FRAME:
926         if (!AppendConnectionCloseFrame(*frame.connection_close_frame,
927                                         &writer)) {
928           QUIC_BUG(quic_bug_10850_23) << "AppendConnectionCloseFrame failed";
929           return 0;
930         }
931         break;
932       case GOAWAY_FRAME:
933         if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
934           QUIC_BUG(quic_bug_10850_24) << "AppendGoAwayFrame failed";
935           return 0;
936         }
937         break;
938       case WINDOW_UPDATE_FRAME:
939         if (!AppendWindowUpdateFrame(frame.window_update_frame, &writer)) {
940           QUIC_BUG(quic_bug_10850_25) << "AppendWindowUpdateFrame failed";
941           return 0;
942         }
943         break;
944       case BLOCKED_FRAME:
945         if (!AppendBlockedFrame(frame.blocked_frame, &writer)) {
946           QUIC_BUG(quic_bug_10850_26) << "AppendBlockedFrame failed";
947           return 0;
948         }
949         break;
950       case NEW_CONNECTION_ID_FRAME:
951         set_detailed_error(
952             "Attempt to append NEW_CONNECTION_ID frame and not in IETF QUIC.");
953         return RaiseError(QUIC_INTERNAL_ERROR);
954       case RETIRE_CONNECTION_ID_FRAME:
955         set_detailed_error(
956             "Attempt to append RETIRE_CONNECTION_ID frame and not in IETF "
957             "QUIC.");
958         return RaiseError(QUIC_INTERNAL_ERROR);
959       case NEW_TOKEN_FRAME:
960         set_detailed_error(
961             "Attempt to append NEW_TOKEN_ID frame and not in IETF QUIC.");
962         return RaiseError(QUIC_INTERNAL_ERROR);
963       case MAX_STREAMS_FRAME:
964         set_detailed_error(
965             "Attempt to append MAX_STREAMS frame and not in IETF QUIC.");
966         return RaiseError(QUIC_INTERNAL_ERROR);
967       case STREAMS_BLOCKED_FRAME:
968         set_detailed_error(
969             "Attempt to append STREAMS_BLOCKED frame and not in IETF QUIC.");
970         return RaiseError(QUIC_INTERNAL_ERROR);
971       case PATH_RESPONSE_FRAME:
972         set_detailed_error(
973             "Attempt to append PATH_RESPONSE frame and not in IETF QUIC.");
974         return RaiseError(QUIC_INTERNAL_ERROR);
975       case PATH_CHALLENGE_FRAME:
976         set_detailed_error(
977             "Attempt to append PATH_CHALLENGE frame and not in IETF QUIC.");
978         return RaiseError(QUIC_INTERNAL_ERROR);
979       case STOP_SENDING_FRAME:
980         set_detailed_error(
981             "Attempt to append STOP_SENDING frame and not in IETF QUIC.");
982         return RaiseError(QUIC_INTERNAL_ERROR);
983       case MESSAGE_FRAME:
984         if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
985                                            last_frame_in_packet, &writer)) {
986           QUIC_BUG(quic_bug_10850_27) << "AppendMessageFrame failed";
987           return 0;
988         }
989         break;
990       case CRYPTO_FRAME:
991         if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
992           set_detailed_error(
993               "Attempt to append CRYPTO frame in version prior to 47.");
994           return RaiseError(QUIC_INTERNAL_ERROR);
995         }
996         if (!AppendCryptoFrame(*frame.crypto_frame, &writer)) {
997           QUIC_BUG(quic_bug_10850_28) << "AppendCryptoFrame failed";
998           return 0;
999         }
1000         break;
1001       case HANDSHAKE_DONE_FRAME:
1002         // HANDSHAKE_DONE has no payload.
1003         break;
1004       default:
1005         RaiseError(QUIC_INVALID_FRAME_DATA);
1006         QUIC_BUG(quic_bug_10850_29) << "QUIC_INVALID_FRAME_DATA";
1007         return 0;
1008     }
1009     ++i;
1010   }
1011 
1012   if (!WriteIetfLongHeaderLength(header, &writer, length_field_offset, level)) {
1013     return 0;
1014   }
1015 
1016   return writer.length();
1017 }
1018 
AppendIetfFrames(const QuicFrames & frames,QuicDataWriter * writer)1019 size_t QuicFramer::AppendIetfFrames(const QuicFrames& frames,
1020                                     QuicDataWriter* writer) {
1021   size_t i = 0;
1022   for (const QuicFrame& frame : frames) {
1023     // Determine if we should write stream frame length in header.
1024     const bool last_frame_in_packet = i == frames.size() - 1;
1025     if (!AppendIetfFrameType(frame, last_frame_in_packet, writer)) {
1026       QUIC_BUG(quic_bug_10850_30)
1027           << "AppendIetfFrameType failed: " << detailed_error();
1028       return 0;
1029     }
1030 
1031     switch (frame.type) {
1032       case PADDING_FRAME:
1033         if (!AppendPaddingFrame(frame.padding_frame, writer)) {
1034           QUIC_BUG(quic_bug_10850_31) << "AppendPaddingFrame of "
1035                                       << frame.padding_frame.num_padding_bytes
1036                                       << " failed: " << detailed_error();
1037           return 0;
1038         }
1039         break;
1040       case STREAM_FRAME:
1041         if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
1042                                writer)) {
1043           QUIC_BUG(quic_bug_10850_32)
1044               << "AppendStreamFrame " << frame.stream_frame
1045               << " failed: " << detailed_error();
1046           return 0;
1047         }
1048         break;
1049       case ACK_FRAME:
1050         if (!AppendIetfAckFrameAndTypeByte(*frame.ack_frame, writer)) {
1051           QUIC_BUG(quic_bug_10850_33)
1052               << "AppendIetfAckFrameAndTypeByte failed: " << detailed_error();
1053           return 0;
1054         }
1055         break;
1056       case STOP_WAITING_FRAME:
1057         set_detailed_error(
1058             "Attempt to append STOP WAITING frame in IETF QUIC.");
1059         RaiseError(QUIC_INTERNAL_ERROR);
1060         QUIC_BUG(quic_bug_10850_34) << detailed_error();
1061         return 0;
1062       case MTU_DISCOVERY_FRAME:
1063         // MTU discovery frames are serialized as ping frames.
1064         ABSL_FALLTHROUGH_INTENDED;
1065       case PING_FRAME:
1066         // Ping has no payload.
1067         break;
1068       case RST_STREAM_FRAME:
1069         if (!AppendRstStreamFrame(*frame.rst_stream_frame, writer)) {
1070           QUIC_BUG(quic_bug_10850_35)
1071               << "AppendRstStreamFrame failed: " << detailed_error();
1072           return 0;
1073         }
1074         break;
1075       case CONNECTION_CLOSE_FRAME:
1076         if (!AppendIetfConnectionCloseFrame(*frame.connection_close_frame,
1077                                             writer)) {
1078           QUIC_BUG(quic_bug_10850_36)
1079               << "AppendIetfConnectionCloseFrame failed: " << detailed_error();
1080           return 0;
1081         }
1082         break;
1083       case GOAWAY_FRAME:
1084         set_detailed_error("Attempt to append GOAWAY frame in IETF QUIC.");
1085         RaiseError(QUIC_INTERNAL_ERROR);
1086         QUIC_BUG(quic_bug_10850_37) << detailed_error();
1087         return 0;
1088       case WINDOW_UPDATE_FRAME:
1089         // Depending on whether there is a stream ID or not, will be either a
1090         // MAX STREAM DATA frame or a MAX DATA frame.
1091         if (frame.window_update_frame.stream_id ==
1092             QuicUtils::GetInvalidStreamId(transport_version())) {
1093           if (!AppendMaxDataFrame(frame.window_update_frame, writer)) {
1094             QUIC_BUG(quic_bug_10850_38)
1095                 << "AppendMaxDataFrame failed: " << detailed_error();
1096             return 0;
1097           }
1098         } else {
1099           if (!AppendMaxStreamDataFrame(frame.window_update_frame, writer)) {
1100             QUIC_BUG(quic_bug_10850_39)
1101                 << "AppendMaxStreamDataFrame failed: " << detailed_error();
1102             return 0;
1103           }
1104         }
1105         break;
1106       case BLOCKED_FRAME:
1107         if (!AppendBlockedFrame(frame.blocked_frame, writer)) {
1108           QUIC_BUG(quic_bug_10850_40)
1109               << "AppendBlockedFrame failed: " << detailed_error();
1110           return 0;
1111         }
1112         break;
1113       case MAX_STREAMS_FRAME:
1114         if (!AppendMaxStreamsFrame(frame.max_streams_frame, writer)) {
1115           QUIC_BUG(quic_bug_10850_41)
1116               << "AppendMaxStreamsFrame failed: " << detailed_error();
1117           return 0;
1118         }
1119         break;
1120       case STREAMS_BLOCKED_FRAME:
1121         if (!AppendStreamsBlockedFrame(frame.streams_blocked_frame, writer)) {
1122           QUIC_BUG(quic_bug_10850_42)
1123               << "AppendStreamsBlockedFrame failed: " << detailed_error();
1124           return 0;
1125         }
1126         break;
1127       case NEW_CONNECTION_ID_FRAME:
1128         if (!AppendNewConnectionIdFrame(*frame.new_connection_id_frame,
1129                                         writer)) {
1130           QUIC_BUG(quic_bug_10850_43)
1131               << "AppendNewConnectionIdFrame failed: " << detailed_error();
1132           return 0;
1133         }
1134         break;
1135       case RETIRE_CONNECTION_ID_FRAME:
1136         if (!AppendRetireConnectionIdFrame(*frame.retire_connection_id_frame,
1137                                            writer)) {
1138           QUIC_BUG(quic_bug_10850_44)
1139               << "AppendRetireConnectionIdFrame failed: " << detailed_error();
1140           return 0;
1141         }
1142         break;
1143       case NEW_TOKEN_FRAME:
1144         if (!AppendNewTokenFrame(*frame.new_token_frame, writer)) {
1145           QUIC_BUG(quic_bug_10850_45)
1146               << "AppendNewTokenFrame failed: " << detailed_error();
1147           return 0;
1148         }
1149         break;
1150       case STOP_SENDING_FRAME:
1151         if (!AppendStopSendingFrame(frame.stop_sending_frame, writer)) {
1152           QUIC_BUG(quic_bug_10850_46)
1153               << "AppendStopSendingFrame failed: " << detailed_error();
1154           return 0;
1155         }
1156         break;
1157       case PATH_CHALLENGE_FRAME:
1158         if (!AppendPathChallengeFrame(frame.path_challenge_frame, writer)) {
1159           QUIC_BUG(quic_bug_10850_47)
1160               << "AppendPathChallengeFrame failed: " << detailed_error();
1161           return 0;
1162         }
1163         break;
1164       case PATH_RESPONSE_FRAME:
1165         if (!AppendPathResponseFrame(frame.path_response_frame, writer)) {
1166           QUIC_BUG(quic_bug_10850_48)
1167               << "AppendPathResponseFrame failed: " << detailed_error();
1168           return 0;
1169         }
1170         break;
1171       case MESSAGE_FRAME:
1172         if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1173                                            last_frame_in_packet, writer)) {
1174           QUIC_BUG(quic_bug_10850_49)
1175               << "AppendMessageFrame failed: " << detailed_error();
1176           return 0;
1177         }
1178         break;
1179       case CRYPTO_FRAME:
1180         if (!AppendCryptoFrame(*frame.crypto_frame, writer)) {
1181           QUIC_BUG(quic_bug_10850_50)
1182               << "AppendCryptoFrame failed: " << detailed_error();
1183           return 0;
1184         }
1185         break;
1186       case HANDSHAKE_DONE_FRAME:
1187         // HANDSHAKE_DONE has no payload.
1188         break;
1189       case ACK_FREQUENCY_FRAME:
1190         if (!AppendAckFrequencyFrame(*frame.ack_frequency_frame, writer)) {
1191           QUIC_BUG(quic_bug_10850_51)
1192               << "AppendAckFrequencyFrame failed: " << detailed_error();
1193           return 0;
1194         }
1195         break;
1196       default:
1197         set_detailed_error("Tried to append unknown frame type.");
1198         RaiseError(QUIC_INVALID_FRAME_DATA);
1199         QUIC_BUG(quic_bug_10850_52)
1200             << "QUIC_INVALID_FRAME_DATA: " << frame.type;
1201         return 0;
1202     }
1203     ++i;
1204   }
1205 
1206   return writer->length();
1207 }
1208 
1209 // static
BuildPublicResetPacket(const QuicPublicResetPacket & packet)1210 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
1211     const QuicPublicResetPacket& packet) {
1212   CryptoHandshakeMessage reset;
1213   reset.set_tag(kPRST);
1214   reset.SetValue(kRNON, packet.nonce_proof);
1215   if (packet.client_address.host().address_family() !=
1216       IpAddressFamily::IP_UNSPEC) {
1217     // packet.client_address is non-empty.
1218     QuicSocketAddressCoder address_coder(packet.client_address);
1219     std::string serialized_address = address_coder.Encode();
1220     if (serialized_address.empty()) {
1221       return nullptr;
1222     }
1223     reset.SetStringPiece(kCADR, serialized_address);
1224   }
1225   if (!packet.endpoint_id.empty()) {
1226     reset.SetStringPiece(kEPID, packet.endpoint_id);
1227   }
1228   const QuicData& reset_serialized = reset.GetSerialized();
1229 
1230   size_t len = kPublicFlagsSize + packet.connection_id.length() +
1231                reset_serialized.length();
1232   std::unique_ptr<char[]> buffer(new char[len]);
1233   QuicDataWriter writer(len, buffer.get());
1234 
1235   uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
1236                                        PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
1237   // This hack makes post-v33 public reset packet look like pre-v33 packets.
1238   flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1239   if (!writer.WriteUInt8(flags)) {
1240     return nullptr;
1241   }
1242 
1243   if (!writer.WriteConnectionId(packet.connection_id)) {
1244     return nullptr;
1245   }
1246 
1247   if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
1248     return nullptr;
1249   }
1250 
1251   return std::make_unique<QuicEncryptedPacket>(buffer.release(), len, true);
1252 }
1253 
1254 // static
GetMinStatelessResetPacketLength()1255 size_t QuicFramer::GetMinStatelessResetPacketLength() {
1256   // 5 bytes (40 bits) = 2 Fixed Bits (01) + 38 Unpredictable bits
1257   return 5 + kStatelessResetTokenLength;
1258 }
1259 
1260 // static
BuildIetfStatelessResetPacket(QuicConnectionId connection_id,size_t received_packet_length,StatelessResetToken stateless_reset_token)1261 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildIetfStatelessResetPacket(
1262     QuicConnectionId connection_id, size_t received_packet_length,
1263     StatelessResetToken stateless_reset_token) {
1264   return BuildIetfStatelessResetPacket(connection_id, received_packet_length,
1265                                        stateless_reset_token,
1266                                        QuicRandom::GetInstance());
1267 }
1268 
1269 // static
BuildIetfStatelessResetPacket(QuicConnectionId,size_t received_packet_length,StatelessResetToken stateless_reset_token,QuicRandom * random)1270 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildIetfStatelessResetPacket(
1271     QuicConnectionId /*connection_id*/, size_t received_packet_length,
1272     StatelessResetToken stateless_reset_token, QuicRandom* random) {
1273   QUIC_DVLOG(1) << "Building IETF stateless reset packet.";
1274   if (received_packet_length <= GetMinStatelessResetPacketLength()) {
1275     QUICHE_DLOG(ERROR)
1276         << "Tried to build stateless reset packet with received packet "
1277            "length "
1278         << received_packet_length;
1279     return nullptr;
1280   }
1281   // To ensure stateless reset is indistinguishable from a valid packet,
1282   // include the max connection ID length.
1283   size_t len = std::min(received_packet_length - 1,
1284                         GetMinStatelessResetPacketLength() + 1 +
1285                             kQuicMaxConnectionIdWithLengthPrefixLength);
1286   std::unique_ptr<char[]> buffer(new char[len]);
1287   QuicDataWriter writer(len, buffer.get());
1288   // Append random bytes. This randomness only exists to prevent middleboxes
1289   // from comparing the entire packet to a known value. Therefore it has no
1290   // cryptographic use, and does not need a secure cryptographic pseudo-random
1291   // number generator. It's therefore safe to use WriteInsecureRandomBytes.
1292   const size_t random_bytes_size = len - kStatelessResetTokenLength;
1293   if (!writer.WriteInsecureRandomBytes(random, random_bytes_size)) {
1294     QUIC_BUG(362045737_2) << "Failed to append random bytes of length: "
1295                           << random_bytes_size;
1296     return nullptr;
1297   }
1298   // Change first 2 fixed bits to 01.
1299   buffer[0] &= ~FLAGS_LONG_HEADER;
1300   buffer[0] |= FLAGS_FIXED_BIT;
1301 
1302   // Append stateless reset token.
1303   if (!writer.WriteBytes(&stateless_reset_token,
1304                          sizeof(stateless_reset_token))) {
1305     QUIC_BUG(362045737_3) << "Failed to write stateless reset token";
1306     return nullptr;
1307   }
1308   return std::make_unique<QuicEncryptedPacket>(buffer.release(), len,
1309                                                /*owns_buffer=*/true);
1310 }
1311 
1312 // static
BuildVersionNegotiationPacket(QuicConnectionId server_connection_id,QuicConnectionId client_connection_id,bool ietf_quic,bool use_length_prefix,const ParsedQuicVersionVector & versions)1313 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
1314     QuicConnectionId server_connection_id,
1315     QuicConnectionId client_connection_id, bool ietf_quic,
1316     bool use_length_prefix, const ParsedQuicVersionVector& versions) {
1317   QUIC_CODE_COUNT(quic_build_version_negotiation);
1318   if (use_length_prefix) {
1319     QUICHE_DCHECK(ietf_quic);
1320     QUIC_CODE_COUNT(quic_build_version_negotiation_ietf);
1321   } else if (ietf_quic) {
1322     QUIC_CODE_COUNT(quic_build_version_negotiation_old_ietf);
1323   } else {
1324     QUIC_CODE_COUNT(quic_build_version_negotiation_old_gquic);
1325   }
1326   ParsedQuicVersionVector wire_versions = versions;
1327   // Add a version reserved for negotiation as suggested by the
1328   // "Using Reserved Versions" section of draft-ietf-quic-transport.
1329   if (wire_versions.empty()) {
1330     // Ensure that version negotiation packets we send have at least two
1331     // versions. This guarantees that, under all circumstances, all QUIC
1332     // packets we send are at least 14 bytes long.
1333     wire_versions = {QuicVersionReservedForNegotiation(),
1334                      QuicVersionReservedForNegotiation()};
1335   } else {
1336     // This is not uniformely distributed but is acceptable since no security
1337     // depends on this randomness.
1338     size_t version_index = 0;
1339     const bool disable_randomness =
1340         GetQuicFlag(quic_disable_version_negotiation_grease_randomness);
1341     if (!disable_randomness) {
1342       version_index =
1343           QuicRandom::GetInstance()->RandUint64() % (wire_versions.size() + 1);
1344     }
1345     wire_versions.insert(wire_versions.begin() + version_index,
1346                          QuicVersionReservedForNegotiation());
1347   }
1348   if (ietf_quic) {
1349     return BuildIetfVersionNegotiationPacket(
1350         use_length_prefix, server_connection_id, client_connection_id,
1351         wire_versions);
1352   }
1353 
1354   // The GQUIC encoding does not support encoding client connection IDs.
1355   QUICHE_DCHECK(client_connection_id.IsEmpty());
1356   // The GQUIC encoding does not support length-prefixed connection IDs.
1357   QUICHE_DCHECK(!use_length_prefix);
1358 
1359   QUICHE_DCHECK(!wire_versions.empty());
1360   size_t len = kPublicFlagsSize + server_connection_id.length() +
1361                wire_versions.size() * kQuicVersionSize;
1362   std::unique_ptr<char[]> buffer(new char[len]);
1363   QuicDataWriter writer(len, buffer.get());
1364 
1365   uint8_t flags = static_cast<uint8_t>(
1366       PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
1367       PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1368   if (!writer.WriteUInt8(flags)) {
1369     return nullptr;
1370   }
1371 
1372   if (!writer.WriteConnectionId(server_connection_id)) {
1373     return nullptr;
1374   }
1375 
1376   for (const ParsedQuicVersion& version : wire_versions) {
1377     if (!writer.WriteUInt32(CreateQuicVersionLabel(version))) {
1378       return nullptr;
1379     }
1380   }
1381 
1382   return std::make_unique<QuicEncryptedPacket>(buffer.release(), len, true);
1383 }
1384 
1385 // static
1386 std::unique_ptr<QuicEncryptedPacket>
BuildIetfVersionNegotiationPacket(bool use_length_prefix,QuicConnectionId server_connection_id,QuicConnectionId client_connection_id,const ParsedQuicVersionVector & versions)1387 QuicFramer::BuildIetfVersionNegotiationPacket(
1388     bool use_length_prefix, QuicConnectionId server_connection_id,
1389     QuicConnectionId client_connection_id,
1390     const ParsedQuicVersionVector& versions) {
1391   QUIC_DVLOG(1) << "Building IETF version negotiation packet with"
1392                 << (use_length_prefix ? "" : "out")
1393                 << " length prefix, server_connection_id "
1394                 << server_connection_id << " client_connection_id "
1395                 << client_connection_id << " versions "
1396                 << ParsedQuicVersionVectorToString(versions);
1397   QUICHE_DCHECK(!versions.empty());
1398   size_t len = kPacketHeaderTypeSize + kConnectionIdLengthSize +
1399                client_connection_id.length() + server_connection_id.length() +
1400                (versions.size() + 1) * kQuicVersionSize;
1401   if (use_length_prefix) {
1402     // When using length-prefixed connection IDs, packets carry two lengths
1403     // instead of one.
1404     len += kConnectionIdLengthSize;
1405   }
1406   std::unique_ptr<char[]> buffer(new char[len]);
1407   QuicDataWriter writer(len, buffer.get());
1408 
1409   // TODO(fayang): Randomly select a value for the type.
1410   uint8_t type = static_cast<uint8_t>(FLAGS_LONG_HEADER | FLAGS_FIXED_BIT);
1411   if (!writer.WriteUInt8(type)) {
1412     return nullptr;
1413   }
1414 
1415   if (!writer.WriteUInt32(0)) {
1416     return nullptr;
1417   }
1418 
1419   if (!AppendIetfConnectionIds(true, use_length_prefix, client_connection_id,
1420                                server_connection_id, &writer)) {
1421     return nullptr;
1422   }
1423 
1424   for (const ParsedQuicVersion& version : versions) {
1425     if (!writer.WriteUInt32(CreateQuicVersionLabel(version))) {
1426       return nullptr;
1427     }
1428   }
1429 
1430   return std::make_unique<QuicEncryptedPacket>(buffer.release(), len, true);
1431 }
1432 
ProcessPacket(const QuicEncryptedPacket & packet)1433 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
1434   QUICHE_DCHECK(!is_processing_packet_) << ENDPOINT << "Nested ProcessPacket";
1435   is_processing_packet_ = true;
1436   bool result = ProcessPacketInternal(packet);
1437   is_processing_packet_ = false;
1438   return result;
1439 }
1440 
ProcessPacketInternal(const QuicEncryptedPacket & packet)1441 bool QuicFramer::ProcessPacketInternal(const QuicEncryptedPacket& packet) {
1442   QuicDataReader reader(packet.data(), packet.length());
1443   QUIC_DVLOG(1) << ENDPOINT << "Processing IETF QUIC packet.";
1444 
1445   visitor_->OnPacket();
1446 
1447   QuicPacketHeader header;
1448   if (!ProcessIetfPacketHeader(&reader, &header)) {
1449     QUICHE_DCHECK_NE("", detailed_error_);
1450     QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: "
1451                   << detailed_error_;
1452     QUICHE_DCHECK_NE("", detailed_error_);
1453     RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_HEADER);
1454     return RaiseError(QUIC_INVALID_PACKET_HEADER);
1455   }
1456 
1457   if (!visitor_->OnUnauthenticatedPublicHeader(header)) {
1458     // The visitor suppresses further processing of the packet.
1459     return true;
1460   }
1461 
1462   if (IsVersionNegotiation(header)) {
1463     if (perspective_ == Perspective::IS_CLIENT) {
1464       QUIC_DVLOG(1) << "Client received version negotiation packet";
1465       return ProcessVersionNegotiationPacket(&reader, header);
1466     } else {
1467       QUIC_DLOG(ERROR) << "Server received version negotiation packet";
1468       set_detailed_error("Server received version negotiation packet.");
1469       return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1470     }
1471   }
1472 
1473   if (header.version_flag && header.version != version_) {
1474     if (perspective_ == Perspective::IS_SERVER) {
1475       if (!visitor_->OnProtocolVersionMismatch(header.version)) {
1476         RecordDroppedPacketReason(DroppedPacketReason::VERSION_MISMATCH);
1477         return true;
1478       }
1479     } else {
1480       // A client received a packet of a different version but that packet is
1481       // not a version negotiation packet. It is therefore invalid and dropped.
1482       QUIC_DLOG(ERROR) << "Client received unexpected version "
1483                        << ParsedQuicVersionToString(header.version)
1484                        << " instead of " << ParsedQuicVersionToString(version_);
1485       set_detailed_error("Client received unexpected version.");
1486       return RaiseError(QUIC_PACKET_WRONG_VERSION);
1487     }
1488   }
1489 
1490   bool rv;
1491   if (header.long_packet_type == RETRY) {
1492     rv = ProcessRetryPacket(&reader, header);
1493   } else if (packet.length() <= kMaxIncomingPacketSize) {
1494     // The optimized decryption algorithm implementations run faster when
1495     // operating on aligned memory.
1496     ABSL_CACHELINE_ALIGNED char buffer[kMaxIncomingPacketSize];
1497     rv = ProcessIetfDataPacket(&reader, &header, packet, buffer,
1498                                ABSL_ARRAYSIZE(buffer));
1499   } else {
1500     std::unique_ptr<char[]> large_buffer(new char[packet.length()]);
1501     rv = ProcessIetfDataPacket(&reader, &header, packet, large_buffer.get(),
1502                                packet.length());
1503     QUIC_BUG_IF(quic_bug_10850_53, rv)
1504         << "QUIC should never successfully process packets larger"
1505         << "than kMaxIncomingPacketSize. packet size:" << packet.length();
1506   }
1507   return rv;
1508 }
1509 
ProcessVersionNegotiationPacket(QuicDataReader * reader,const QuicPacketHeader & header)1510 bool QuicFramer::ProcessVersionNegotiationPacket(
1511     QuicDataReader* reader, const QuicPacketHeader& header) {
1512   QUICHE_DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1513 
1514   QuicVersionNegotiationPacket packet(
1515       GetServerConnectionIdAsRecipient(header, perspective_));
1516   // Try reading at least once to raise error if the packet is invalid.
1517   do {
1518     QuicVersionLabel version_label;
1519     if (!ProcessVersionLabel(reader, &version_label)) {
1520       set_detailed_error("Unable to read supported version in negotiation.");
1521       RecordDroppedPacketReason(
1522           DroppedPacketReason::INVALID_VERSION_NEGOTIATION_PACKET);
1523       return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1524     }
1525     ParsedQuicVersion parsed_version = ParseQuicVersionLabel(version_label);
1526     if (parsed_version != UnsupportedQuicVersion()) {
1527       packet.versions.push_back(parsed_version);
1528     }
1529   } while (!reader->IsDoneReading());
1530 
1531   QUIC_DLOG(INFO) << ENDPOINT << "parsed version negotiation: "
1532                   << ParsedQuicVersionVectorToString(packet.versions);
1533 
1534   visitor_->OnVersionNegotiationPacket(packet);
1535   return true;
1536 }
1537 
ProcessRetryPacket(QuicDataReader * reader,const QuicPacketHeader & header)1538 bool QuicFramer::ProcessRetryPacket(QuicDataReader* reader,
1539                                     const QuicPacketHeader& header) {
1540   QUICHE_DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1541   if (drop_incoming_retry_packets_) {
1542     QUIC_DLOG(INFO) << "Ignoring received RETRY packet";
1543     return true;
1544   }
1545 
1546   if (version_.UsesTls()) {
1547     QUICHE_DCHECK(version_.HasLengthPrefixedConnectionIds()) << version_;
1548     const size_t bytes_remaining = reader->BytesRemaining();
1549     if (bytes_remaining <= kRetryIntegrityTagLength) {
1550       set_detailed_error("Retry packet too short to parse integrity tag.");
1551       return false;
1552     }
1553     const size_t retry_token_length =
1554         bytes_remaining - kRetryIntegrityTagLength;
1555     QUICHE_DCHECK_GT(retry_token_length, 0u);
1556     absl::string_view retry_token;
1557     if (!reader->ReadStringPiece(&retry_token, retry_token_length)) {
1558       set_detailed_error("Failed to read retry token.");
1559       return false;
1560     }
1561     absl::string_view retry_without_tag = reader->PreviouslyReadPayload();
1562     absl::string_view integrity_tag = reader->ReadRemainingPayload();
1563     QUICHE_DCHECK_EQ(integrity_tag.length(), kRetryIntegrityTagLength);
1564     visitor_->OnRetryPacket(EmptyQuicConnectionId(),
1565                             header.source_connection_id, retry_token,
1566                             integrity_tag, retry_without_tag);
1567     return true;
1568   }
1569 
1570   QuicConnectionId original_destination_connection_id;
1571   if (version_.HasLengthPrefixedConnectionIds()) {
1572     // Parse Original Destination Connection ID.
1573     if (!reader->ReadLengthPrefixedConnectionId(
1574             &original_destination_connection_id)) {
1575       set_detailed_error("Unable to read Original Destination ConnectionId.");
1576       return false;
1577     }
1578   } else {
1579     // Parse Original Destination Connection ID Length.
1580     uint8_t odcil = header.type_byte & 0xf;
1581     if (odcil != 0) {
1582       odcil += kConnectionIdLengthAdjustment;
1583     }
1584 
1585     // Parse Original Destination Connection ID.
1586     if (!reader->ReadConnectionId(&original_destination_connection_id, odcil)) {
1587       set_detailed_error("Unable to read Original Destination ConnectionId.");
1588       return false;
1589     }
1590   }
1591 
1592   if (!QuicUtils::IsConnectionIdValidForVersion(
1593           original_destination_connection_id, transport_version())) {
1594     set_detailed_error(
1595         "Received Original Destination ConnectionId with invalid length.");
1596     return false;
1597   }
1598 
1599   absl::string_view retry_token = reader->ReadRemainingPayload();
1600   visitor_->OnRetryPacket(original_destination_connection_id,
1601                           header.source_connection_id, retry_token,
1602                           /*retry_integrity_tag=*/absl::string_view(),
1603                           /*retry_without_tag=*/absl::string_view());
1604   return true;
1605 }
1606 
1607 // Seeks the current packet to check for a coalesced packet at the end.
1608 // If the IETF length field only spans part of the outer packet,
1609 // then there is a coalesced packet after this one.
MaybeProcessCoalescedPacket(const QuicDataReader & encrypted_reader,uint64_t remaining_bytes_length,const QuicPacketHeader & header)1610 void QuicFramer::MaybeProcessCoalescedPacket(
1611     const QuicDataReader& encrypted_reader, uint64_t remaining_bytes_length,
1612     const QuicPacketHeader& header) {
1613   if (header.remaining_packet_length >= remaining_bytes_length) {
1614     // There is no coalesced packet.
1615     return;
1616   }
1617 
1618   absl::string_view remaining_data = encrypted_reader.PeekRemainingPayload();
1619   QUICHE_DCHECK_EQ(remaining_data.length(), remaining_bytes_length);
1620 
1621   const char* coalesced_data =
1622       remaining_data.data() + header.remaining_packet_length;
1623   uint64_t coalesced_data_length =
1624       remaining_bytes_length - header.remaining_packet_length;
1625   QuicDataReader coalesced_reader(coalesced_data, coalesced_data_length);
1626 
1627   QuicPacketHeader coalesced_header;
1628   if (!ProcessIetfPacketHeader(&coalesced_reader, &coalesced_header)) {
1629     // Some implementations pad their INITIAL packets by sending random invalid
1630     // data after the INITIAL, and that is allowed by the specification. If we
1631     // fail to parse a subsequent coalesced packet, simply ignore it.
1632     QUIC_DLOG(INFO) << ENDPOINT
1633                     << "Failed to parse received coalesced header of length "
1634                     << coalesced_data_length
1635                     << " with error: " << detailed_error_ << ": "
1636                     << absl::BytesToHexString(absl::string_view(
1637                            coalesced_data, coalesced_data_length))
1638                     << " previous header was " << header;
1639     return;
1640   }
1641 
1642   if (coalesced_header.destination_connection_id !=
1643       header.destination_connection_id) {
1644     // Drop coalesced packets with mismatched connection IDs.
1645     QUIC_DLOG(INFO) << ENDPOINT << "Received mismatched coalesced header "
1646                     << coalesced_header << " previous header was " << header;
1647     QUIC_CODE_COUNT(
1648         quic_received_coalesced_packets_with_mismatched_connection_id);
1649     return;
1650   }
1651 
1652   QuicEncryptedPacket coalesced_packet(coalesced_data, coalesced_data_length,
1653                                        /*owns_buffer=*/false);
1654   visitor_->OnCoalescedPacket(coalesced_packet);
1655 }
1656 
MaybeProcessIetfLength(QuicDataReader * encrypted_reader,QuicPacketHeader * header)1657 bool QuicFramer::MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
1658                                         QuicPacketHeader* header) {
1659   if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1660       header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1661       (header->long_packet_type != INITIAL &&
1662        header->long_packet_type != HANDSHAKE &&
1663        header->long_packet_type != ZERO_RTT_PROTECTED)) {
1664     return true;
1665   }
1666   header->length_length = encrypted_reader->PeekVarInt62Length();
1667   if (!encrypted_reader->ReadVarInt62(&header->remaining_packet_length)) {
1668     set_detailed_error("Unable to read long header payload length.");
1669     return RaiseError(QUIC_INVALID_PACKET_HEADER);
1670   }
1671   uint64_t remaining_bytes_length = encrypted_reader->BytesRemaining();
1672   if (header->remaining_packet_length > remaining_bytes_length) {
1673     set_detailed_error("Long header payload length longer than packet.");
1674     return RaiseError(QUIC_INVALID_PACKET_HEADER);
1675   }
1676 
1677   MaybeProcessCoalescedPacket(*encrypted_reader, remaining_bytes_length,
1678                               *header);
1679 
1680   if (!encrypted_reader->TruncateRemaining(header->remaining_packet_length)) {
1681     set_detailed_error("Length TruncateRemaining failed.");
1682     QUIC_BUG(quic_bug_10850_54) << "Length TruncateRemaining failed.";
1683     return RaiseError(QUIC_INVALID_PACKET_HEADER);
1684   }
1685   return true;
1686 }
1687 
ProcessIetfDataPacket(QuicDataReader * encrypted_reader,QuicPacketHeader * header,const QuicEncryptedPacket & packet,char * decrypted_buffer,size_t buffer_length)1688 bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
1689                                        QuicPacketHeader* header,
1690                                        const QuicEncryptedPacket& packet,
1691                                        char* decrypted_buffer,
1692                                        size_t buffer_length) {
1693   QUICHE_DCHECK_NE(GOOGLE_QUIC_PACKET, header->form);
1694   QUICHE_DCHECK(!header->has_possible_stateless_reset_token);
1695   header->length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
1696   header->remaining_packet_length = 0;
1697   if (header->form == IETF_QUIC_SHORT_HEADER_PACKET &&
1698       perspective_ == Perspective::IS_CLIENT) {
1699     // Peek possible stateless reset token. Will only be used on decryption
1700     // failure.
1701     absl::string_view remaining = encrypted_reader->PeekRemainingPayload();
1702     if (remaining.length() >= sizeof(header->possible_stateless_reset_token)) {
1703       header->has_possible_stateless_reset_token = true;
1704       memcpy(&header->possible_stateless_reset_token,
1705              &remaining.data()[remaining.length() -
1706                                sizeof(header->possible_stateless_reset_token)],
1707              sizeof(header->possible_stateless_reset_token));
1708     }
1709   }
1710 
1711   if (!MaybeProcessIetfLength(encrypted_reader, header)) {
1712     return false;
1713   }
1714 
1715   absl::string_view associated_data;
1716   std::vector<char> ad_storage;
1717   QuicPacketNumber base_packet_number;
1718   if (header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1719       header->long_packet_type != VERSION_NEGOTIATION) {
1720     QUICHE_DCHECK(header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1721                   header->long_packet_type == INITIAL ||
1722                   header->long_packet_type == HANDSHAKE ||
1723                   header->long_packet_type == ZERO_RTT_PROTECTED);
1724     // Process packet number.
1725     if (supports_multiple_packet_number_spaces_) {
1726       PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
1727       if (pn_space == NUM_PACKET_NUMBER_SPACES) {
1728         return RaiseError(QUIC_INVALID_PACKET_HEADER);
1729       }
1730       base_packet_number = largest_decrypted_packet_numbers_[pn_space];
1731     } else {
1732       base_packet_number = largest_packet_number_;
1733     }
1734     uint64_t full_packet_number;
1735     bool hp_removal_failed = false;
1736     if (version_.HasHeaderProtection()) {
1737       if (!RemoveHeaderProtection(encrypted_reader, packet, header,
1738                                   &full_packet_number, &ad_storage)) {
1739         hp_removal_failed = true;
1740       }
1741       associated_data = absl::string_view(ad_storage.data(), ad_storage.size());
1742     } else if (!ProcessAndCalculatePacketNumber(
1743                    encrypted_reader, header->packet_number_length,
1744                    base_packet_number, &full_packet_number)) {
1745       set_detailed_error("Unable to read packet number.");
1746       RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1747       return RaiseError(QUIC_INVALID_PACKET_HEADER);
1748     }
1749 
1750     if (hp_removal_failed ||
1751         !IsValidFullPacketNumber(full_packet_number, version())) {
1752       if (IsIetfStatelessResetPacket(*header)) {
1753         // This is a stateless reset packet.
1754         QuicIetfStatelessResetPacket reset_packet(
1755             *header, header->possible_stateless_reset_token);
1756         visitor_->OnAuthenticatedIetfStatelessResetPacket(reset_packet);
1757         return true;
1758       }
1759       if (hp_removal_failed) {
1760         const EncryptionLevel decryption_level = GetEncryptionLevel(*header);
1761         const bool has_decryption_key = decrypter_[decryption_level] != nullptr;
1762         visitor_->OnUndecryptablePacket(
1763             QuicEncryptedPacket(encrypted_reader->FullPayload()),
1764             decryption_level, has_decryption_key);
1765         RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1766         set_detailed_error(absl::StrCat(
1767             "Unable to decrypt ", EncryptionLevelToString(decryption_level),
1768             " header protection", has_decryption_key ? "" : " (missing key)",
1769             "."));
1770         return RaiseError(QUIC_DECRYPTION_FAILURE);
1771       }
1772       RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1773       set_detailed_error("packet numbers cannot be 0.");
1774       return RaiseError(QUIC_INVALID_PACKET_HEADER);
1775     }
1776     header->packet_number = QuicPacketNumber(full_packet_number);
1777   }
1778 
1779   // A nonce should only present in SHLO from the server to the client when
1780   // using QUIC crypto.
1781   if (header->form == IETF_QUIC_LONG_HEADER_PACKET &&
1782       header->long_packet_type == ZERO_RTT_PROTECTED &&
1783       perspective_ == Perspective::IS_CLIENT &&
1784       version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
1785     if (!encrypted_reader->ReadBytes(
1786             reinterpret_cast<uint8_t*>(last_nonce_.data()),
1787             last_nonce_.size())) {
1788       set_detailed_error("Unable to read nonce.");
1789       RecordDroppedPacketReason(
1790           DroppedPacketReason::INVALID_DIVERSIFICATION_NONCE);
1791       return RaiseError(QUIC_INVALID_PACKET_HEADER);
1792     }
1793 
1794     header->nonce = &last_nonce_;
1795   } else {
1796     header->nonce = nullptr;
1797   }
1798 
1799   if (!visitor_->OnUnauthenticatedHeader(*header)) {
1800     set_detailed_error(
1801         "Visitor asked to stop processing of unauthenticated header.");
1802     return false;
1803   }
1804 
1805   absl::string_view encrypted = encrypted_reader->ReadRemainingPayload();
1806   if (!version_.HasHeaderProtection()) {
1807     associated_data = GetAssociatedDataFromEncryptedPacket(
1808         version_.transport_version, packet,
1809         GetIncludedDestinationConnectionIdLength(*header),
1810         GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1811         header->nonce != nullptr, header->packet_number_length,
1812         header->retry_token_length_length, header->retry_token.length(),
1813         header->length_length);
1814   }
1815 
1816   size_t decrypted_length = 0;
1817   EncryptionLevel decrypted_level;
1818   if (!DecryptPayload(packet.length(), encrypted, associated_data, *header,
1819                       decrypted_buffer, buffer_length, &decrypted_length,
1820                       &decrypted_level)) {
1821     if (IsIetfStatelessResetPacket(*header)) {
1822       // This is a stateless reset packet.
1823       QuicIetfStatelessResetPacket reset_packet(
1824           *header, header->possible_stateless_reset_token);
1825       visitor_->OnAuthenticatedIetfStatelessResetPacket(reset_packet);
1826       return true;
1827     }
1828     const EncryptionLevel decryption_level = GetEncryptionLevel(*header);
1829     const bool has_decryption_key = version_.KnowsWhichDecrypterToUse() &&
1830                                     decrypter_[decryption_level] != nullptr;
1831     visitor_->OnUndecryptablePacket(
1832         QuicEncryptedPacket(encrypted_reader->FullPayload()), decryption_level,
1833         has_decryption_key);
1834     set_detailed_error(absl::StrCat(
1835         "Unable to decrypt ", EncryptionLevelToString(decryption_level),
1836         " payload with reconstructed packet number ",
1837         header->packet_number.ToString(), " (largest decrypted was ",
1838         base_packet_number.ToString(), ")",
1839         has_decryption_key || !version_.KnowsWhichDecrypterToUse()
1840             ? ""
1841             : " (missing key)",
1842         "."));
1843     RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1844     return RaiseError(QUIC_DECRYPTION_FAILURE);
1845   }
1846   QuicDataReader reader(decrypted_buffer, decrypted_length);
1847 
1848   // Remember decrypted_payload in the current connection context until the end
1849   // of this function.
1850   auto* connection_context = QuicConnectionContext::Current();
1851   if (connection_context != nullptr) {
1852     connection_context->process_packet_context.decrypted_payload =
1853         reader.FullPayload();
1854     connection_context->process_packet_context.current_frame_offset = 0;
1855   }
1856   auto clear_decrypted_payload = absl::MakeCleanup([&]() {
1857     if (connection_context != nullptr) {
1858       connection_context->process_packet_context.decrypted_payload =
1859           absl::string_view();
1860     }
1861   });
1862 
1863   // Update the largest packet number after we have decrypted the packet
1864   // so we are confident is not attacker controlled.
1865   if (supports_multiple_packet_number_spaces_) {
1866     largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1867                                           decrypted_level)]
1868         .UpdateMax(header->packet_number);
1869   } else {
1870     largest_packet_number_.UpdateMax(header->packet_number);
1871   }
1872 
1873   if (!visitor_->OnPacketHeader(*header)) {
1874     RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1875     // The visitor suppresses further processing of the packet.
1876     return true;
1877   }
1878 
1879   if (packet.length() > kMaxIncomingPacketSize) {
1880     set_detailed_error("Packet too large.");
1881     return RaiseError(QUIC_PACKET_TOO_LARGE);
1882   }
1883 
1884   // Handle the payload.
1885   if (VersionHasIetfQuicFrames(version_.transport_version)) {
1886     current_received_frame_type_ = 0;
1887     previously_received_frame_type_ = 0;
1888     if (!ProcessIetfFrameData(&reader, *header, decrypted_level)) {
1889       current_received_frame_type_ = 0;
1890       previously_received_frame_type_ = 0;
1891       QUICHE_DCHECK_NE(QUIC_NO_ERROR,
1892                        error_);  // ProcessIetfFrameData sets the error.
1893       QUICHE_DCHECK_NE("", detailed_error_);
1894       QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1895                          << detailed_error_;
1896       return false;
1897     }
1898     current_received_frame_type_ = 0;
1899     previously_received_frame_type_ = 0;
1900   } else {
1901     if (!ProcessFrameData(&reader, *header)) {
1902       QUICHE_DCHECK_NE(QUIC_NO_ERROR,
1903                        error_);  // ProcessFrameData sets the error.
1904       QUICHE_DCHECK_NE("", detailed_error_);
1905       QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1906                          << detailed_error_;
1907       return false;
1908     }
1909   }
1910 
1911   visitor_->OnPacketComplete();
1912   return true;
1913 }
1914 
IsIetfStatelessResetPacket(const QuicPacketHeader & header) const1915 bool QuicFramer::IsIetfStatelessResetPacket(
1916     const QuicPacketHeader& header) const {
1917   QUIC_BUG_IF(quic_bug_12975_3, header.has_possible_stateless_reset_token &&
1918                                     perspective_ != Perspective::IS_CLIENT)
1919       << "has_possible_stateless_reset_token can only be true at client side.";
1920   return header.form == IETF_QUIC_SHORT_HEADER_PACKET &&
1921          header.has_possible_stateless_reset_token &&
1922          visitor_->IsValidStatelessResetToken(
1923              header.possible_stateless_reset_token);
1924 }
1925 
HasEncrypterOfEncryptionLevel(EncryptionLevel level) const1926 bool QuicFramer::HasEncrypterOfEncryptionLevel(EncryptionLevel level) const {
1927   return encrypter_[level] != nullptr;
1928 }
1929 
HasDecrypterOfEncryptionLevel(EncryptionLevel level) const1930 bool QuicFramer::HasDecrypterOfEncryptionLevel(EncryptionLevel level) const {
1931   return decrypter_[level] != nullptr;
1932 }
1933 
HasAnEncrypterForSpace(PacketNumberSpace space) const1934 bool QuicFramer::HasAnEncrypterForSpace(PacketNumberSpace space) const {
1935   switch (space) {
1936     case INITIAL_DATA:
1937       return HasEncrypterOfEncryptionLevel(ENCRYPTION_INITIAL);
1938     case HANDSHAKE_DATA:
1939       return HasEncrypterOfEncryptionLevel(ENCRYPTION_HANDSHAKE);
1940     case APPLICATION_DATA:
1941       return HasEncrypterOfEncryptionLevel(ENCRYPTION_ZERO_RTT) ||
1942              HasEncrypterOfEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
1943     case NUM_PACKET_NUMBER_SPACES:
1944       break;
1945   }
1946   QUIC_BUG(quic_bug_10850_55)
1947       << ENDPOINT
1948       << "Try to send data of space: " << PacketNumberSpaceToString(space);
1949   return false;
1950 }
1951 
GetEncryptionLevelToSendApplicationData() const1952 EncryptionLevel QuicFramer::GetEncryptionLevelToSendApplicationData() const {
1953   if (!HasAnEncrypterForSpace(APPLICATION_DATA)) {
1954     QUIC_BUG(quic_bug_12975_4)
1955         << "Tried to get encryption level to send application data with no "
1956            "encrypter available.";
1957     return NUM_ENCRYPTION_LEVELS;
1958   }
1959   if (HasEncrypterOfEncryptionLevel(ENCRYPTION_FORWARD_SECURE)) {
1960     return ENCRYPTION_FORWARD_SECURE;
1961   }
1962   QUICHE_DCHECK(HasEncrypterOfEncryptionLevel(ENCRYPTION_ZERO_RTT));
1963   return ENCRYPTION_ZERO_RTT;
1964 }
1965 
AppendIetfHeaderTypeByte(const QuicPacketHeader & header,QuicDataWriter * writer)1966 bool QuicFramer::AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
1967                                           QuicDataWriter* writer) {
1968   uint8_t type = 0;
1969   if (header.version_flag) {
1970     type = static_cast<uint8_t>(
1971         FLAGS_LONG_HEADER | FLAGS_FIXED_BIT |
1972         LongHeaderTypeToOnWireValue(header.long_packet_type, version_) |
1973         PacketNumberLengthToOnWireValue(header.packet_number_length));
1974   } else {
1975     type = static_cast<uint8_t>(
1976         FLAGS_FIXED_BIT | (current_key_phase_bit_ ? FLAGS_KEY_PHASE_BIT : 0) |
1977         PacketNumberLengthToOnWireValue(header.packet_number_length));
1978   }
1979   return writer->WriteUInt8(type);
1980 }
1981 
AppendIetfPacketHeader(const QuicPacketHeader & header,QuicDataWriter * writer,size_t * length_field_offset)1982 bool QuicFramer::AppendIetfPacketHeader(const QuicPacketHeader& header,
1983                                         QuicDataWriter* writer,
1984                                         size_t* length_field_offset) {
1985   QUIC_DVLOG(1) << ENDPOINT << "Appending IETF header: " << header;
1986   QuicConnectionId server_connection_id =
1987       GetServerConnectionIdAsSender(header, perspective_);
1988   QUIC_BUG_IF(quic_bug_12975_6, !QuicUtils::IsConnectionIdValidForVersion(
1989                                     server_connection_id, transport_version()))
1990       << "AppendIetfPacketHeader: attempted to use connection ID "
1991       << server_connection_id << " which is invalid with version " << version();
1992   if (!AppendIetfHeaderTypeByte(header, writer)) {
1993     return false;
1994   }
1995 
1996   if (header.version_flag) {
1997     QUICHE_DCHECK_NE(VERSION_NEGOTIATION, header.long_packet_type)
1998         << "QuicFramer::AppendIetfPacketHeader does not support sending "
1999            "version negotiation packets, use "
2000            "QuicFramer::BuildVersionNegotiationPacket instead "
2001         << header;
2002     // Append version for long header.
2003     QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
2004     if (!writer->WriteUInt32(version_label)) {
2005       return false;
2006     }
2007   }
2008 
2009   // Append connection ID.
2010   if (!AppendIetfConnectionIds(
2011           header.version_flag, version_.HasLengthPrefixedConnectionIds(),
2012           header.destination_connection_id_included != CONNECTION_ID_ABSENT
2013               ? header.destination_connection_id
2014               : EmptyQuicConnectionId(),
2015           header.source_connection_id_included != CONNECTION_ID_ABSENT
2016               ? header.source_connection_id
2017               : EmptyQuicConnectionId(),
2018           writer)) {
2019     return false;
2020   }
2021 
2022   last_serialized_server_connection_id_ = server_connection_id;
2023 
2024   // TODO(b/141924462) Remove this QUIC_BUG once we do support sending RETRY.
2025   QUIC_BUG_IF(quic_bug_12975_7,
2026               header.version_flag && header.long_packet_type == RETRY)
2027       << "Sending IETF RETRY packets is not currently supported " << header;
2028 
2029   if (QuicVersionHasLongHeaderLengths(transport_version()) &&
2030       header.version_flag) {
2031     if (header.long_packet_type == INITIAL) {
2032       QUICHE_DCHECK_NE(quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0,
2033                        header.retry_token_length_length)
2034           << ENDPOINT << ParsedQuicVersionToString(version_)
2035           << " bad retry token length length in header: " << header;
2036       // Write retry token length.
2037       if (!writer->WriteVarInt62WithForcedLength(
2038               header.retry_token.length(), header.retry_token_length_length)) {
2039         return false;
2040       }
2041       // Write retry token.
2042       if (!header.retry_token.empty() &&
2043           !writer->WriteStringPiece(header.retry_token)) {
2044         return false;
2045       }
2046     }
2047     if (length_field_offset != nullptr) {
2048       *length_field_offset = writer->length();
2049     }
2050     // Add fake length to reserve two bytes to add length in later.
2051     writer->WriteVarInt62(256);
2052   } else if (length_field_offset != nullptr) {
2053     *length_field_offset = 0;
2054   }
2055 
2056   // Append packet number.
2057   if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2058                           writer)) {
2059     return false;
2060   }
2061   last_written_packet_number_length_ = header.packet_number_length;
2062 
2063   if (!header.version_flag) {
2064     return true;
2065   }
2066 
2067   if (header.nonce != nullptr) {
2068     QUICHE_DCHECK(header.version_flag);
2069     QUICHE_DCHECK_EQ(ZERO_RTT_PROTECTED, header.long_packet_type);
2070     QUICHE_DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2071     if (!writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2072       return false;
2073     }
2074   }
2075 
2076   return true;
2077 }
2078 
CalculateTimestampFromWire(uint32_t time_delta_us)2079 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
2080     uint32_t time_delta_us) {
2081   // The new time_delta might have wrapped to the next epoch, or it
2082   // might have reverse wrapped to the previous epoch, or it might
2083   // remain in the same epoch. Select the time closest to the previous
2084   // time.
2085   //
2086   // epoch_delta is the delta between epochs. A delta is 4 bytes of
2087   // microseconds.
2088   const uint64_t epoch_delta = UINT64_C(1) << 32;
2089   uint64_t epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1);
2090   // Wrapping is safe here because a wrapped value will not be ClosestTo below.
2091   uint64_t prev_epoch = epoch - epoch_delta;
2092   uint64_t next_epoch = epoch + epoch_delta;
2093 
2094   uint64_t time = ClosestTo(
2095       last_timestamp_.ToMicroseconds(), epoch + time_delta_us,
2096       ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us,
2097                 next_epoch + time_delta_us));
2098 
2099   return QuicTime::Delta::FromMicroseconds(time);
2100 }
2101 
CalculatePacketNumberFromWire(QuicPacketNumberLength packet_number_length,QuicPacketNumber base_packet_number,uint64_t packet_number) const2102 uint64_t QuicFramer::CalculatePacketNumberFromWire(
2103     QuicPacketNumberLength packet_number_length,
2104     QuicPacketNumber base_packet_number, uint64_t packet_number) const {
2105   // The new packet number might have wrapped to the next epoch, or
2106   // it might have reverse wrapped to the previous epoch, or it might
2107   // remain in the same epoch.  Select the packet number closest to the
2108   // next expected packet number, the previous packet number plus 1.
2109 
2110   // epoch_delta is the delta between epochs the packet number was serialized
2111   // with, so the correct value is likely the same epoch as the last sequence
2112   // number or an adjacent epoch.
2113   if (!base_packet_number.IsInitialized()) {
2114     return packet_number;
2115   }
2116   const uint64_t epoch_delta = UINT64_C(1) << (8 * packet_number_length);
2117   uint64_t next_packet_number = base_packet_number.ToUint64() + 1;
2118   uint64_t epoch = base_packet_number.ToUint64() & ~(epoch_delta - 1);
2119   uint64_t prev_epoch = epoch - epoch_delta;
2120   uint64_t next_epoch = epoch + epoch_delta;
2121 
2122   return ClosestTo(next_packet_number, epoch + packet_number,
2123                    ClosestTo(next_packet_number, prev_epoch + packet_number,
2124                              next_epoch + packet_number));
2125 }
2126 
2127 // static
GetMinPacketNumberLength(QuicPacketNumber packet_number)2128 QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength(
2129     QuicPacketNumber packet_number) {
2130   QUICHE_DCHECK(packet_number.IsInitialized());
2131   if (packet_number < QuicPacketNumber(1 << (PACKET_1BYTE_PACKET_NUMBER * 8))) {
2132     return PACKET_1BYTE_PACKET_NUMBER;
2133   } else if (packet_number <
2134              QuicPacketNumber(1 << (PACKET_2BYTE_PACKET_NUMBER * 8))) {
2135     return PACKET_2BYTE_PACKET_NUMBER;
2136   } else if (packet_number <
2137              QuicPacketNumber(UINT64_C(1)
2138                               << (PACKET_4BYTE_PACKET_NUMBER * 8))) {
2139     return PACKET_4BYTE_PACKET_NUMBER;
2140   } else {
2141     return PACKET_6BYTE_PACKET_NUMBER;
2142   }
2143 }
2144 
2145 // static
GetPacketNumberFlags(QuicPacketNumberLength packet_number_length)2146 uint8_t QuicFramer::GetPacketNumberFlags(
2147     QuicPacketNumberLength packet_number_length) {
2148   switch (packet_number_length) {
2149     case PACKET_1BYTE_PACKET_NUMBER:
2150       return PACKET_FLAGS_1BYTE_PACKET;
2151     case PACKET_2BYTE_PACKET_NUMBER:
2152       return PACKET_FLAGS_2BYTE_PACKET;
2153     case PACKET_4BYTE_PACKET_NUMBER:
2154       return PACKET_FLAGS_4BYTE_PACKET;
2155     case PACKET_6BYTE_PACKET_NUMBER:
2156     case PACKET_8BYTE_PACKET_NUMBER:
2157       return PACKET_FLAGS_8BYTE_PACKET;
2158     default:
2159       QUIC_BUG(quic_bug_10850_56) << "Unreachable case statement.";
2160       return PACKET_FLAGS_8BYTE_PACKET;
2161   }
2162 }
2163 
2164 // static
GetAckFrameInfo(const QuicAckFrame & frame)2165 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo(
2166     const QuicAckFrame& frame) {
2167   AckFrameInfo new_ack_info;
2168   if (frame.packets.Empty()) {
2169     return new_ack_info;
2170   }
2171   // The first block is the last interval. It isn't encoded with the gap-length
2172   // encoding, so skip it.
2173   new_ack_info.first_block_length = frame.packets.LastIntervalLength();
2174   auto itr = frame.packets.rbegin();
2175   QuicPacketNumber previous_start = itr->min();
2176   new_ack_info.max_block_length = itr->Length();
2177   ++itr;
2178 
2179   // Don't do any more work after getting information for 256 ACK blocks; any
2180   // more can't be encoded anyway.
2181   for (; itr != frame.packets.rend() &&
2182          new_ack_info.num_ack_blocks < std::numeric_limits<uint8_t>::max();
2183        previous_start = itr->min(), ++itr) {
2184     const auto& interval = *itr;
2185     const QuicPacketCount total_gap = previous_start - interval.max();
2186     new_ack_info.num_ack_blocks +=
2187         (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
2188         std::numeric_limits<uint8_t>::max();
2189     new_ack_info.max_block_length =
2190         std::max(new_ack_info.max_block_length, interval.Length());
2191   }
2192   return new_ack_info;
2193 }
2194 
ProcessIetfHeaderTypeByte(QuicDataReader * reader,QuicPacketHeader * header)2195 bool QuicFramer::ProcessIetfHeaderTypeByte(QuicDataReader* reader,
2196                                            QuicPacketHeader* header) {
2197   uint8_t type;
2198   if (!reader->ReadBytes(&type, 1)) {
2199     set_detailed_error("Unable to read first byte.");
2200     return false;
2201   }
2202   header->type_byte = type;
2203   // Determine whether this is a long or short header.
2204   header->form = GetIetfPacketHeaderFormat(type);
2205   if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
2206     // Version is always present in long headers.
2207     header->version_flag = true;
2208     // In versions that do not support client connection IDs, we mark the
2209     // corresponding connection ID as absent.
2210     header->destination_connection_id_included =
2211         (perspective_ == Perspective::IS_SERVER ||
2212          version_.SupportsClientConnectionIds())
2213             ? CONNECTION_ID_PRESENT
2214             : CONNECTION_ID_ABSENT;
2215     header->source_connection_id_included =
2216         (perspective_ == Perspective::IS_CLIENT ||
2217          version_.SupportsClientConnectionIds())
2218             ? CONNECTION_ID_PRESENT
2219             : CONNECTION_ID_ABSENT;
2220     // Read version tag.
2221     QuicVersionLabel version_label;
2222     if (!ProcessVersionLabel(reader, &version_label)) {
2223       set_detailed_error("Unable to read protocol version.");
2224       return false;
2225     }
2226     if (!version_label) {
2227       // Version label is 0 indicating this is a version negotiation packet.
2228       header->long_packet_type = VERSION_NEGOTIATION;
2229     } else {
2230       header->version = ParseQuicVersionLabel(version_label);
2231       if (header->version.IsKnown()) {
2232         if (!(type & FLAGS_FIXED_BIT)) {
2233           set_detailed_error("Fixed bit is 0 in long header.");
2234           return false;
2235         }
2236         header->long_packet_type = GetLongHeaderType(type, header->version);
2237         switch (header->long_packet_type) {
2238           case INVALID_PACKET_TYPE:
2239             set_detailed_error("Illegal long header type value.");
2240             return false;
2241           case RETRY:
2242             if (!version().SupportsRetry()) {
2243               set_detailed_error("RETRY not supported in this version.");
2244               return false;
2245             }
2246             if (perspective_ == Perspective::IS_SERVER) {
2247               set_detailed_error("Client-initiated RETRY is invalid.");
2248               return false;
2249             }
2250             break;
2251           default:
2252             if (!header->version.HasHeaderProtection()) {
2253               header->packet_number_length =
2254                   GetLongHeaderPacketNumberLength(type);
2255             }
2256             break;
2257         }
2258       }
2259     }
2260 
2261     QUIC_DVLOG(1) << ENDPOINT << "Received IETF long header: "
2262                   << QuicUtils::QuicLongHeaderTypetoString(
2263                          header->long_packet_type);
2264     return true;
2265   }
2266 
2267   QUIC_DVLOG(1) << ENDPOINT << "Received IETF short header";
2268   // Version is not present in short headers.
2269   header->version_flag = false;
2270   // In versions that do not support client connection IDs, the client will not
2271   // receive destination connection IDs.
2272   header->destination_connection_id_included =
2273       (perspective_ == Perspective::IS_SERVER ||
2274        version_.SupportsClientConnectionIds())
2275           ? CONNECTION_ID_PRESENT
2276           : CONNECTION_ID_ABSENT;
2277   header->source_connection_id_included = CONNECTION_ID_ABSENT;
2278   if (!(type & FLAGS_FIXED_BIT)) {
2279     set_detailed_error("Fixed bit is 0 in short header.");
2280     return false;
2281   }
2282   if (!version_.HasHeaderProtection()) {
2283     header->packet_number_length = GetShortHeaderPacketNumberLength(type);
2284   }
2285   QUIC_DVLOG(1) << "packet_number_length = " << header->packet_number_length;
2286   return true;
2287 }
2288 
2289 // static
ProcessVersionLabel(QuicDataReader * reader,QuicVersionLabel * version_label)2290 bool QuicFramer::ProcessVersionLabel(QuicDataReader* reader,
2291                                      QuicVersionLabel* version_label) {
2292   if (!reader->ReadUInt32(version_label)) {
2293     return false;
2294   }
2295   return true;
2296 }
2297 
2298 // static
ProcessAndValidateIetfConnectionIdLength(QuicDataReader * reader,ParsedQuicVersion version,Perspective perspective,bool should_update_expected_server_connection_id_length,uint8_t * expected_server_connection_id_length,uint8_t * destination_connection_id_length,uint8_t * source_connection_id_length,std::string * detailed_error)2299 bool QuicFramer::ProcessAndValidateIetfConnectionIdLength(
2300     QuicDataReader* reader, ParsedQuicVersion version, Perspective perspective,
2301     bool should_update_expected_server_connection_id_length,
2302     uint8_t* expected_server_connection_id_length,
2303     uint8_t* destination_connection_id_length,
2304     uint8_t* source_connection_id_length, std::string* detailed_error) {
2305   uint8_t connection_id_lengths_byte;
2306   if (!reader->ReadBytes(&connection_id_lengths_byte, 1)) {
2307     *detailed_error = "Unable to read ConnectionId length.";
2308     return false;
2309   }
2310   uint8_t dcil =
2311       (connection_id_lengths_byte & kDestinationConnectionIdLengthMask) >> 4;
2312   if (dcil != 0) {
2313     dcil += kConnectionIdLengthAdjustment;
2314   }
2315   uint8_t scil = connection_id_lengths_byte & kSourceConnectionIdLengthMask;
2316   if (scil != 0) {
2317     scil += kConnectionIdLengthAdjustment;
2318   }
2319   if (should_update_expected_server_connection_id_length) {
2320     uint8_t server_connection_id_length =
2321         perspective == Perspective::IS_SERVER ? dcil : scil;
2322     if (*expected_server_connection_id_length != server_connection_id_length) {
2323       QUIC_DVLOG(1) << "Updating expected_server_connection_id_length: "
2324                     << static_cast<int>(*expected_server_connection_id_length)
2325                     << " -> " << static_cast<int>(server_connection_id_length);
2326       *expected_server_connection_id_length = server_connection_id_length;
2327     }
2328   }
2329   if (!should_update_expected_server_connection_id_length &&
2330       (dcil != *destination_connection_id_length ||
2331        scil != *source_connection_id_length) &&
2332       version.IsKnown() && !version.AllowsVariableLengthConnectionIds()) {
2333     QUIC_DVLOG(1) << "dcil: " << static_cast<uint32_t>(dcil)
2334                   << ", scil: " << static_cast<uint32_t>(scil);
2335     *detailed_error = "Invalid ConnectionId length.";
2336     return false;
2337   }
2338   *destination_connection_id_length = dcil;
2339   *source_connection_id_length = scil;
2340   return true;
2341 }
2342 
ValidateReceivedConnectionIds(const QuicPacketHeader & header)2343 bool QuicFramer::ValidateReceivedConnectionIds(const QuicPacketHeader& header) {
2344   bool skip_server_connection_id_validation =
2345       perspective_ == Perspective::IS_CLIENT &&
2346       header.form == IETF_QUIC_SHORT_HEADER_PACKET;
2347   if (!skip_server_connection_id_validation &&
2348       !QuicUtils::IsConnectionIdValidForVersion(
2349           GetServerConnectionIdAsRecipient(header, perspective_),
2350           transport_version())) {
2351     set_detailed_error("Received server connection ID with invalid length.");
2352     return false;
2353   }
2354 
2355   bool skip_client_connection_id_validation =
2356       perspective_ == Perspective::IS_SERVER &&
2357       header.form == IETF_QUIC_SHORT_HEADER_PACKET;
2358   if (!skip_client_connection_id_validation &&
2359       version_.SupportsClientConnectionIds() &&
2360       !QuicUtils::IsConnectionIdValidForVersion(
2361           GetClientConnectionIdAsRecipient(header, perspective_),
2362           transport_version())) {
2363     set_detailed_error("Received client connection ID with invalid length.");
2364     return false;
2365   }
2366   return true;
2367 }
2368 
ProcessIetfPacketHeader(QuicDataReader * reader,QuicPacketHeader * header)2369 bool QuicFramer::ProcessIetfPacketHeader(QuicDataReader* reader,
2370                                          QuicPacketHeader* header) {
2371   if (version_.HasLengthPrefixedConnectionIds()) {
2372     uint8_t expected_destination_connection_id_length =
2373         perspective_ == Perspective::IS_CLIENT
2374             ? expected_client_connection_id_length_
2375             : expected_server_connection_id_length_;
2376     QuicVersionLabel version_label;
2377     bool has_length_prefix;
2378     std::string detailed_error;
2379     QuicErrorCode parse_result = QuicFramer::ParsePublicHeader(
2380         reader, expected_destination_connection_id_length, /*ietf_format=*/true,
2381         &header->type_byte, &header->form, &header->version_flag,
2382         &has_length_prefix, &version_label, &header->version,
2383         &header->destination_connection_id, &header->source_connection_id,
2384         &header->long_packet_type, &header->retry_token_length_length,
2385         &header->retry_token, &detailed_error);
2386     if (parse_result != QUIC_NO_ERROR) {
2387       set_detailed_error(detailed_error);
2388       return false;
2389     }
2390     header->destination_connection_id_included = CONNECTION_ID_PRESENT;
2391     header->source_connection_id_included =
2392         header->version_flag ? CONNECTION_ID_PRESENT : CONNECTION_ID_ABSENT;
2393 
2394     if (!ValidateReceivedConnectionIds(*header)) {
2395       return false;
2396     }
2397 
2398     if (header->version_flag &&
2399         header->long_packet_type != VERSION_NEGOTIATION &&
2400         !(header->type_byte & FLAGS_FIXED_BIT)) {
2401       set_detailed_error("Fixed bit is 0 in long header.");
2402       return false;
2403     }
2404     if (!header->version_flag && !(header->type_byte & FLAGS_FIXED_BIT)) {
2405       set_detailed_error("Fixed bit is 0 in short header.");
2406       return false;
2407     }
2408     if (!header->version_flag) {
2409       if (!version_.HasHeaderProtection()) {
2410         header->packet_number_length =
2411             GetShortHeaderPacketNumberLength(header->type_byte);
2412       }
2413       return true;
2414     }
2415     if (header->long_packet_type == RETRY) {
2416       if (!version().SupportsRetry()) {
2417         set_detailed_error("RETRY not supported in this version.");
2418         return false;
2419       }
2420       if (perspective_ == Perspective::IS_SERVER) {
2421         set_detailed_error("Client-initiated RETRY is invalid.");
2422         return false;
2423       }
2424       return true;
2425     }
2426     if (header->version.IsKnown() && !header->version.HasHeaderProtection()) {
2427       header->packet_number_length =
2428           GetLongHeaderPacketNumberLength(header->type_byte);
2429     }
2430 
2431     return true;
2432   }
2433 
2434   if (!ProcessIetfHeaderTypeByte(reader, header)) {
2435     return false;
2436   }
2437 
2438   uint8_t destination_connection_id_length =
2439       header->destination_connection_id_included == CONNECTION_ID_PRESENT
2440           ? (perspective_ == Perspective::IS_SERVER
2441                  ? expected_server_connection_id_length_
2442                  : expected_client_connection_id_length_)
2443           : 0;
2444   uint8_t source_connection_id_length =
2445       header->source_connection_id_included == CONNECTION_ID_PRESENT
2446           ? (perspective_ == Perspective::IS_CLIENT
2447                  ? expected_server_connection_id_length_
2448                  : expected_client_connection_id_length_)
2449           : 0;
2450   if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
2451     if (!ProcessAndValidateIetfConnectionIdLength(
2452             reader, header->version, perspective_,
2453             /*should_update_expected_server_connection_id_length=*/false,
2454             &expected_server_connection_id_length_,
2455             &destination_connection_id_length, &source_connection_id_length,
2456             &detailed_error_)) {
2457       return false;
2458     }
2459   }
2460 
2461   // Read connection ID.
2462   if (!reader->ReadConnectionId(&header->destination_connection_id,
2463                                 destination_connection_id_length)) {
2464     set_detailed_error("Unable to read destination connection ID.");
2465     return false;
2466   }
2467 
2468   if (!reader->ReadConnectionId(&header->source_connection_id,
2469                                 source_connection_id_length)) {
2470     set_detailed_error("Unable to read source connection ID.");
2471     return false;
2472   }
2473 
2474   if (header->source_connection_id_included == CONNECTION_ID_ABSENT) {
2475     if (!header->source_connection_id.IsEmpty()) {
2476       QUICHE_DCHECK(!version_.SupportsClientConnectionIds());
2477       set_detailed_error("Client connection ID not supported in this version.");
2478       return false;
2479     }
2480   }
2481 
2482   return ValidateReceivedConnectionIds(*header);
2483 }
2484 
ProcessAndCalculatePacketNumber(QuicDataReader * reader,QuicPacketNumberLength packet_number_length,QuicPacketNumber base_packet_number,uint64_t * packet_number)2485 bool QuicFramer::ProcessAndCalculatePacketNumber(
2486     QuicDataReader* reader, QuicPacketNumberLength packet_number_length,
2487     QuicPacketNumber base_packet_number, uint64_t* packet_number) {
2488   uint64_t wire_packet_number;
2489   if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) {
2490     return false;
2491   }
2492 
2493   // TODO(ianswett): Explore the usefulness of trying multiple packet numbers
2494   // in case the first guess is incorrect.
2495   *packet_number = CalculatePacketNumberFromWire(
2496       packet_number_length, base_packet_number, wire_packet_number);
2497   return true;
2498 }
2499 
ProcessFrameData(QuicDataReader * reader,const QuicPacketHeader & header)2500 bool QuicFramer::ProcessFrameData(QuicDataReader* reader,
2501                                   const QuicPacketHeader& header) {
2502   QUICHE_DCHECK(!VersionHasIetfQuicFrames(version_.transport_version))
2503       << "IETF QUIC Framing negotiated but attempting to process frames as "
2504          "non-IETF QUIC.";
2505   if (reader->IsDoneReading()) {
2506     set_detailed_error("Packet has no frames.");
2507     return RaiseError(QUIC_MISSING_PAYLOAD);
2508   }
2509   QUIC_DVLOG(2) << ENDPOINT << "Processing packet with header " << header;
2510   while (!reader->IsDoneReading()) {
2511     uint8_t frame_type;
2512     if (!reader->ReadBytes(&frame_type, 1)) {
2513       set_detailed_error("Unable to read frame type.");
2514       return RaiseError(QUIC_INVALID_FRAME_DATA);
2515     }
2516     if (frame_type & kQuicFrameTypeSpecialMask) {
2517       // Stream Frame
2518       if (frame_type & kQuicFrameTypeStreamMask) {
2519         QuicStreamFrame frame;
2520         if (!ProcessStreamFrame(reader, frame_type, &frame)) {
2521           return RaiseError(QUIC_INVALID_STREAM_DATA);
2522         }
2523         QUIC_DVLOG(2) << ENDPOINT << "Processing stream frame " << frame;
2524         if (!visitor_->OnStreamFrame(frame)) {
2525           QUIC_DVLOG(1) << ENDPOINT
2526                         << "Visitor asked to stop further processing.";
2527           // Returning true since there was no parsing error.
2528           return true;
2529         }
2530         continue;
2531       }
2532 
2533       // Ack Frame
2534       if (frame_type & kQuicFrameTypeAckMask) {
2535         if (!ProcessAckFrame(reader, frame_type)) {
2536           return RaiseError(QUIC_INVALID_ACK_DATA);
2537         }
2538         QUIC_DVLOG(2) << ENDPOINT << "Processing ACK frame";
2539         continue;
2540       }
2541 
2542       // This was a special frame type that did not match any
2543       // of the known ones. Error.
2544       set_detailed_error("Illegal frame type.");
2545       QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2546                          << static_cast<int>(frame_type);
2547       return RaiseError(QUIC_INVALID_FRAME_DATA);
2548     }
2549 
2550     switch (frame_type) {
2551       case PADDING_FRAME: {
2552         QuicPaddingFrame frame;
2553         ProcessPaddingFrame(reader, &frame);
2554         QUIC_DVLOG(2) << ENDPOINT << "Processing padding frame " << frame;
2555         if (!visitor_->OnPaddingFrame(frame)) {
2556           QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2557           // Returning true since there was no parsing error.
2558           return true;
2559         }
2560         continue;
2561       }
2562 
2563       case RST_STREAM_FRAME: {
2564         QuicRstStreamFrame frame;
2565         if (!ProcessRstStreamFrame(reader, &frame)) {
2566           return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2567         }
2568         QUIC_DVLOG(2) << ENDPOINT << "Processing reset stream frame " << frame;
2569         if (!visitor_->OnRstStreamFrame(frame)) {
2570           QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2571           // Returning true since there was no parsing error.
2572           return true;
2573         }
2574         continue;
2575       }
2576 
2577       case CONNECTION_CLOSE_FRAME: {
2578         QuicConnectionCloseFrame frame;
2579         if (!ProcessConnectionCloseFrame(reader, &frame)) {
2580           return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2581         }
2582 
2583         QUIC_DVLOG(2) << ENDPOINT << "Processing connection close frame "
2584                       << frame;
2585         if (!visitor_->OnConnectionCloseFrame(frame)) {
2586           QUIC_DVLOG(1) << ENDPOINT
2587                         << "Visitor asked to stop further processing.";
2588           // Returning true since there was no parsing error.
2589           return true;
2590         }
2591         continue;
2592       }
2593 
2594       case GOAWAY_FRAME: {
2595         QuicGoAwayFrame goaway_frame;
2596         if (!ProcessGoAwayFrame(reader, &goaway_frame)) {
2597           return RaiseError(QUIC_INVALID_GOAWAY_DATA);
2598         }
2599         QUIC_DVLOG(2) << ENDPOINT << "Processing go away frame "
2600                       << goaway_frame;
2601         if (!visitor_->OnGoAwayFrame(goaway_frame)) {
2602           QUIC_DVLOG(1) << ENDPOINT
2603                         << "Visitor asked to stop further processing.";
2604           // Returning true since there was no parsing error.
2605           return true;
2606         }
2607         continue;
2608       }
2609 
2610       case WINDOW_UPDATE_FRAME: {
2611         QuicWindowUpdateFrame window_update_frame;
2612         if (!ProcessWindowUpdateFrame(reader, &window_update_frame)) {
2613           return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
2614         }
2615         QUIC_DVLOG(2) << ENDPOINT << "Processing window update frame "
2616                       << window_update_frame;
2617         if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
2618           QUIC_DVLOG(1) << ENDPOINT
2619                         << "Visitor asked to stop further processing.";
2620           // Returning true since there was no parsing error.
2621           return true;
2622         }
2623         continue;
2624       }
2625 
2626       case BLOCKED_FRAME: {
2627         QuicBlockedFrame blocked_frame;
2628         if (!ProcessBlockedFrame(reader, &blocked_frame)) {
2629           return RaiseError(QUIC_INVALID_BLOCKED_DATA);
2630         }
2631         QUIC_DVLOG(2) << ENDPOINT << "Processing blocked frame "
2632                       << blocked_frame;
2633         if (!visitor_->OnBlockedFrame(blocked_frame)) {
2634           QUIC_DVLOG(1) << ENDPOINT
2635                         << "Visitor asked to stop further processing.";
2636           // Returning true since there was no parsing error.
2637           return true;
2638         }
2639         continue;
2640       }
2641 
2642       case STOP_WAITING_FRAME: {
2643         QuicStopWaitingFrame stop_waiting_frame;
2644         if (!ProcessStopWaitingFrame(reader, header, &stop_waiting_frame)) {
2645           return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
2646         }
2647         QUIC_DVLOG(2) << ENDPOINT << "Processing stop waiting frame "
2648                       << stop_waiting_frame;
2649         if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) {
2650           QUIC_DVLOG(1) << ENDPOINT
2651                         << "Visitor asked to stop further processing.";
2652           // Returning true since there was no parsing error.
2653           return true;
2654         }
2655         continue;
2656       }
2657       case PING_FRAME: {
2658         // Ping has no payload.
2659         QuicPingFrame ping_frame;
2660         if (!visitor_->OnPingFrame(ping_frame)) {
2661           QUIC_DVLOG(1) << ENDPOINT
2662                         << "Visitor asked to stop further processing.";
2663           // Returning true since there was no parsing error.
2664           return true;
2665         }
2666         QUIC_DVLOG(2) << ENDPOINT << "Processing ping frame " << ping_frame;
2667         continue;
2668       }
2669       case IETF_EXTENSION_MESSAGE_NO_LENGTH:
2670         ABSL_FALLTHROUGH_INTENDED;
2671       case IETF_EXTENSION_MESSAGE: {
2672         QuicMessageFrame message_frame;
2673         if (!ProcessMessageFrame(reader,
2674                                  frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
2675                                  &message_frame)) {
2676           return RaiseError(QUIC_INVALID_MESSAGE_DATA);
2677         }
2678         QUIC_DVLOG(2) << ENDPOINT << "Processing message frame "
2679                       << message_frame;
2680         if (!visitor_->OnMessageFrame(message_frame)) {
2681           QUIC_DVLOG(1) << ENDPOINT
2682                         << "Visitor asked to stop further processing.";
2683           // Returning true since there was no parsing error.
2684           return true;
2685         }
2686         break;
2687       }
2688       case CRYPTO_FRAME: {
2689         if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
2690           set_detailed_error("Illegal frame type.");
2691           return RaiseError(QUIC_INVALID_FRAME_DATA);
2692         }
2693         QuicCryptoFrame frame;
2694         if (!ProcessCryptoFrame(reader, GetEncryptionLevel(header), &frame)) {
2695           return RaiseError(QUIC_INVALID_FRAME_DATA);
2696         }
2697         QUIC_DVLOG(2) << ENDPOINT << "Processing crypto frame " << frame;
2698         if (!visitor_->OnCryptoFrame(frame)) {
2699           QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2700           // Returning true since there was no parsing error.
2701           return true;
2702         }
2703         break;
2704       }
2705       case HANDSHAKE_DONE_FRAME: {
2706         // HANDSHAKE_DONE has no payload.
2707         QuicHandshakeDoneFrame handshake_done_frame;
2708         QUIC_DVLOG(2) << ENDPOINT << "Processing handshake done frame "
2709                       << handshake_done_frame;
2710         if (!visitor_->OnHandshakeDoneFrame(handshake_done_frame)) {
2711           QUIC_DVLOG(1) << ENDPOINT
2712                         << "Visitor asked to stop further processing.";
2713           // Returning true since there was no parsing error.
2714           return true;
2715         }
2716         break;
2717       }
2718 
2719       default:
2720         set_detailed_error("Illegal frame type.");
2721         QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2722                            << static_cast<int>(frame_type);
2723         return RaiseError(QUIC_INVALID_FRAME_DATA);
2724     }
2725   }
2726 
2727   return true;
2728 }
2729 
2730 // static
IsIetfFrameTypeExpectedForEncryptionLevel(uint64_t frame_type,EncryptionLevel level)2731 bool QuicFramer::IsIetfFrameTypeExpectedForEncryptionLevel(
2732     uint64_t frame_type, EncryptionLevel level) {
2733   // IETF_CRYPTO is allowed for any level here and is separately checked in
2734   // QuicCryptoStream::OnCryptoFrame.
2735   switch (level) {
2736     case ENCRYPTION_INITIAL:
2737     case ENCRYPTION_HANDSHAKE:
2738       return frame_type == IETF_CRYPTO || frame_type == IETF_ACK ||
2739              frame_type == IETF_ACK_ECN ||
2740              frame_type == IETF_ACK_RECEIVE_TIMESTAMPS ||
2741              frame_type == IETF_PING || frame_type == IETF_PADDING ||
2742              frame_type == IETF_CONNECTION_CLOSE;
2743     case ENCRYPTION_ZERO_RTT:
2744       return !(frame_type == IETF_ACK || frame_type == IETF_ACK_ECN ||
2745                frame_type == IETF_ACK_RECEIVE_TIMESTAMPS ||
2746                frame_type == IETF_HANDSHAKE_DONE ||
2747                frame_type == IETF_NEW_TOKEN ||
2748                frame_type == IETF_PATH_RESPONSE ||
2749                frame_type == IETF_RETIRE_CONNECTION_ID);
2750     case ENCRYPTION_FORWARD_SECURE:
2751       return true;
2752     default:
2753       QUIC_BUG(quic_bug_10850_57) << "Unknown encryption level: " << level;
2754   }
2755   return false;
2756 }
2757 
ProcessIetfFrameData(QuicDataReader * reader,const QuicPacketHeader & header,EncryptionLevel decrypted_level)2758 bool QuicFramer::ProcessIetfFrameData(QuicDataReader* reader,
2759                                       const QuicPacketHeader& header,
2760                                       EncryptionLevel decrypted_level) {
2761   QUICHE_DCHECK(VersionHasIetfQuicFrames(version_.transport_version))
2762       << "Attempt to process frames as IETF frames but version ("
2763       << version_.transport_version << ") does not support IETF Framing.";
2764 
2765   if (reader->IsDoneReading()) {
2766     set_detailed_error("Packet has no frames.");
2767     return RaiseError(QUIC_MISSING_PAYLOAD);
2768   }
2769 
2770   QUIC_DVLOG(2) << ENDPOINT << "Processing IETF packet with header " << header;
2771   auto* connection_context = QuicConnectionContext::Current();
2772   while (!reader->IsDoneReading()) {
2773     if (connection_context != nullptr) {
2774       connection_context->process_packet_context.current_frame_offset =
2775           connection_context->process_packet_context.decrypted_payload.size() -
2776           reader->BytesRemaining();
2777     }
2778     uint64_t frame_type;
2779     // Will be the number of bytes into which frame_type was encoded.
2780     size_t encoded_bytes = reader->BytesRemaining();
2781     if (!reader->ReadVarInt62(&frame_type)) {
2782       set_detailed_error("Unable to read frame type.");
2783       return RaiseError(QUIC_INVALID_FRAME_DATA);
2784     }
2785     if (!IsIetfFrameTypeExpectedForEncryptionLevel(frame_type,
2786                                                    decrypted_level)) {
2787       set_detailed_error(absl::StrCat(
2788           "IETF frame type ",
2789           QuicIetfFrameTypeString(static_cast<QuicIetfFrameType>(frame_type)),
2790           " is unexpected at encryption level ",
2791           EncryptionLevelToString(decrypted_level)));
2792       return RaiseError(IETF_QUIC_PROTOCOL_VIOLATION);
2793     }
2794     previously_received_frame_type_ = current_received_frame_type_;
2795     current_received_frame_type_ = frame_type;
2796 
2797     // Is now the number of bytes into which the frame type was encoded.
2798     encoded_bytes -= reader->BytesRemaining();
2799 
2800     // Check that the frame type is minimally encoded.
2801     if (encoded_bytes !=
2802         static_cast<size_t>(QuicDataWriter::GetVarInt62Len(frame_type))) {
2803       // The frame type was not minimally encoded.
2804       set_detailed_error("Frame type not minimally encoded.");
2805       return RaiseError(IETF_QUIC_PROTOCOL_VIOLATION);
2806     }
2807 
2808     if (IS_IETF_STREAM_FRAME(frame_type)) {
2809       QuicStreamFrame frame;
2810       if (!ProcessIetfStreamFrame(reader, frame_type, &frame)) {
2811         return RaiseError(QUIC_INVALID_STREAM_DATA);
2812       }
2813       QUIC_DVLOG(2) << ENDPOINT << "Processing IETF stream frame " << frame;
2814       if (!visitor_->OnStreamFrame(frame)) {
2815         QUIC_DVLOG(1) << ENDPOINT
2816                       << "Visitor asked to stop further processing.";
2817         // Returning true since there was no parsing error.
2818         return true;
2819       }
2820     } else {
2821       switch (frame_type) {
2822         case IETF_PADDING: {
2823           QuicPaddingFrame frame;
2824           ProcessPaddingFrame(reader, &frame);
2825           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF padding frame "
2826                         << frame;
2827           if (!visitor_->OnPaddingFrame(frame)) {
2828             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2829             // Returning true since there was no parsing error.
2830             return true;
2831           }
2832           break;
2833         }
2834         case IETF_RST_STREAM: {
2835           QuicRstStreamFrame frame;
2836           if (!ProcessIetfResetStreamFrame(reader, &frame)) {
2837             return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2838           }
2839           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF reset stream frame "
2840                         << frame;
2841           if (!visitor_->OnRstStreamFrame(frame)) {
2842             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2843             // Returning true since there was no parsing error.
2844             return true;
2845           }
2846           break;
2847         }
2848         case IETF_APPLICATION_CLOSE:
2849         case IETF_CONNECTION_CLOSE: {
2850           QuicConnectionCloseFrame frame;
2851           if (!ProcessIetfConnectionCloseFrame(
2852                   reader,
2853                   (frame_type == IETF_CONNECTION_CLOSE)
2854                       ? IETF_QUIC_TRANSPORT_CONNECTION_CLOSE
2855                       : IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
2856                   &frame)) {
2857             return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2858           }
2859           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF connection close frame "
2860                         << frame;
2861           if (!visitor_->OnConnectionCloseFrame(frame)) {
2862             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2863             // Returning true since there was no parsing error.
2864             return true;
2865           }
2866           break;
2867         }
2868         case IETF_MAX_DATA: {
2869           QuicWindowUpdateFrame frame;
2870           if (!ProcessMaxDataFrame(reader, &frame)) {
2871             return RaiseError(QUIC_INVALID_MAX_DATA_FRAME_DATA);
2872           }
2873           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF max data frame "
2874                         << frame;
2875           if (!visitor_->OnWindowUpdateFrame(frame)) {
2876             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2877             // Returning true since there was no parsing error.
2878             return true;
2879           }
2880           break;
2881         }
2882         case IETF_MAX_STREAM_DATA: {
2883           QuicWindowUpdateFrame frame;
2884           if (!ProcessMaxStreamDataFrame(reader, &frame)) {
2885             return RaiseError(QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
2886           }
2887           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF max stream data frame "
2888                         << frame;
2889           if (!visitor_->OnWindowUpdateFrame(frame)) {
2890             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2891             // Returning true since there was no parsing error.
2892             return true;
2893           }
2894           break;
2895         }
2896         case IETF_MAX_STREAMS_BIDIRECTIONAL:
2897         case IETF_MAX_STREAMS_UNIDIRECTIONAL: {
2898           QuicMaxStreamsFrame frame;
2899           if (!ProcessMaxStreamsFrame(reader, &frame, frame_type)) {
2900             return RaiseError(QUIC_MAX_STREAMS_DATA);
2901           }
2902           QUIC_CODE_COUNT_N(quic_max_streams_received, 1, 2);
2903           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF max streams frame "
2904                         << frame;
2905           if (!visitor_->OnMaxStreamsFrame(frame)) {
2906             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2907             // Returning true since there was no parsing error.
2908             return true;
2909           }
2910           break;
2911         }
2912         case IETF_PING: {
2913           // Ping has no payload.
2914           QuicPingFrame ping_frame;
2915           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF ping frame "
2916                         << ping_frame;
2917           if (!visitor_->OnPingFrame(ping_frame)) {
2918             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2919             // Returning true since there was no parsing error.
2920             return true;
2921           }
2922           break;
2923         }
2924         case IETF_DATA_BLOCKED: {
2925           QuicBlockedFrame frame;
2926           if (!ProcessDataBlockedFrame(reader, &frame)) {
2927             return RaiseError(QUIC_INVALID_BLOCKED_DATA);
2928           }
2929           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF blocked frame "
2930                         << frame;
2931           if (!visitor_->OnBlockedFrame(frame)) {
2932             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2933             // Returning true since there was no parsing error.
2934             return true;
2935           }
2936           break;
2937         }
2938         case IETF_STREAM_DATA_BLOCKED: {
2939           QuicBlockedFrame frame;
2940           if (!ProcessStreamDataBlockedFrame(reader, &frame)) {
2941             return RaiseError(QUIC_INVALID_STREAM_BLOCKED_DATA);
2942           }
2943           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF stream blocked frame "
2944                         << frame;
2945           if (!visitor_->OnBlockedFrame(frame)) {
2946             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2947             // Returning true since there was no parsing error.
2948             return true;
2949           }
2950           break;
2951         }
2952         case IETF_STREAMS_BLOCKED_UNIDIRECTIONAL:
2953         case IETF_STREAMS_BLOCKED_BIDIRECTIONAL: {
2954           QuicStreamsBlockedFrame frame;
2955           if (!ProcessStreamsBlockedFrame(reader, &frame, frame_type)) {
2956             return RaiseError(QUIC_STREAMS_BLOCKED_DATA);
2957           }
2958           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF streams blocked frame "
2959                         << frame;
2960           if (!visitor_->OnStreamsBlockedFrame(frame)) {
2961             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2962             // Returning true since there was no parsing error.
2963             return true;
2964           }
2965           break;
2966         }
2967         case IETF_NEW_CONNECTION_ID: {
2968           QuicNewConnectionIdFrame frame;
2969           if (!ProcessNewConnectionIdFrame(reader, &frame)) {
2970             return RaiseError(QUIC_INVALID_NEW_CONNECTION_ID_DATA);
2971           }
2972           QUIC_DVLOG(2) << ENDPOINT
2973                         << "Processing IETF new connection ID frame " << frame;
2974           if (!visitor_->OnNewConnectionIdFrame(frame)) {
2975             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2976             // Returning true since there was no parsing error.
2977             return true;
2978           }
2979           break;
2980         }
2981         case IETF_RETIRE_CONNECTION_ID: {
2982           QuicRetireConnectionIdFrame frame;
2983           if (!ProcessRetireConnectionIdFrame(reader, &frame)) {
2984             return RaiseError(QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
2985           }
2986           QUIC_DVLOG(2) << ENDPOINT
2987                         << "Processing IETF retire connection ID frame "
2988                         << frame;
2989           if (!visitor_->OnRetireConnectionIdFrame(frame)) {
2990             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2991             // Returning true since there was no parsing error.
2992             return true;
2993           }
2994           break;
2995         }
2996         case IETF_NEW_TOKEN: {
2997           QuicNewTokenFrame frame;
2998           if (!ProcessNewTokenFrame(reader, &frame)) {
2999             return RaiseError(QUIC_INVALID_NEW_TOKEN);
3000           }
3001           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF new token frame "
3002                         << frame;
3003           if (!visitor_->OnNewTokenFrame(frame)) {
3004             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3005             // Returning true since there was no parsing error.
3006             return true;
3007           }
3008           break;
3009         }
3010         case IETF_STOP_SENDING: {
3011           QuicStopSendingFrame frame;
3012           if (!ProcessStopSendingFrame(reader, &frame)) {
3013             return RaiseError(QUIC_INVALID_STOP_SENDING_FRAME_DATA);
3014           }
3015           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF stop sending frame "
3016                         << frame;
3017           if (!visitor_->OnStopSendingFrame(frame)) {
3018             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3019             // Returning true since there was no parsing error.
3020             return true;
3021           }
3022           break;
3023         }
3024         case IETF_ACK_RECEIVE_TIMESTAMPS:
3025           if (!process_timestamps_) {
3026             set_detailed_error("Unsupported frame type.");
3027             QUIC_DLOG(WARNING)
3028                 << ENDPOINT << "IETF_ACK_RECEIVE_TIMESTAMPS not supported";
3029             return RaiseError(QUIC_INVALID_FRAME_DATA);
3030           }
3031           ABSL_FALLTHROUGH_INTENDED;
3032         case IETF_ACK_ECN:
3033         case IETF_ACK: {
3034           QuicAckFrame frame;
3035           if (!ProcessIetfAckFrame(reader, frame_type, &frame)) {
3036             return RaiseError(QUIC_INVALID_ACK_DATA);
3037           }
3038           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF ACK frame " << frame;
3039           break;
3040         }
3041         case IETF_PATH_CHALLENGE: {
3042           QuicPathChallengeFrame frame;
3043           if (!ProcessPathChallengeFrame(reader, &frame)) {
3044             return RaiseError(QUIC_INVALID_PATH_CHALLENGE_DATA);
3045           }
3046           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF path challenge frame "
3047                         << frame;
3048           if (!visitor_->OnPathChallengeFrame(frame)) {
3049             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3050             // Returning true since there was no parsing error.
3051             return true;
3052           }
3053           break;
3054         }
3055         case IETF_PATH_RESPONSE: {
3056           QuicPathResponseFrame frame;
3057           if (!ProcessPathResponseFrame(reader, &frame)) {
3058             return RaiseError(QUIC_INVALID_PATH_RESPONSE_DATA);
3059           }
3060           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF path response frame "
3061                         << frame;
3062           if (!visitor_->OnPathResponseFrame(frame)) {
3063             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3064             // Returning true since there was no parsing error.
3065             return true;
3066           }
3067           break;
3068         }
3069         case IETF_EXTENSION_MESSAGE_NO_LENGTH_V99:
3070           ABSL_FALLTHROUGH_INTENDED;
3071         case IETF_EXTENSION_MESSAGE_V99: {
3072           QuicMessageFrame message_frame;
3073           if (!ProcessMessageFrame(
3074                   reader, frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH_V99,
3075                   &message_frame)) {
3076             return RaiseError(QUIC_INVALID_MESSAGE_DATA);
3077           }
3078           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF message frame "
3079                         << message_frame;
3080           if (!visitor_->OnMessageFrame(message_frame)) {
3081             QUIC_DVLOG(1) << ENDPOINT
3082                           << "Visitor asked to stop further processing.";
3083             // Returning true since there was no parsing error.
3084             return true;
3085           }
3086           break;
3087         }
3088         case IETF_CRYPTO: {
3089           QuicCryptoFrame frame;
3090           if (!ProcessCryptoFrame(reader, GetEncryptionLevel(header), &frame)) {
3091             return RaiseError(QUIC_INVALID_FRAME_DATA);
3092           }
3093           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF crypto frame " << frame;
3094           if (!visitor_->OnCryptoFrame(frame)) {
3095             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3096             // Returning true since there was no parsing error.
3097             return true;
3098           }
3099           break;
3100         }
3101         case IETF_HANDSHAKE_DONE: {
3102           // HANDSHAKE_DONE has no payload.
3103           QuicHandshakeDoneFrame handshake_done_frame;
3104           if (!visitor_->OnHandshakeDoneFrame(handshake_done_frame)) {
3105             QUIC_DVLOG(1) << ENDPOINT
3106                           << "Visitor asked to stop further processing.";
3107             // Returning true since there was no parsing error.
3108             return true;
3109           }
3110           QUIC_DVLOG(2) << ENDPOINT << "Processing handshake done frame "
3111                         << handshake_done_frame;
3112           break;
3113         }
3114         case IETF_ACK_FREQUENCY: {
3115           QuicAckFrequencyFrame frame;
3116           if (!ProcessAckFrequencyFrame(reader, &frame)) {
3117             return RaiseError(QUIC_INVALID_FRAME_DATA);
3118           }
3119           QUIC_DVLOG(2) << ENDPOINT << "Processing IETF ack frequency frame "
3120                         << frame;
3121           if (!visitor_->OnAckFrequencyFrame(frame)) {
3122             QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3123             // Returning true since there was no parsing error.
3124             return true;
3125           }
3126           break;
3127         }
3128         default:
3129           set_detailed_error("Illegal frame type.");
3130           QUIC_DLOG(WARNING)
3131               << ENDPOINT
3132               << "Illegal frame type: " << static_cast<int>(frame_type);
3133           return RaiseError(QUIC_INVALID_FRAME_DATA);
3134       }
3135     }
3136   }
3137   return true;
3138 }
3139 
3140 namespace {
3141 // Create a mask that sets the last |num_bits| to 1 and the rest to 0.
GetMaskFromNumBits(uint8_t num_bits)3142 inline uint8_t GetMaskFromNumBits(uint8_t num_bits) {
3143   return (1u << num_bits) - 1;
3144 }
3145 
3146 // Extract |num_bits| from |flags| offset by |offset|.
ExtractBits(uint8_t flags,uint8_t num_bits,uint8_t offset)3147 uint8_t ExtractBits(uint8_t flags, uint8_t num_bits, uint8_t offset) {
3148   return (flags >> offset) & GetMaskFromNumBits(num_bits);
3149 }
3150 
3151 // Extract the bit at position |offset| from |flags| as a bool.
ExtractBit(uint8_t flags,uint8_t offset)3152 bool ExtractBit(uint8_t flags, uint8_t offset) {
3153   return ((flags >> offset) & GetMaskFromNumBits(1)) != 0;
3154 }
3155 
3156 // Set |num_bits|, offset by |offset| to |val| in |flags|.
SetBits(uint8_t * flags,uint8_t val,uint8_t num_bits,uint8_t offset)3157 void SetBits(uint8_t* flags, uint8_t val, uint8_t num_bits, uint8_t offset) {
3158   QUICHE_DCHECK_LE(val, GetMaskFromNumBits(num_bits));
3159   *flags |= val << offset;
3160 }
3161 
3162 // Set the bit at position |offset| to |val| in |flags|.
SetBit(uint8_t * flags,bool val,uint8_t offset)3163 void SetBit(uint8_t* flags, bool val, uint8_t offset) {
3164   SetBits(flags, val ? 1 : 0, 1, offset);
3165 }
3166 }  // namespace
3167 
ProcessStreamFrame(QuicDataReader * reader,uint8_t frame_type,QuicStreamFrame * frame)3168 bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader, uint8_t frame_type,
3169                                     QuicStreamFrame* frame) {
3170   uint8_t stream_flags = frame_type;
3171 
3172   uint8_t stream_id_length = 0;
3173   uint8_t offset_length = 4;
3174   bool has_data_length = true;
3175   stream_flags &= ~kQuicFrameTypeStreamMask;
3176 
3177   // Read from right to left: StreamID, Offset, Data Length, Fin.
3178   stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1;
3179   stream_flags >>= kQuicStreamIdShift;
3180 
3181   offset_length = (stream_flags & kQuicStreamOffsetMask);
3182   // There is no encoding for 1 byte, only 0 and 2 through 8.
3183   if (offset_length > 0) {
3184     offset_length += 1;
3185   }
3186   stream_flags >>= kQuicStreamShift;
3187 
3188   has_data_length =
3189       (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask;
3190   stream_flags >>= kQuicStreamDataLengthShift;
3191 
3192   frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
3193 
3194   uint64_t stream_id;
3195   if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) {
3196     set_detailed_error("Unable to read stream_id.");
3197     return false;
3198   }
3199   frame->stream_id = static_cast<QuicStreamId>(stream_id);
3200 
3201   if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) {
3202     set_detailed_error("Unable to read offset.");
3203     return false;
3204   }
3205 
3206   // TODO(ianswett): Don't use absl::string_view as an intermediary.
3207   absl::string_view data;
3208   if (has_data_length) {
3209     if (!reader->ReadStringPiece16(&data)) {
3210       set_detailed_error("Unable to read frame data.");
3211       return false;
3212     }
3213   } else {
3214     if (!reader->ReadStringPiece(&data, reader->BytesRemaining())) {
3215       set_detailed_error("Unable to read frame data.");
3216       return false;
3217     }
3218   }
3219   frame->data_buffer = data.data();
3220   frame->data_length = static_cast<uint16_t>(data.length());
3221 
3222   return true;
3223 }
3224 
ProcessIetfStreamFrame(QuicDataReader * reader,uint8_t frame_type,QuicStreamFrame * frame)3225 bool QuicFramer::ProcessIetfStreamFrame(QuicDataReader* reader,
3226                                         uint8_t frame_type,
3227                                         QuicStreamFrame* frame) {
3228   // Read stream id from the frame. It's always present.
3229   if (!ReadUint32FromVarint62(reader, IETF_STREAM, &frame->stream_id)) {
3230     return false;
3231   }
3232 
3233   // If we have a data offset, read it. If not, set to 0.
3234   if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
3235     if (!reader->ReadVarInt62(&frame->offset)) {
3236       set_detailed_error("Unable to read stream data offset.");
3237       return false;
3238     }
3239   } else {
3240     // no offset in the frame, ensure it's 0 in the Frame.
3241     frame->offset = 0;
3242   }
3243 
3244   // If we have a data length, read it. If not, set to 0.
3245   if (frame_type & IETF_STREAM_FRAME_LEN_BIT) {
3246     uint64_t length;
3247     if (!reader->ReadVarInt62(&length)) {
3248       set_detailed_error("Unable to read stream data length.");
3249       return false;
3250     }
3251     if (length > std::numeric_limits<decltype(frame->data_length)>::max()) {
3252       set_detailed_error("Stream data length is too large.");
3253       return false;
3254     }
3255     frame->data_length = length;
3256   } else {
3257     // no length in the frame, it is the number of bytes remaining in the
3258     // packet.
3259     frame->data_length = reader->BytesRemaining();
3260   }
3261 
3262   if (frame_type & IETF_STREAM_FRAME_FIN_BIT) {
3263     frame->fin = true;
3264   } else {
3265     frame->fin = false;
3266   }
3267 
3268   // TODO(ianswett): Don't use absl::string_view as an intermediary.
3269   absl::string_view data;
3270   if (!reader->ReadStringPiece(&data, frame->data_length)) {
3271     set_detailed_error("Unable to read frame data.");
3272     return false;
3273   }
3274   frame->data_buffer = data.data();
3275   QUICHE_DCHECK_EQ(frame->data_length, data.length());
3276 
3277   return true;
3278 }
3279 
ProcessCryptoFrame(QuicDataReader * reader,EncryptionLevel encryption_level,QuicCryptoFrame * frame)3280 bool QuicFramer::ProcessCryptoFrame(QuicDataReader* reader,
3281                                     EncryptionLevel encryption_level,
3282                                     QuicCryptoFrame* frame) {
3283   frame->level = encryption_level;
3284   if (!reader->ReadVarInt62(&frame->offset)) {
3285     set_detailed_error("Unable to read crypto data offset.");
3286     return false;
3287   }
3288   uint64_t len;
3289   if (!reader->ReadVarInt62(&len) ||
3290       len > std::numeric_limits<QuicPacketLength>::max()) {
3291     set_detailed_error("Invalid data length.");
3292     return false;
3293   }
3294   frame->data_length = len;
3295 
3296   // TODO(ianswett): Don't use absl::string_view as an intermediary.
3297   absl::string_view data;
3298   if (!reader->ReadStringPiece(&data, frame->data_length)) {
3299     set_detailed_error("Unable to read frame data.");
3300     return false;
3301   }
3302   frame->data_buffer = data.data();
3303   return true;
3304 }
3305 
ProcessAckFrequencyFrame(QuicDataReader * reader,QuicAckFrequencyFrame * frame)3306 bool QuicFramer::ProcessAckFrequencyFrame(QuicDataReader* reader,
3307                                           QuicAckFrequencyFrame* frame) {
3308   if (!reader->ReadVarInt62(&frame->sequence_number)) {
3309     set_detailed_error("Unable to read sequence number.");
3310     return false;
3311   }
3312 
3313   if (!reader->ReadVarInt62(&frame->packet_tolerance)) {
3314     set_detailed_error("Unable to read packet tolerance.");
3315     return false;
3316   }
3317   if (frame->packet_tolerance == 0) {
3318     set_detailed_error("Invalid packet tolerance.");
3319     return false;
3320   }
3321   uint64_t max_ack_delay_us;
3322   if (!reader->ReadVarInt62(&max_ack_delay_us)) {
3323     set_detailed_error("Unable to read max_ack_delay_us.");
3324     return false;
3325   }
3326   constexpr uint64_t kMaxAckDelayUsBound = 1u << 24;
3327   if (max_ack_delay_us > kMaxAckDelayUsBound) {
3328     set_detailed_error("Invalid max_ack_delay_us.");
3329     return false;
3330   }
3331   frame->max_ack_delay = QuicTime::Delta::FromMicroseconds(max_ack_delay_us);
3332 
3333   uint8_t ignore_order;
3334   if (!reader->ReadUInt8(&ignore_order)) {
3335     set_detailed_error("Unable to read ignore_order.");
3336     return false;
3337   }
3338   if (ignore_order > 1) {
3339     set_detailed_error("Invalid ignore_order.");
3340     return false;
3341   }
3342   frame->ignore_order = ignore_order;
3343 
3344   return true;
3345 }
3346 
ProcessAckFrame(QuicDataReader * reader,uint8_t frame_type)3347 bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type) {
3348   const bool has_ack_blocks =
3349       ExtractBit(frame_type, kQuicHasMultipleAckBlocksOffset);
3350   uint8_t num_ack_blocks = 0;
3351   uint8_t num_received_packets = 0;
3352 
3353   // Determine the two lengths from the frame type: largest acked length,
3354   // ack block length.
3355   const QuicPacketNumberLength ack_block_length =
3356       ReadAckPacketNumberLength(ExtractBits(
3357           frame_type, kQuicSequenceNumberLengthNumBits, kActBlockLengthOffset));
3358   const QuicPacketNumberLength largest_acked_length =
3359       ReadAckPacketNumberLength(ExtractBits(
3360           frame_type, kQuicSequenceNumberLengthNumBits, kLargestAckedOffset));
3361 
3362   uint64_t largest_acked;
3363   if (!reader->ReadBytesToUInt64(largest_acked_length, &largest_acked)) {
3364     set_detailed_error("Unable to read largest acked.");
3365     return false;
3366   }
3367 
3368   if (largest_acked < first_sending_packet_number_.ToUint64()) {
3369     // Connection always sends packet starting from kFirstSendingPacketNumber >
3370     // 0, peer has observed an unsent packet.
3371     set_detailed_error("Largest acked is 0.");
3372     return false;
3373   }
3374 
3375   uint64_t ack_delay_time_us;
3376   if (!reader->ReadUFloat16(&ack_delay_time_us)) {
3377     set_detailed_error("Unable to read ack delay time.");
3378     return false;
3379   }
3380 
3381   if (!visitor_->OnAckFrameStart(
3382           QuicPacketNumber(largest_acked),
3383           ack_delay_time_us == kUFloat16MaxValue
3384               ? QuicTime::Delta::Infinite()
3385               : QuicTime::Delta::FromMicroseconds(ack_delay_time_us))) {
3386     // The visitor suppresses further processing of the packet. Although this is
3387     // not a parsing error, returns false as this is in middle of processing an
3388     // ack frame,
3389     set_detailed_error("Visitor suppresses further processing of ack frame.");
3390     return false;
3391   }
3392 
3393   if (has_ack_blocks && !reader->ReadUInt8(&num_ack_blocks)) {
3394     set_detailed_error("Unable to read num of ack blocks.");
3395     return false;
3396   }
3397 
3398   uint64_t first_block_length;
3399   if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) {
3400     set_detailed_error("Unable to read first ack block length.");
3401     return false;
3402   }
3403 
3404   if (first_block_length == 0) {
3405     set_detailed_error("First block length is zero.");
3406     return false;
3407   }
3408   bool first_ack_block_underflow = first_block_length > largest_acked + 1;
3409   if (first_block_length + first_sending_packet_number_.ToUint64() >
3410       largest_acked + 1) {
3411     first_ack_block_underflow = true;
3412   }
3413   if (first_ack_block_underflow) {
3414     set_detailed_error(absl::StrCat("Underflow with first ack block length ",
3415                                     first_block_length, " largest acked is ",
3416                                     largest_acked, ".")
3417                            .c_str());
3418     return false;
3419   }
3420 
3421   uint64_t first_received = largest_acked + 1 - first_block_length;
3422   if (!visitor_->OnAckRange(QuicPacketNumber(first_received),
3423                             QuicPacketNumber(largest_acked + 1))) {
3424     // The visitor suppresses further processing of the packet. Although
3425     // this is not a parsing error, returns false as this is in middle
3426     // of processing an ack frame,
3427     set_detailed_error("Visitor suppresses further processing of ack frame.");
3428     return false;
3429   }
3430 
3431   if (num_ack_blocks > 0) {
3432     for (size_t i = 0; i < num_ack_blocks; ++i) {
3433       uint8_t gap = 0;
3434       if (!reader->ReadUInt8(&gap)) {
3435         set_detailed_error("Unable to read gap to next ack block.");
3436         return false;
3437       }
3438       uint64_t current_block_length;
3439       if (!reader->ReadBytesToUInt64(ack_block_length, &current_block_length)) {
3440         set_detailed_error("Unable to ack block length.");
3441         return false;
3442       }
3443       bool ack_block_underflow = first_received < gap + current_block_length;
3444       if (first_received < gap + current_block_length +
3445                                first_sending_packet_number_.ToUint64()) {
3446         ack_block_underflow = true;
3447       }
3448       if (ack_block_underflow) {
3449         set_detailed_error(absl::StrCat("Underflow with ack block length ",
3450                                         current_block_length,
3451                                         ", end of block is ",
3452                                         first_received - gap, ".")
3453                                .c_str());
3454         return false;
3455       }
3456 
3457       first_received -= (gap + current_block_length);
3458       if (current_block_length > 0) {
3459         if (!visitor_->OnAckRange(
3460                 QuicPacketNumber(first_received),
3461                 QuicPacketNumber(first_received) + current_block_length)) {
3462           // The visitor suppresses further processing of the packet. Although
3463           // this is not a parsing error, returns false as this is in middle
3464           // of processing an ack frame,
3465           set_detailed_error(
3466               "Visitor suppresses further processing of ack frame.");
3467           return false;
3468         }
3469       }
3470     }
3471   }
3472 
3473   if (!reader->ReadUInt8(&num_received_packets)) {
3474     set_detailed_error("Unable to read num received packets.");
3475     return false;
3476   }
3477 
3478   if (!ProcessTimestampsInAckFrame(num_received_packets,
3479                                    QuicPacketNumber(largest_acked), reader)) {
3480     return false;
3481   }
3482 
3483   // Done processing the ACK frame.
3484   std::optional<QuicEcnCounts> ecn_counts = std::nullopt;
3485   if (!visitor_->OnAckFrameEnd(QuicPacketNumber(first_received), ecn_counts)) {
3486     set_detailed_error(
3487         "Error occurs when visitor finishes processing the ACK frame.");
3488     return false;
3489   }
3490 
3491   return true;
3492 }
3493 
ProcessTimestampsInAckFrame(uint8_t num_received_packets,QuicPacketNumber largest_acked,QuicDataReader * reader)3494 bool QuicFramer::ProcessTimestampsInAckFrame(uint8_t num_received_packets,
3495                                              QuicPacketNumber largest_acked,
3496                                              QuicDataReader* reader) {
3497   if (num_received_packets == 0) {
3498     return true;
3499   }
3500   uint8_t delta_from_largest_observed;
3501   if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3502     set_detailed_error("Unable to read sequence delta in received packets.");
3503     return false;
3504   }
3505 
3506   if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3507     set_detailed_error(
3508         absl::StrCat("delta_from_largest_observed too high: ",
3509                      delta_from_largest_observed,
3510                      ", largest_acked: ", largest_acked.ToUint64())
3511             .c_str());
3512     return false;
3513   }
3514 
3515   // Time delta from the framer creation.
3516   uint32_t time_delta_us;
3517   if (!reader->ReadUInt32(&time_delta_us)) {
3518     set_detailed_error("Unable to read time delta in received packets.");
3519     return false;
3520   }
3521 
3522   QuicPacketNumber seq_num = largest_acked - delta_from_largest_observed;
3523   if (process_timestamps_) {
3524     last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
3525 
3526     visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3527   }
3528 
3529   for (uint8_t i = 1; i < num_received_packets; ++i) {
3530     if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3531       set_detailed_error("Unable to read sequence delta in received packets.");
3532       return false;
3533     }
3534     if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3535       set_detailed_error(
3536           absl::StrCat("delta_from_largest_observed too high: ",
3537                        delta_from_largest_observed,
3538                        ", largest_acked: ", largest_acked.ToUint64())
3539               .c_str());
3540       return false;
3541     }
3542     seq_num = largest_acked - delta_from_largest_observed;
3543 
3544     // Time delta from the previous timestamp.
3545     uint64_t incremental_time_delta_us;
3546     if (!reader->ReadUFloat16(&incremental_time_delta_us)) {
3547       set_detailed_error(
3548           "Unable to read incremental time delta in received packets.");
3549       return false;
3550     }
3551 
3552     if (process_timestamps_) {
3553       last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds(
3554                                               incremental_time_delta_us);
3555       visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3556     }
3557   }
3558   return true;
3559 }
3560 
ProcessIetfAckFrame(QuicDataReader * reader,uint64_t frame_type,QuicAckFrame * ack_frame)3561 bool QuicFramer::ProcessIetfAckFrame(QuicDataReader* reader,
3562                                      uint64_t frame_type,
3563                                      QuicAckFrame* ack_frame) {
3564   uint64_t largest_acked;
3565   if (!reader->ReadVarInt62(&largest_acked)) {
3566     set_detailed_error("Unable to read largest acked.");
3567     return false;
3568   }
3569   if (largest_acked < first_sending_packet_number_.ToUint64()) {
3570     // Connection always sends packet starting from kFirstSendingPacketNumber >
3571     // 0, peer has observed an unsent packet.
3572     set_detailed_error("Largest acked is 0.");
3573     return false;
3574   }
3575   ack_frame->largest_acked = static_cast<QuicPacketNumber>(largest_acked);
3576   uint64_t ack_delay_time_in_us;
3577   if (!reader->ReadVarInt62(&ack_delay_time_in_us)) {
3578     set_detailed_error("Unable to read ack delay time.");
3579     return false;
3580   }
3581 
3582   if (ack_delay_time_in_us >=
3583       (quiche::kVarInt62MaxValue >> peer_ack_delay_exponent_)) {
3584     ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
3585   } else {
3586     ack_delay_time_in_us = (ack_delay_time_in_us << peer_ack_delay_exponent_);
3587     ack_frame->ack_delay_time =
3588         QuicTime::Delta::FromMicroseconds(ack_delay_time_in_us);
3589   }
3590   if (!visitor_->OnAckFrameStart(QuicPacketNumber(largest_acked),
3591                                  ack_frame->ack_delay_time)) {
3592     // The visitor suppresses further processing of the packet. Although this is
3593     // not a parsing error, returns false as this is in middle of processing an
3594     // ACK frame.
3595     set_detailed_error("Visitor suppresses further processing of ACK frame.");
3596     return false;
3597   }
3598 
3599   // Get number of ACK blocks from the packet.
3600   uint64_t ack_block_count;
3601   if (!reader->ReadVarInt62(&ack_block_count)) {
3602     set_detailed_error("Unable to read ack block count.");
3603     return false;
3604   }
3605   // There always is a first ACK block, which is the (number of packets being
3606   // acked)-1, up to and including the packet at largest_acked. Therefore if the
3607   // value is 0, then only largest is acked. If it is 1, then largest-1,
3608   // largest] are acked, etc
3609   uint64_t ack_block_value;
3610   if (!reader->ReadVarInt62(&ack_block_value)) {
3611     set_detailed_error("Unable to read first ack block length.");
3612     return false;
3613   }
3614   // Calculate the packets being acked in the first block.
3615   //  +1 because AddRange implementation requires [low,high)
3616   uint64_t block_high = largest_acked + 1;
3617   uint64_t block_low = largest_acked - ack_block_value;
3618 
3619   // ack_block_value is the number of packets preceding the
3620   // largest_acked packet which are in the block being acked. Thus,
3621   // its maximum value is largest_acked-1. Test this, reporting an
3622   // error if the value is wrong.
3623   if (ack_block_value + first_sending_packet_number_.ToUint64() >
3624       largest_acked) {
3625     set_detailed_error(absl::StrCat("Underflow with first ack block length ",
3626                                     ack_block_value + 1, " largest acked is ",
3627                                     largest_acked, ".")
3628                            .c_str());
3629     return false;
3630   }
3631 
3632   if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3633                             QuicPacketNumber(block_high))) {
3634     // The visitor suppresses further processing of the packet. Although
3635     // this is not a parsing error, returns false as this is in middle
3636     // of processing an ACK frame.
3637     set_detailed_error("Visitor suppresses further processing of ACK frame.");
3638     return false;
3639   }
3640 
3641   while (ack_block_count != 0) {
3642     uint64_t gap_block_value;
3643     // Get the sizes of the gap and ack blocks,
3644     if (!reader->ReadVarInt62(&gap_block_value)) {
3645       set_detailed_error("Unable to read gap block value.");
3646       return false;
3647     }
3648     // It's an error if the gap is larger than the space from packet
3649     // number 0 to the start of the block that's just been acked, PLUS
3650     // there must be space for at least 1 packet to be acked. For
3651     // example, if block_low is 10 and gap_block_value is 9, it means
3652     // the gap block is 10 packets long, leaving no room for a packet
3653     // to be acked. Thus, gap_block_value+2 can not be larger than
3654     // block_low.
3655     // The test is written this way to detect wrap-arounds.
3656     if ((gap_block_value + 2) > block_low) {
3657       set_detailed_error(
3658           absl::StrCat("Underflow with gap block length ", gap_block_value + 1,
3659                        " previous ack block start is ", block_low, ".")
3660               .c_str());
3661       return false;
3662     }
3663 
3664     // Adjust block_high to be the top of the next ack block.
3665     // There is a gap of |gap_block_value| packets between the bottom
3666     // of ack block N and top of block N+1.  Note that gap_block_value
3667     // is he size of the gap minus 1 (per the QUIC protocol), and
3668     // block_high is the packet number of the first packet of the gap
3669     // (per the implementation of OnAckRange/AddAckRange, below).
3670     block_high = block_low - 1 - gap_block_value;
3671 
3672     if (!reader->ReadVarInt62(&ack_block_value)) {
3673       set_detailed_error("Unable to read ack block value.");
3674       return false;
3675     }
3676     if (ack_block_value + first_sending_packet_number_.ToUint64() >
3677         (block_high - 1)) {
3678       set_detailed_error(
3679           absl::StrCat("Underflow with ack block length ", ack_block_value + 1,
3680                        " latest ack block end is ", block_high - 1, ".")
3681               .c_str());
3682       return false;
3683     }
3684     // Calculate the low end of the new nth ack block. The +1 is
3685     // because the encoded value is the blocksize-1.
3686     block_low = block_high - 1 - ack_block_value;
3687     if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3688                               QuicPacketNumber(block_high))) {
3689       // The visitor suppresses further processing of the packet. Although
3690       // this is not a parsing error, returns false as this is in middle
3691       // of processing an ACK frame.
3692       set_detailed_error("Visitor suppresses further processing of ACK frame.");
3693       return false;
3694     }
3695 
3696     // Another one done.
3697     ack_block_count--;
3698   }
3699 
3700   QUICHE_DCHECK(!ack_frame->ecn_counters.has_value());
3701   if (frame_type == IETF_ACK_RECEIVE_TIMESTAMPS) {
3702     QUICHE_DCHECK(process_timestamps_);
3703     if (!ProcessIetfTimestampsInAckFrame(ack_frame->largest_acked, reader)) {
3704       return false;
3705     }
3706   } else if (frame_type == IETF_ACK_ECN) {
3707     ack_frame->ecn_counters = QuicEcnCounts();
3708     if (!reader->ReadVarInt62(&ack_frame->ecn_counters->ect0)) {
3709       set_detailed_error("Unable to read ack ect_0_count.");
3710       return false;
3711     }
3712     if (!reader->ReadVarInt62(&ack_frame->ecn_counters->ect1)) {
3713       set_detailed_error("Unable to read ack ect_1_count.");
3714       return false;
3715     }
3716     if (!reader->ReadVarInt62(&ack_frame->ecn_counters->ce)) {
3717       set_detailed_error("Unable to read ack ecn_ce_count.");
3718       return false;
3719     }
3720   }
3721 
3722   if (!visitor_->OnAckFrameEnd(QuicPacketNumber(block_low),
3723                                ack_frame->ecn_counters)) {
3724     set_detailed_error(
3725         "Error occurs when visitor finishes processing the ACK frame.");
3726     return false;
3727   }
3728 
3729   return true;
3730 }
3731 
ProcessIetfTimestampsInAckFrame(QuicPacketNumber largest_acked,QuicDataReader * reader)3732 bool QuicFramer::ProcessIetfTimestampsInAckFrame(QuicPacketNumber largest_acked,
3733                                                  QuicDataReader* reader) {
3734   uint64_t timestamp_range_count;
3735   if (!reader->ReadVarInt62(&timestamp_range_count)) {
3736     set_detailed_error("Unable to read receive timestamp range count.");
3737     return false;
3738   }
3739   if (timestamp_range_count == 0) {
3740     return true;
3741   }
3742 
3743   QuicPacketNumber packet_number = largest_acked;
3744 
3745   // Iterate through all timestamp ranges, each of which represents a block of
3746   // contiguous packets for which receive timestamps are being reported. Each
3747   // range is of the form:
3748   //
3749   // Timestamp Range {
3750   //    Gap (i),
3751   //    Timestamp Delta Count (i),
3752   //    Timestamp Delta (i) ...,
3753   //  }
3754   for (uint64_t i = 0; i < timestamp_range_count; i++) {
3755     uint64_t gap;
3756     if (!reader->ReadVarInt62(&gap)) {
3757       set_detailed_error("Unable to read receive timestamp gap.");
3758       return false;
3759     }
3760     if (packet_number.ToUint64() < gap) {
3761       set_detailed_error("Receive timestamp gap too high.");
3762       return false;
3763     }
3764     packet_number = packet_number - gap;
3765     uint64_t timestamp_count;
3766     if (!reader->ReadVarInt62(&timestamp_count)) {
3767       set_detailed_error("Unable to read receive timestamp count.");
3768       return false;
3769     }
3770     if (packet_number.ToUint64() < timestamp_count) {
3771       set_detailed_error("Receive timestamp count too high.");
3772       return false;
3773     }
3774     for (uint64_t j = 0; j < timestamp_count; j++) {
3775       uint64_t timestamp_delta;
3776       if (!reader->ReadVarInt62(&timestamp_delta)) {
3777         set_detailed_error("Unable to read receive timestamp delta.");
3778         return false;
3779       }
3780       // The first timestamp delta is relative to framer creation time; whereas
3781       // subsequent deltas are relative to the previous delta in decreasing
3782       // packet order.
3783       timestamp_delta = timestamp_delta << receive_timestamps_exponent_;
3784       if (i == 0 && j == 0) {
3785         last_timestamp_ = QuicTime::Delta::FromMicroseconds(timestamp_delta);
3786       } else {
3787         last_timestamp_ = last_timestamp_ -
3788                           QuicTime::Delta::FromMicroseconds(timestamp_delta);
3789         if (last_timestamp_ < QuicTime::Delta::Zero()) {
3790           set_detailed_error("Receive timestamp delta too high.");
3791           return false;
3792         }
3793       }
3794       visitor_->OnAckTimestamp(packet_number, creation_time_ + last_timestamp_);
3795       packet_number--;
3796     }
3797     packet_number--;
3798   }
3799   return true;
3800 }
3801 
ProcessStopWaitingFrame(QuicDataReader * reader,const QuicPacketHeader & header,QuicStopWaitingFrame * stop_waiting)3802 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
3803                                          const QuicPacketHeader& header,
3804                                          QuicStopWaitingFrame* stop_waiting) {
3805   uint64_t least_unacked_delta;
3806   if (!reader->ReadBytesToUInt64(header.packet_number_length,
3807                                  &least_unacked_delta)) {
3808     set_detailed_error("Unable to read least unacked delta.");
3809     return false;
3810   }
3811   if (header.packet_number.ToUint64() <= least_unacked_delta) {
3812     set_detailed_error("Invalid unacked delta.");
3813     return false;
3814   }
3815   stop_waiting->least_unacked = header.packet_number - least_unacked_delta;
3816 
3817   return true;
3818 }
3819 
ProcessRstStreamFrame(QuicDataReader * reader,QuicRstStreamFrame * frame)3820 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader,
3821                                        QuicRstStreamFrame* frame) {
3822   if (!reader->ReadUInt32(&frame->stream_id)) {
3823     set_detailed_error("Unable to read stream_id.");
3824     return false;
3825   }
3826 
3827   if (!reader->ReadUInt64(&frame->byte_offset)) {
3828     set_detailed_error("Unable to read rst stream sent byte offset.");
3829     return false;
3830   }
3831 
3832   uint32_t error_code;
3833   if (!reader->ReadUInt32(&error_code)) {
3834     set_detailed_error("Unable to read rst stream error code.");
3835     return false;
3836   }
3837 
3838   if (error_code >= QUIC_STREAM_LAST_ERROR) {
3839     // Ignore invalid stream error code if any.
3840     error_code = QUIC_STREAM_LAST_ERROR;
3841   }
3842 
3843   frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
3844 
3845   return true;
3846 }
3847 
ProcessConnectionCloseFrame(QuicDataReader * reader,QuicConnectionCloseFrame * frame)3848 bool QuicFramer::ProcessConnectionCloseFrame(QuicDataReader* reader,
3849                                              QuicConnectionCloseFrame* frame) {
3850   uint32_t error_code;
3851   frame->close_type = GOOGLE_QUIC_CONNECTION_CLOSE;
3852 
3853   if (!reader->ReadUInt32(&error_code)) {
3854     set_detailed_error("Unable to read connection close error code.");
3855     return false;
3856   }
3857 
3858   // For Google QUIC connection closes, |wire_error_code| and |quic_error_code|
3859   // must have the same value.
3860   frame->wire_error_code = error_code;
3861   frame->quic_error_code = static_cast<QuicErrorCode>(error_code);
3862 
3863   absl::string_view error_details;
3864   if (!reader->ReadStringPiece16(&error_details)) {
3865     set_detailed_error("Unable to read connection close error details.");
3866     return false;
3867   }
3868   frame->error_details = std::string(error_details);
3869 
3870   return true;
3871 }
3872 
ProcessGoAwayFrame(QuicDataReader * reader,QuicGoAwayFrame * frame)3873 bool QuicFramer::ProcessGoAwayFrame(QuicDataReader* reader,
3874                                     QuicGoAwayFrame* frame) {
3875   uint32_t error_code;
3876   if (!reader->ReadUInt32(&error_code)) {
3877     set_detailed_error("Unable to read go away error code.");
3878     return false;
3879   }
3880 
3881   frame->error_code = static_cast<QuicErrorCode>(error_code);
3882 
3883   uint32_t stream_id;
3884   if (!reader->ReadUInt32(&stream_id)) {
3885     set_detailed_error("Unable to read last good stream id.");
3886     return false;
3887   }
3888   frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
3889 
3890   absl::string_view reason_phrase;
3891   if (!reader->ReadStringPiece16(&reason_phrase)) {
3892     set_detailed_error("Unable to read goaway reason.");
3893     return false;
3894   }
3895   frame->reason_phrase = std::string(reason_phrase);
3896 
3897   return true;
3898 }
3899 
ProcessWindowUpdateFrame(QuicDataReader * reader,QuicWindowUpdateFrame * frame)3900 bool QuicFramer::ProcessWindowUpdateFrame(QuicDataReader* reader,
3901                                           QuicWindowUpdateFrame* frame) {
3902   if (!reader->ReadUInt32(&frame->stream_id)) {
3903     set_detailed_error("Unable to read stream_id.");
3904     return false;
3905   }
3906 
3907   if (!reader->ReadUInt64(&frame->max_data)) {
3908     set_detailed_error("Unable to read window byte_offset.");
3909     return false;
3910   }
3911 
3912   return true;
3913 }
3914 
ProcessBlockedFrame(QuicDataReader * reader,QuicBlockedFrame * frame)3915 bool QuicFramer::ProcessBlockedFrame(QuicDataReader* reader,
3916                                      QuicBlockedFrame* frame) {
3917   QUICHE_DCHECK(!VersionHasIetfQuicFrames(version_.transport_version))
3918       << "Attempt to process non-IETF QUIC frames in an IETF QUIC version.";
3919 
3920   if (!reader->ReadUInt32(&frame->stream_id)) {
3921     set_detailed_error("Unable to read stream_id.");
3922     return false;
3923   }
3924 
3925   return true;
3926 }
3927 
ProcessPaddingFrame(QuicDataReader * reader,QuicPaddingFrame * frame)3928 void QuicFramer::ProcessPaddingFrame(QuicDataReader* reader,
3929                                      QuicPaddingFrame* frame) {
3930   // Type byte has been read.
3931   frame->num_padding_bytes = 1;
3932   uint8_t next_byte;
3933   while (!reader->IsDoneReading() && reader->PeekByte() == 0x00) {
3934     reader->ReadBytes(&next_byte, 1);
3935     QUICHE_DCHECK_EQ(0x00, next_byte);
3936     ++frame->num_padding_bytes;
3937   }
3938 }
3939 
ProcessMessageFrame(QuicDataReader * reader,bool no_message_length,QuicMessageFrame * frame)3940 bool QuicFramer::ProcessMessageFrame(QuicDataReader* reader,
3941                                      bool no_message_length,
3942                                      QuicMessageFrame* frame) {
3943   if (no_message_length) {
3944     absl::string_view remaining(reader->ReadRemainingPayload());
3945     frame->data = remaining.data();
3946     frame->message_length = remaining.length();
3947     return true;
3948   }
3949 
3950   uint64_t message_length;
3951   if (!reader->ReadVarInt62(&message_length)) {
3952     set_detailed_error("Unable to read message length");
3953     return false;
3954   }
3955 
3956   absl::string_view message_piece;
3957   if (!reader->ReadStringPiece(&message_piece, message_length)) {
3958     set_detailed_error("Unable to read message data");
3959     return false;
3960   }
3961 
3962   frame->data = message_piece.data();
3963   frame->message_length = message_length;
3964 
3965   return true;
3966 }
3967 
3968 // static
GetAssociatedDataFromEncryptedPacket(QuicTransportVersion version,const QuicEncryptedPacket & encrypted,uint8_t destination_connection_id_length,uint8_t source_connection_id_length,bool includes_version,bool includes_diversification_nonce,QuicPacketNumberLength packet_number_length,quiche::QuicheVariableLengthIntegerLength retry_token_length_length,uint64_t retry_token_length,quiche::QuicheVariableLengthIntegerLength length_length)3969 absl::string_view QuicFramer::GetAssociatedDataFromEncryptedPacket(
3970     QuicTransportVersion version, const QuicEncryptedPacket& encrypted,
3971     uint8_t destination_connection_id_length,
3972     uint8_t source_connection_id_length, bool includes_version,
3973     bool includes_diversification_nonce,
3974     QuicPacketNumberLength packet_number_length,
3975     quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
3976     uint64_t retry_token_length,
3977     quiche::QuicheVariableLengthIntegerLength length_length) {
3978   // TODO(ianswett): This is identical to QuicData::AssociatedData.
3979   return absl::string_view(
3980       encrypted.data(),
3981       GetStartOfEncryptedData(version, destination_connection_id_length,
3982                               source_connection_id_length, includes_version,
3983                               includes_diversification_nonce,
3984                               packet_number_length, retry_token_length_length,
3985                               retry_token_length, length_length));
3986 }
3987 
SetDecrypter(EncryptionLevel level,std::unique_ptr<QuicDecrypter> decrypter)3988 void QuicFramer::SetDecrypter(EncryptionLevel level,
3989                               std::unique_ptr<QuicDecrypter> decrypter) {
3990   QUICHE_DCHECK_GE(level, decrypter_level_);
3991   QUICHE_DCHECK(!version_.KnowsWhichDecrypterToUse());
3992   QUIC_DVLOG(1) << ENDPOINT << "Setting decrypter from level "
3993                 << decrypter_level_ << " to " << level;
3994   decrypter_[decrypter_level_] = nullptr;
3995   decrypter_[level] = std::move(decrypter);
3996   decrypter_level_ = level;
3997 }
3998 
SetAlternativeDecrypter(EncryptionLevel level,std::unique_ptr<QuicDecrypter> decrypter,bool latch_once_used)3999 void QuicFramer::SetAlternativeDecrypter(
4000     EncryptionLevel level, std::unique_ptr<QuicDecrypter> decrypter,
4001     bool latch_once_used) {
4002   QUICHE_DCHECK_NE(level, decrypter_level_);
4003   QUICHE_DCHECK(!version_.KnowsWhichDecrypterToUse());
4004   QUIC_DVLOG(1) << ENDPOINT << "Setting alternative decrypter from level "
4005                 << alternative_decrypter_level_ << " to " << level;
4006   if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
4007     decrypter_[alternative_decrypter_level_] = nullptr;
4008   }
4009   decrypter_[level] = std::move(decrypter);
4010   alternative_decrypter_level_ = level;
4011   alternative_decrypter_latch_ = latch_once_used;
4012 }
4013 
InstallDecrypter(EncryptionLevel level,std::unique_ptr<QuicDecrypter> decrypter)4014 void QuicFramer::InstallDecrypter(EncryptionLevel level,
4015                                   std::unique_ptr<QuicDecrypter> decrypter) {
4016   QUICHE_DCHECK(version_.KnowsWhichDecrypterToUse());
4017   QUIC_DVLOG(1) << ENDPOINT << "Installing decrypter at level " << level;
4018   decrypter_[level] = std::move(decrypter);
4019 }
4020 
RemoveDecrypter(EncryptionLevel level)4021 void QuicFramer::RemoveDecrypter(EncryptionLevel level) {
4022   QUICHE_DCHECK(version_.KnowsWhichDecrypterToUse());
4023   QUIC_DVLOG(1) << ENDPOINT << "Removing decrypter at level " << level;
4024   decrypter_[level] = nullptr;
4025 }
4026 
SetKeyUpdateSupportForConnection(bool enabled)4027 void QuicFramer::SetKeyUpdateSupportForConnection(bool enabled) {
4028   QUIC_DVLOG(1) << ENDPOINT << "SetKeyUpdateSupportForConnection: " << enabled;
4029   support_key_update_for_connection_ = enabled;
4030 }
4031 
DiscardPreviousOneRttKeys()4032 void QuicFramer::DiscardPreviousOneRttKeys() {
4033   QUICHE_DCHECK(support_key_update_for_connection_);
4034   QUIC_DVLOG(1) << ENDPOINT << "Discarding previous set of 1-RTT keys";
4035   previous_decrypter_ = nullptr;
4036 }
4037 
DoKeyUpdate(KeyUpdateReason reason)4038 bool QuicFramer::DoKeyUpdate(KeyUpdateReason reason) {
4039   QUICHE_DCHECK(support_key_update_for_connection_);
4040   if (!next_decrypter_) {
4041     // If key update is locally initiated, next decrypter might not be created
4042     // yet.
4043     next_decrypter_ = visitor_->AdvanceKeysAndCreateCurrentOneRttDecrypter();
4044   }
4045   std::unique_ptr<QuicEncrypter> next_encrypter =
4046       visitor_->CreateCurrentOneRttEncrypter();
4047   if (!next_decrypter_ || !next_encrypter) {
4048     QUIC_BUG(quic_bug_10850_58) << "Failed to create next crypters";
4049     return false;
4050   }
4051   key_update_performed_ = true;
4052   current_key_phase_bit_ = !current_key_phase_bit_;
4053   QUIC_DLOG(INFO) << ENDPOINT << "DoKeyUpdate: new current_key_phase_bit_="
4054                   << current_key_phase_bit_;
4055   current_key_phase_first_received_packet_number_.Clear();
4056   previous_decrypter_ = std::move(decrypter_[ENCRYPTION_FORWARD_SECURE]);
4057   decrypter_[ENCRYPTION_FORWARD_SECURE] = std::move(next_decrypter_);
4058   encrypter_[ENCRYPTION_FORWARD_SECURE] = std::move(next_encrypter);
4059   switch (reason) {
4060     case KeyUpdateReason::kInvalid:
4061       QUIC_CODE_COUNT(quic_key_update_invalid);
4062       break;
4063     case KeyUpdateReason::kRemote:
4064       QUIC_CODE_COUNT(quic_key_update_remote);
4065       break;
4066     case KeyUpdateReason::kLocalForTests:
4067       QUIC_CODE_COUNT(quic_key_update_local_for_tests);
4068       break;
4069     case KeyUpdateReason::kLocalForInteropRunner:
4070       QUIC_CODE_COUNT(quic_key_update_local_for_interop_runner);
4071       break;
4072     case KeyUpdateReason::kLocalAeadConfidentialityLimit:
4073       QUIC_CODE_COUNT(quic_key_update_local_aead_confidentiality_limit);
4074       break;
4075     case KeyUpdateReason::kLocalKeyUpdateLimitOverride:
4076       QUIC_CODE_COUNT(quic_key_update_local_limit_override);
4077       break;
4078   }
4079   visitor_->OnKeyUpdate(reason);
4080   return true;
4081 }
4082 
PotentialPeerKeyUpdateAttemptCount() const4083 QuicPacketCount QuicFramer::PotentialPeerKeyUpdateAttemptCount() const {
4084   return potential_peer_key_update_attempt_count_;
4085 }
4086 
GetDecrypter(EncryptionLevel level) const4087 const QuicDecrypter* QuicFramer::GetDecrypter(EncryptionLevel level) const {
4088   QUICHE_DCHECK(version_.KnowsWhichDecrypterToUse());
4089   return decrypter_[level].get();
4090 }
4091 
decrypter() const4092 const QuicDecrypter* QuicFramer::decrypter() const {
4093   return decrypter_[decrypter_level_].get();
4094 }
4095 
alternative_decrypter() const4096 const QuicDecrypter* QuicFramer::alternative_decrypter() const {
4097   if (alternative_decrypter_level_ == NUM_ENCRYPTION_LEVELS) {
4098     return nullptr;
4099   }
4100   return decrypter_[alternative_decrypter_level_].get();
4101 }
4102 
SetEncrypter(EncryptionLevel level,std::unique_ptr<QuicEncrypter> encrypter)4103 void QuicFramer::SetEncrypter(EncryptionLevel level,
4104                               std::unique_ptr<QuicEncrypter> encrypter) {
4105   QUICHE_DCHECK_GE(level, 0);
4106   QUICHE_DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
4107   QUIC_DVLOG(1) << ENDPOINT << "Setting encrypter at level " << level;
4108   encrypter_[level] = std::move(encrypter);
4109 }
4110 
RemoveEncrypter(EncryptionLevel level)4111 void QuicFramer::RemoveEncrypter(EncryptionLevel level) {
4112   QUIC_DVLOG(1) << ENDPOINT << "Removing encrypter of " << level;
4113   encrypter_[level] = nullptr;
4114 }
4115 
SetInitialObfuscators(QuicConnectionId connection_id)4116 void QuicFramer::SetInitialObfuscators(QuicConnectionId connection_id) {
4117   CrypterPair crypters;
4118   CryptoUtils::CreateInitialObfuscators(perspective_, version_, connection_id,
4119                                         &crypters);
4120   encrypter_[ENCRYPTION_INITIAL] = std::move(crypters.encrypter);
4121   decrypter_[ENCRYPTION_INITIAL] = std::move(crypters.decrypter);
4122 }
4123 
EncryptInPlace(EncryptionLevel level,QuicPacketNumber packet_number,size_t ad_len,size_t total_len,size_t buffer_len,char * buffer)4124 size_t QuicFramer::EncryptInPlace(EncryptionLevel level,
4125                                   QuicPacketNumber packet_number, size_t ad_len,
4126                                   size_t total_len, size_t buffer_len,
4127                                   char* buffer) {
4128   QUICHE_DCHECK(packet_number.IsInitialized());
4129   if (encrypter_[level] == nullptr) {
4130     QUIC_BUG(quic_bug_10850_59)
4131         << ENDPOINT
4132         << "Attempted to encrypt in place without encrypter at level " << level;
4133     RaiseError(QUIC_ENCRYPTION_FAILURE);
4134     return 0;
4135   }
4136 
4137   size_t output_length = 0;
4138   if (!encrypter_[level]->EncryptPacket(
4139           packet_number.ToUint64(),
4140           absl::string_view(buffer, ad_len),  // Associated data
4141           absl::string_view(buffer + ad_len,
4142                             total_len - ad_len),  // Plaintext
4143           buffer + ad_len,                        // Destination buffer
4144           &output_length, buffer_len - ad_len)) {
4145     RaiseError(QUIC_ENCRYPTION_FAILURE);
4146     return 0;
4147   }
4148   if (version_.HasHeaderProtection() &&
4149       !ApplyHeaderProtection(level, buffer, ad_len + output_length, ad_len)) {
4150     QUIC_DLOG(ERROR) << "Applying header protection failed.";
4151     RaiseError(QUIC_ENCRYPTION_FAILURE);
4152     return 0;
4153   }
4154 
4155   return ad_len + output_length;
4156 }
4157 
4158 namespace {
4159 
4160 const size_t kHPSampleLen = 16;
4161 
IsLongHeader(uint8_t type_byte)4162 constexpr bool IsLongHeader(uint8_t type_byte) {
4163   return (type_byte & FLAGS_LONG_HEADER) != 0;
4164 }
4165 
4166 }  // namespace
4167 
ApplyHeaderProtection(EncryptionLevel level,char * buffer,size_t buffer_len,size_t ad_len)4168 bool QuicFramer::ApplyHeaderProtection(EncryptionLevel level, char* buffer,
4169                                        size_t buffer_len, size_t ad_len) {
4170   QuicDataReader buffer_reader(buffer, buffer_len);
4171   QuicDataWriter buffer_writer(buffer_len, buffer);
4172   // The sample starts 4 bytes after the start of the packet number.
4173   if (ad_len < last_written_packet_number_length_) {
4174     return false;
4175   }
4176   size_t pn_offset = ad_len - last_written_packet_number_length_;
4177   // Sample the ciphertext and generate the mask to use for header protection.
4178   size_t sample_offset = pn_offset + 4;
4179   QuicDataReader sample_reader(buffer, buffer_len);
4180   absl::string_view sample;
4181   if (!sample_reader.Seek(sample_offset) ||
4182       !sample_reader.ReadStringPiece(&sample, kHPSampleLen)) {
4183     QUIC_BUG(quic_bug_10850_60)
4184         << "Not enough bytes to sample: sample_offset " << sample_offset
4185         << ", sample len: " << kHPSampleLen << ", buffer len: " << buffer_len;
4186     return false;
4187   }
4188 
4189   if (encrypter_[level] == nullptr) {
4190     QUIC_BUG(quic_bug_12975_8)
4191         << ENDPOINT
4192         << "Attempted to apply header protection without encrypter at level "
4193         << level << " using " << version_;
4194     return false;
4195   }
4196 
4197   std::string mask = encrypter_[level]->GenerateHeaderProtectionMask(sample);
4198   if (mask.empty()) {
4199     QUIC_BUG(quic_bug_10850_61) << "Unable to generate header protection mask.";
4200     return false;
4201   }
4202   QuicDataReader mask_reader(mask.data(), mask.size());
4203 
4204   // Apply the mask to the 4 or 5 least significant bits of the first byte.
4205   uint8_t bitmask = 0x1f;
4206   uint8_t type_byte;
4207   if (!buffer_reader.ReadUInt8(&type_byte)) {
4208     return false;
4209   }
4210   QuicLongHeaderType header_type;
4211   if (IsLongHeader(type_byte)) {
4212     bitmask = 0x0f;
4213     header_type = GetLongHeaderType(type_byte, version_);
4214     if (header_type == INVALID_PACKET_TYPE) {
4215       return false;
4216     }
4217   }
4218   uint8_t mask_byte;
4219   if (!mask_reader.ReadUInt8(&mask_byte) ||
4220       !buffer_writer.WriteUInt8(type_byte ^ (mask_byte & bitmask))) {
4221     return false;
4222   }
4223 
4224   // Adjust |pn_offset| to account for the diversification nonce.
4225   if (IsLongHeader(type_byte) && header_type == ZERO_RTT_PROTECTED &&
4226       perspective_ == Perspective::IS_SERVER &&
4227       version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
4228     if (pn_offset <= kDiversificationNonceSize) {
4229       QUIC_BUG(quic_bug_10850_62)
4230           << "Expected diversification nonce, but not enough bytes";
4231       return false;
4232     }
4233     pn_offset -= kDiversificationNonceSize;
4234   }
4235   // Advance the reader and writer to the packet number. Both the reader and
4236   // writer have each read/written one byte.
4237   if (!buffer_writer.Seek(pn_offset - 1) ||
4238       !buffer_reader.Seek(pn_offset - 1)) {
4239     return false;
4240   }
4241   // Apply the rest of the mask to the packet number.
4242   for (size_t i = 0; i < last_written_packet_number_length_; ++i) {
4243     uint8_t buffer_byte;
4244     uint8_t pn_mask_byte;
4245     if (!mask_reader.ReadUInt8(&pn_mask_byte) ||
4246         !buffer_reader.ReadUInt8(&buffer_byte) ||
4247         !buffer_writer.WriteUInt8(buffer_byte ^ pn_mask_byte)) {
4248       return false;
4249     }
4250   }
4251   return true;
4252 }
4253 
RemoveHeaderProtection(QuicDataReader * reader,const QuicEncryptedPacket & packet,QuicPacketHeader * header,uint64_t * full_packet_number,std::vector<char> * associated_data)4254 bool QuicFramer::RemoveHeaderProtection(QuicDataReader* reader,
4255                                         const QuicEncryptedPacket& packet,
4256                                         QuicPacketHeader* header,
4257                                         uint64_t* full_packet_number,
4258                                         std::vector<char>* associated_data) {
4259   EncryptionLevel expected_decryption_level = GetEncryptionLevel(*header);
4260   QuicDecrypter* decrypter = decrypter_[expected_decryption_level].get();
4261   if (decrypter == nullptr) {
4262     QUIC_DVLOG(1)
4263         << ENDPOINT
4264         << "No decrypter available for removing header protection at level "
4265         << expected_decryption_level;
4266     return false;
4267   }
4268 
4269   bool has_diversification_nonce =
4270       header->form == IETF_QUIC_LONG_HEADER_PACKET &&
4271       header->long_packet_type == ZERO_RTT_PROTECTED &&
4272       perspective_ == Perspective::IS_CLIENT &&
4273       version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO;
4274 
4275   // Read a sample from the ciphertext and compute the mask to use for header
4276   // protection.
4277   absl::string_view remaining_packet = reader->PeekRemainingPayload();
4278   QuicDataReader sample_reader(remaining_packet);
4279 
4280   // The sample starts 4 bytes after the start of the packet number.
4281   absl::string_view pn;
4282   if (!sample_reader.ReadStringPiece(&pn, 4)) {
4283     QUIC_DVLOG(1) << "Not enough data to sample";
4284     return false;
4285   }
4286   if (has_diversification_nonce) {
4287     // In Google QUIC, the diversification nonce comes between the packet number
4288     // and the sample.
4289     if (!sample_reader.Seek(kDiversificationNonceSize)) {
4290       QUIC_DVLOG(1) << "No diversification nonce to skip over";
4291       return false;
4292     }
4293   }
4294   std::string mask = decrypter->GenerateHeaderProtectionMask(&sample_reader);
4295   QuicDataReader mask_reader(mask.data(), mask.size());
4296   if (mask.empty()) {
4297     QUIC_DVLOG(1) << "Failed to compute mask";
4298     return false;
4299   }
4300 
4301   // Unmask the rest of the type byte.
4302   uint8_t bitmask = 0x1f;
4303   if (IsLongHeader(header->type_byte)) {
4304     bitmask = 0x0f;
4305   }
4306   uint8_t mask_byte;
4307   if (!mask_reader.ReadUInt8(&mask_byte)) {
4308     QUIC_DVLOG(1) << "No first byte to read from mask";
4309     return false;
4310   }
4311   header->type_byte ^= (mask_byte & bitmask);
4312 
4313   // Compute the packet number length.
4314   header->packet_number_length =
4315       static_cast<QuicPacketNumberLength>((header->type_byte & 0x03) + 1);
4316 
4317   char pn_buffer[IETF_MAX_PACKET_NUMBER_LENGTH] = {};
4318   QuicDataWriter pn_writer(ABSL_ARRAYSIZE(pn_buffer), pn_buffer);
4319 
4320   // Read the (protected) packet number from the reader and unmask the packet
4321   // number.
4322   for (size_t i = 0; i < header->packet_number_length; ++i) {
4323     uint8_t protected_pn_byte, pn_mask_byte;
4324     if (!mask_reader.ReadUInt8(&pn_mask_byte) ||
4325         !reader->ReadUInt8(&protected_pn_byte) ||
4326         !pn_writer.WriteUInt8(protected_pn_byte ^ pn_mask_byte)) {
4327       QUIC_DVLOG(1) << "Failed to unmask packet number";
4328       return false;
4329     }
4330   }
4331   QuicDataReader packet_number_reader(pn_writer.data(), pn_writer.length());
4332   QuicPacketNumber base_packet_number;
4333   if (supports_multiple_packet_number_spaces_) {
4334     PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
4335     if (pn_space == NUM_PACKET_NUMBER_SPACES) {
4336       return false;
4337     }
4338     base_packet_number = largest_decrypted_packet_numbers_[pn_space];
4339   } else {
4340     base_packet_number = largest_packet_number_;
4341   }
4342   if (!ProcessAndCalculatePacketNumber(
4343           &packet_number_reader, header->packet_number_length,
4344           base_packet_number, full_packet_number)) {
4345     return false;
4346   }
4347 
4348   // Get the associated data, and apply the same unmasking operations to it.
4349   absl::string_view ad = GetAssociatedDataFromEncryptedPacket(
4350       version_.transport_version, packet,
4351       GetIncludedDestinationConnectionIdLength(*header),
4352       GetIncludedSourceConnectionIdLength(*header), header->version_flag,
4353       has_diversification_nonce, header->packet_number_length,
4354       header->retry_token_length_length, header->retry_token.length(),
4355       header->length_length);
4356   *associated_data = std::vector<char>(ad.begin(), ad.end());
4357   QuicDataWriter ad_writer(associated_data->size(), associated_data->data());
4358 
4359   // Apply the unmasked type byte and packet number to |associated_data|.
4360   if (!ad_writer.WriteUInt8(header->type_byte)) {
4361     return false;
4362   }
4363   // Put the packet number at the end of the AD, or if there's a diversification
4364   // nonce, before that (which is at the end of the AD).
4365   size_t seek_len = ad_writer.remaining() - header->packet_number_length;
4366   if (has_diversification_nonce) {
4367     seek_len -= kDiversificationNonceSize;
4368   }
4369   if (!ad_writer.Seek(seek_len) ||
4370       !ad_writer.WriteBytes(pn_writer.data(), pn_writer.length())) {
4371     QUIC_DVLOG(1) << "Failed to apply unmasking operations to AD";
4372     return false;
4373   }
4374 
4375   return true;
4376 }
4377 
EncryptPayload(EncryptionLevel level,QuicPacketNumber packet_number,const QuicPacket & packet,char * buffer,size_t buffer_len)4378 size_t QuicFramer::EncryptPayload(EncryptionLevel level,
4379                                   QuicPacketNumber packet_number,
4380                                   const QuicPacket& packet, char* buffer,
4381                                   size_t buffer_len) {
4382   QUICHE_DCHECK(packet_number.IsInitialized());
4383   if (encrypter_[level] == nullptr) {
4384     QUIC_BUG(quic_bug_10850_63)
4385         << ENDPOINT << "Attempted to encrypt without encrypter at level "
4386         << level;
4387     RaiseError(QUIC_ENCRYPTION_FAILURE);
4388     return 0;
4389   }
4390 
4391   absl::string_view associated_data =
4392       packet.AssociatedData(version_.transport_version);
4393   // Copy in the header, because the encrypter only populates the encrypted
4394   // plaintext content.
4395   const size_t ad_len = associated_data.length();
4396   if (packet.length() < ad_len) {
4397     QUIC_BUG(quic_bug_10850_64)
4398         << ENDPOINT << "packet is shorter than associated data length. version:"
4399         << version() << ", packet length:" << packet.length()
4400         << ", associated data length:" << ad_len;
4401     RaiseError(QUIC_ENCRYPTION_FAILURE);
4402     return 0;
4403   }
4404   memmove(buffer, associated_data.data(), ad_len);
4405   // Encrypt the plaintext into the buffer.
4406   size_t output_length = 0;
4407   if (!encrypter_[level]->EncryptPacket(
4408           packet_number.ToUint64(), associated_data,
4409           packet.Plaintext(version_.transport_version), buffer + ad_len,
4410           &output_length, buffer_len - ad_len)) {
4411     RaiseError(QUIC_ENCRYPTION_FAILURE);
4412     return 0;
4413   }
4414   if (version_.HasHeaderProtection() &&
4415       !ApplyHeaderProtection(level, buffer, ad_len + output_length, ad_len)) {
4416     QUIC_DLOG(ERROR) << "Applying header protection failed.";
4417     RaiseError(QUIC_ENCRYPTION_FAILURE);
4418     return 0;
4419   }
4420 
4421   return ad_len + output_length;
4422 }
4423 
GetCiphertextSize(EncryptionLevel level,size_t plaintext_size) const4424 size_t QuicFramer::GetCiphertextSize(EncryptionLevel level,
4425                                      size_t plaintext_size) const {
4426   if (encrypter_[level] == nullptr) {
4427     QUIC_BUG(quic_bug_10850_65)
4428         << ENDPOINT
4429         << "Attempted to get ciphertext size without encrypter at level "
4430         << level << " using " << version_;
4431     return plaintext_size;
4432   }
4433   return encrypter_[level]->GetCiphertextSize(plaintext_size);
4434 }
4435 
GetMaxPlaintextSize(size_t ciphertext_size)4436 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
4437   // In order to keep the code simple, we don't have the current encryption
4438   // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
4439   size_t min_plaintext_size = ciphertext_size;
4440 
4441   for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; i++) {
4442     if (encrypter_[i] != nullptr) {
4443       size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
4444       if (size < min_plaintext_size) {
4445         min_plaintext_size = size;
4446       }
4447     }
4448   }
4449 
4450   return min_plaintext_size;
4451 }
4452 
GetOneRttEncrypterConfidentialityLimit() const4453 QuicPacketCount QuicFramer::GetOneRttEncrypterConfidentialityLimit() const {
4454   if (!encrypter_[ENCRYPTION_FORWARD_SECURE]) {
4455     QUIC_BUG(quic_bug_10850_66) << "1-RTT encrypter not set";
4456     return 0;
4457   }
4458   return encrypter_[ENCRYPTION_FORWARD_SECURE]->GetConfidentialityLimit();
4459 }
4460 
DecryptPayload(size_t udp_packet_length,absl::string_view encrypted,absl::string_view associated_data,const QuicPacketHeader & header,char * decrypted_buffer,size_t buffer_length,size_t * decrypted_length,EncryptionLevel * decrypted_level)4461 bool QuicFramer::DecryptPayload(size_t udp_packet_length,
4462                                 absl::string_view encrypted,
4463                                 absl::string_view associated_data,
4464                                 const QuicPacketHeader& header,
4465                                 char* decrypted_buffer, size_t buffer_length,
4466                                 size_t* decrypted_length,
4467                                 EncryptionLevel* decrypted_level) {
4468   if (!EncryptionLevelIsValid(decrypter_level_)) {
4469     QUIC_BUG(quic_bug_10850_67)
4470         << "Attempted to decrypt with bad decrypter_level_";
4471     return false;
4472   }
4473   EncryptionLevel level = decrypter_level_;
4474   QuicDecrypter* decrypter = decrypter_[level].get();
4475   QuicDecrypter* alternative_decrypter = nullptr;
4476   bool key_phase_parsed = false;
4477   bool key_phase;
4478   bool attempt_key_update = false;
4479   if (version().KnowsWhichDecrypterToUse()) {
4480     if (header.form == GOOGLE_QUIC_PACKET) {
4481       QUIC_BUG(quic_bug_10850_68)
4482           << "Attempted to decrypt GOOGLE_QUIC_PACKET with a version that "
4483              "knows which decrypter to use";
4484       return false;
4485     }
4486     level = GetEncryptionLevel(header);
4487     if (!EncryptionLevelIsValid(level)) {
4488       QUIC_BUG(quic_bug_10850_69) << "Attempted to decrypt with bad level";
4489       return false;
4490     }
4491     decrypter = decrypter_[level].get();
4492     if (decrypter == nullptr) {
4493       return false;
4494     }
4495     if (level == ENCRYPTION_ZERO_RTT &&
4496         perspective_ == Perspective::IS_CLIENT && header.nonce != nullptr) {
4497       decrypter->SetDiversificationNonce(*header.nonce);
4498     }
4499     if (support_key_update_for_connection_ &&
4500         header.form == IETF_QUIC_SHORT_HEADER_PACKET) {
4501       QUICHE_DCHECK(version().UsesTls());
4502       QUICHE_DCHECK_EQ(level, ENCRYPTION_FORWARD_SECURE);
4503       key_phase = (header.type_byte & FLAGS_KEY_PHASE_BIT) != 0;
4504       key_phase_parsed = true;
4505       QUIC_DVLOG(1) << ENDPOINT << "packet " << header.packet_number
4506                     << " received key_phase=" << key_phase
4507                     << " current_key_phase_bit_=" << current_key_phase_bit_;
4508       if (key_phase != current_key_phase_bit_) {
4509         if ((current_key_phase_first_received_packet_number_.IsInitialized() &&
4510              header.packet_number >
4511                  current_key_phase_first_received_packet_number_) ||
4512             (!current_key_phase_first_received_packet_number_.IsInitialized() &&
4513              !key_update_performed_)) {
4514           if (!next_decrypter_) {
4515             next_decrypter_ =
4516                 visitor_->AdvanceKeysAndCreateCurrentOneRttDecrypter();
4517             if (!next_decrypter_) {
4518               QUIC_BUG(quic_bug_10850_70) << "Failed to create next_decrypter";
4519               return false;
4520             }
4521           }
4522           QUIC_DVLOG(1) << ENDPOINT << "packet " << header.packet_number
4523                         << " attempt_key_update=true";
4524           attempt_key_update = true;
4525           potential_peer_key_update_attempt_count_++;
4526           decrypter = next_decrypter_.get();
4527         } else {
4528           if (previous_decrypter_) {
4529             QUIC_DVLOG(1) << ENDPOINT
4530                           << "trying previous_decrypter_ for packet "
4531                           << header.packet_number;
4532             decrypter = previous_decrypter_.get();
4533           } else {
4534             QUIC_DVLOG(1) << ENDPOINT << "dropping packet "
4535                           << header.packet_number << " with old key phase";
4536             return false;
4537           }
4538         }
4539       }
4540     }
4541   } else if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
4542     if (!EncryptionLevelIsValid(alternative_decrypter_level_)) {
4543       QUIC_BUG(quic_bug_10850_71)
4544           << "Attempted to decrypt with bad alternative_decrypter_level_";
4545       return false;
4546     }
4547     alternative_decrypter = decrypter_[alternative_decrypter_level_].get();
4548   }
4549 
4550   if (decrypter == nullptr) {
4551     QUIC_BUG(quic_bug_10850_72)
4552         << "Attempting to decrypt without decrypter, encryption level:" << level
4553         << " version:" << version();
4554     return false;
4555   }
4556 
4557   bool success = decrypter->DecryptPacket(
4558       header.packet_number.ToUint64(), associated_data, encrypted,
4559       decrypted_buffer, decrypted_length, buffer_length);
4560   if (success) {
4561     visitor_->OnDecryptedPacket(udp_packet_length, level);
4562     if (level == ENCRYPTION_ZERO_RTT &&
4563         current_key_phase_first_received_packet_number_.IsInitialized() &&
4564         header.packet_number >
4565             current_key_phase_first_received_packet_number_) {
4566       set_detailed_error(absl::StrCat(
4567           "Decrypted a 0-RTT packet with a packet number ",
4568           header.packet_number.ToString(),
4569           " which is higher than a 1-RTT packet number ",
4570           current_key_phase_first_received_packet_number_.ToString()));
4571       return RaiseError(QUIC_INVALID_0RTT_PACKET_NUMBER_OUT_OF_ORDER);
4572     }
4573     *decrypted_level = level;
4574     potential_peer_key_update_attempt_count_ = 0;
4575     if (attempt_key_update) {
4576       if (!DoKeyUpdate(KeyUpdateReason::kRemote)) {
4577         set_detailed_error("Key update failed due to internal error");
4578         return RaiseError(QUIC_INTERNAL_ERROR);
4579       }
4580       QUICHE_DCHECK_EQ(current_key_phase_bit_, key_phase);
4581     }
4582     if (key_phase_parsed &&
4583         !current_key_phase_first_received_packet_number_.IsInitialized() &&
4584         key_phase == current_key_phase_bit_) {
4585       // Set packet number for current key phase if it hasn't been initialized
4586       // yet. This is set outside of attempt_key_update since the key update
4587       // may have been initiated locally, and in that case we don't know yet
4588       // which packet number from the remote side to use until we receive a
4589       // packet with that phase.
4590       QUIC_DVLOG(1) << ENDPOINT
4591                     << "current_key_phase_first_received_packet_number_ = "
4592                     << header.packet_number;
4593       current_key_phase_first_received_packet_number_ = header.packet_number;
4594       visitor_->OnDecryptedFirstPacketInKeyPhase();
4595     }
4596   } else if (alternative_decrypter != nullptr) {
4597     if (header.nonce != nullptr) {
4598       QUICHE_DCHECK_EQ(perspective_, Perspective::IS_CLIENT);
4599       alternative_decrypter->SetDiversificationNonce(*header.nonce);
4600     }
4601     bool try_alternative_decryption = true;
4602     if (alternative_decrypter_level_ == ENCRYPTION_ZERO_RTT) {
4603       if (perspective_ == Perspective::IS_CLIENT) {
4604         if (header.nonce == nullptr) {
4605           // Can not use INITIAL decryption without a diversification nonce.
4606           try_alternative_decryption = false;
4607         }
4608       } else {
4609         QUICHE_DCHECK(header.nonce == nullptr);
4610       }
4611     }
4612 
4613     if (try_alternative_decryption) {
4614       success = alternative_decrypter->DecryptPacket(
4615           header.packet_number.ToUint64(), associated_data, encrypted,
4616           decrypted_buffer, decrypted_length, buffer_length);
4617     }
4618     if (success) {
4619       visitor_->OnDecryptedPacket(udp_packet_length,
4620                                   alternative_decrypter_level_);
4621       *decrypted_level = decrypter_level_;
4622       if (alternative_decrypter_latch_) {
4623         if (!EncryptionLevelIsValid(alternative_decrypter_level_)) {
4624           QUIC_BUG(quic_bug_10850_73)
4625               << "Attempted to latch alternate decrypter with bad "
4626                  "alternative_decrypter_level_";
4627           return false;
4628         }
4629         // Switch to the alternative decrypter and latch so that we cannot
4630         // switch back.
4631         decrypter_level_ = alternative_decrypter_level_;
4632         alternative_decrypter_level_ = NUM_ENCRYPTION_LEVELS;
4633       } else {
4634         // Switch the alternative decrypter so that we use it first next time.
4635         EncryptionLevel alt_level = alternative_decrypter_level_;
4636         alternative_decrypter_level_ = decrypter_level_;
4637         decrypter_level_ = alt_level;
4638       }
4639     }
4640   }
4641 
4642   if (!success) {
4643     QUIC_DVLOG(1) << ENDPOINT << "DecryptPacket failed for: " << header;
4644     return false;
4645   }
4646 
4647   return true;
4648 }
4649 
GetIetfAckFrameSize(const QuicAckFrame & frame)4650 size_t QuicFramer::GetIetfAckFrameSize(const QuicAckFrame& frame) {
4651   // Type byte, largest_acked, and delay_time are straight-forward.
4652   size_t ack_frame_size = kQuicFrameTypeSize;
4653   QuicPacketNumber largest_acked = LargestAcked(frame);
4654   ack_frame_size += QuicDataWriter::GetVarInt62Len(largest_acked.ToUint64());
4655   uint64_t ack_delay_time_us;
4656   ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
4657   ack_delay_time_us = ack_delay_time_us >> local_ack_delay_exponent_;
4658   ack_frame_size += QuicDataWriter::GetVarInt62Len(ack_delay_time_us);
4659 
4660   if (frame.packets.Empty() || frame.packets.Max() != largest_acked) {
4661     QUIC_BUG(quic_bug_10850_74) << "Malformed ack frame";
4662     // ACK frame serialization will fail and connection will be closed.
4663     return ack_frame_size;
4664   }
4665 
4666   // Ack block count.
4667   ack_frame_size +=
4668       QuicDataWriter::GetVarInt62Len(frame.packets.NumIntervals() - 1);
4669 
4670   // First Ack range.
4671   auto iter = frame.packets.rbegin();
4672   ack_frame_size += QuicDataWriter::GetVarInt62Len(iter->Length() - 1);
4673   QuicPacketNumber previous_smallest = iter->min();
4674   ++iter;
4675 
4676   // Ack blocks.
4677   for (; iter != frame.packets.rend(); ++iter) {
4678     const uint64_t gap = previous_smallest - iter->max() - 1;
4679     const uint64_t ack_range = iter->Length() - 1;
4680     ack_frame_size += (QuicDataWriter::GetVarInt62Len(gap) +
4681                        QuicDataWriter::GetVarInt62Len(ack_range));
4682     previous_smallest = iter->min();
4683   }
4684 
4685   if (UseIetfAckWithReceiveTimestamp(frame)) {
4686     ack_frame_size += GetIetfAckFrameTimestampSize(frame);
4687   } else {
4688     ack_frame_size += AckEcnCountSize(frame);
4689   }
4690 
4691   return ack_frame_size;
4692 }
4693 
GetIetfAckFrameTimestampSize(const QuicAckFrame & ack)4694 size_t QuicFramer::GetIetfAckFrameTimestampSize(const QuicAckFrame& ack) {
4695   QUICHE_DCHECK(!ack.received_packet_times.empty());
4696   std::string detailed_error;
4697   absl::InlinedVector<AckTimestampRange, 2> timestamp_ranges =
4698       GetAckTimestampRanges(ack, detailed_error);
4699   if (!detailed_error.empty()) {
4700     return 0;
4701   }
4702 
4703   int64_t size =
4704       FrameAckTimestampRanges(ack, timestamp_ranges, /*writer=*/nullptr);
4705   return std::max<int64_t>(0, size);
4706 }
4707 
GetAckFrameSize(const QuicAckFrame & ack,QuicPacketNumberLength)4708 size_t QuicFramer::GetAckFrameSize(
4709     const QuicAckFrame& ack, QuicPacketNumberLength /*packet_number_length*/) {
4710   QUICHE_DCHECK(!ack.packets.Empty());
4711   size_t ack_size = 0;
4712 
4713   if (VersionHasIetfQuicFrames(version_.transport_version)) {
4714     return GetIetfAckFrameSize(ack);
4715   }
4716   AckFrameInfo ack_info = GetAckFrameInfo(ack);
4717   QuicPacketNumberLength ack_block_length =
4718       GetMinPacketNumberLength(QuicPacketNumber(ack_info.max_block_length));
4719 
4720   ack_size = GetMinAckFrameSize(version_.transport_version, ack,
4721                                 local_ack_delay_exponent_,
4722                                 UseIetfAckWithReceiveTimestamp(ack));
4723   // First ack block length.
4724   ack_size += ack_block_length;
4725   if (ack_info.num_ack_blocks != 0) {
4726     ack_size += kNumberOfAckBlocksSize;
4727     ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) *
4728                 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
4729   }
4730 
4731   // Include timestamps.
4732   if (process_timestamps_) {
4733     ack_size += GetAckFrameTimeStampSize(ack);
4734   }
4735 
4736   return ack_size;
4737 }
4738 
GetAckFrameTimeStampSize(const QuicAckFrame & ack)4739 size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) {
4740   if (ack.received_packet_times.empty()) {
4741     return 0;
4742   }
4743 
4744   return kQuicNumTimestampsLength + kQuicFirstTimestampLength +
4745          (kQuicTimestampLength + kQuicTimestampPacketNumberGapLength) *
4746              (ack.received_packet_times.size() - 1);
4747 }
4748 
ComputeFrameLength(const QuicFrame & frame,bool last_frame_in_packet,QuicPacketNumberLength packet_number_length)4749 size_t QuicFramer::ComputeFrameLength(
4750     const QuicFrame& frame, bool last_frame_in_packet,
4751     QuicPacketNumberLength packet_number_length) {
4752   switch (frame.type) {
4753     case STREAM_FRAME:
4754       return GetMinStreamFrameSize(
4755                  version_.transport_version, frame.stream_frame.stream_id,
4756                  frame.stream_frame.offset, last_frame_in_packet,
4757                  frame.stream_frame.data_length) +
4758              frame.stream_frame.data_length;
4759     case CRYPTO_FRAME:
4760       return GetMinCryptoFrameSize(frame.crypto_frame->offset,
4761                                    frame.crypto_frame->data_length) +
4762              frame.crypto_frame->data_length;
4763     case ACK_FRAME: {
4764       return GetAckFrameSize(*frame.ack_frame, packet_number_length);
4765     }
4766     case STOP_WAITING_FRAME:
4767       return GetStopWaitingFrameSize(packet_number_length);
4768     case MTU_DISCOVERY_FRAME:
4769       // MTU discovery frames are serialized as ping frames.
4770       return kQuicFrameTypeSize;
4771     case MESSAGE_FRAME:
4772       return GetMessageFrameSize(last_frame_in_packet,
4773                                  frame.message_frame->message_length);
4774     case PADDING_FRAME:
4775       QUICHE_DCHECK(false);
4776       return 0;
4777     default:
4778       return GetRetransmittableControlFrameSize(version_.transport_version,
4779                                                 frame);
4780   }
4781 }
4782 
AppendTypeByte(const QuicFrame & frame,bool last_frame_in_packet,QuicDataWriter * writer)4783 bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
4784                                 bool last_frame_in_packet,
4785                                 QuicDataWriter* writer) {
4786   if (VersionHasIetfQuicFrames(version_.transport_version)) {
4787     return AppendIetfFrameType(frame, last_frame_in_packet, writer);
4788   }
4789   uint8_t type_byte = 0;
4790   switch (frame.type) {
4791     case STREAM_FRAME:
4792       type_byte =
4793           GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4794       break;
4795     case ACK_FRAME:
4796       return true;
4797     case MTU_DISCOVERY_FRAME:
4798       type_byte = static_cast<uint8_t>(PING_FRAME);
4799       break;
4800     case NEW_CONNECTION_ID_FRAME:
4801       set_detailed_error(
4802           "Attempt to append NEW_CONNECTION_ID frame and not in IETF QUIC.");
4803       return RaiseError(QUIC_INTERNAL_ERROR);
4804     case RETIRE_CONNECTION_ID_FRAME:
4805       set_detailed_error(
4806           "Attempt to append RETIRE_CONNECTION_ID frame and not in IETF QUIC.");
4807       return RaiseError(QUIC_INTERNAL_ERROR);
4808     case NEW_TOKEN_FRAME:
4809       set_detailed_error(
4810           "Attempt to append NEW_TOKEN frame and not in IETF QUIC.");
4811       return RaiseError(QUIC_INTERNAL_ERROR);
4812     case MAX_STREAMS_FRAME:
4813       set_detailed_error(
4814           "Attempt to append MAX_STREAMS frame and not in IETF QUIC.");
4815       return RaiseError(QUIC_INTERNAL_ERROR);
4816     case STREAMS_BLOCKED_FRAME:
4817       set_detailed_error(
4818           "Attempt to append STREAMS_BLOCKED frame and not in IETF QUIC.");
4819       return RaiseError(QUIC_INTERNAL_ERROR);
4820     case PATH_RESPONSE_FRAME:
4821       set_detailed_error(
4822           "Attempt to append PATH_RESPONSE frame and not in IETF QUIC.");
4823       return RaiseError(QUIC_INTERNAL_ERROR);
4824     case PATH_CHALLENGE_FRAME:
4825       set_detailed_error(
4826           "Attempt to append PATH_CHALLENGE frame and not in IETF QUIC.");
4827       return RaiseError(QUIC_INTERNAL_ERROR);
4828     case STOP_SENDING_FRAME:
4829       set_detailed_error(
4830           "Attempt to append STOP_SENDING frame and not in IETF QUIC.");
4831       return RaiseError(QUIC_INTERNAL_ERROR);
4832     case MESSAGE_FRAME:
4833       return true;
4834 
4835     default:
4836       type_byte = static_cast<uint8_t>(frame.type);
4837       break;
4838   }
4839 
4840   return writer->WriteUInt8(type_byte);
4841 }
4842 
AppendIetfFrameType(const QuicFrame & frame,bool last_frame_in_packet,QuicDataWriter * writer)4843 bool QuicFramer::AppendIetfFrameType(const QuicFrame& frame,
4844                                      bool last_frame_in_packet,
4845                                      QuicDataWriter* writer) {
4846   uint8_t type_byte = 0;
4847   switch (frame.type) {
4848     case PADDING_FRAME:
4849       type_byte = IETF_PADDING;
4850       break;
4851     case RST_STREAM_FRAME:
4852       type_byte = IETF_RST_STREAM;
4853       break;
4854     case CONNECTION_CLOSE_FRAME:
4855       switch (frame.connection_close_frame->close_type) {
4856         case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
4857           type_byte = IETF_APPLICATION_CLOSE;
4858           break;
4859         case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
4860           type_byte = IETF_CONNECTION_CLOSE;
4861           break;
4862         default:
4863           set_detailed_error(absl::StrCat(
4864               "Invalid QuicConnectionCloseFrame type: ",
4865               static_cast<int>(frame.connection_close_frame->close_type)));
4866           return RaiseError(QUIC_INTERNAL_ERROR);
4867       }
4868       break;
4869     case GOAWAY_FRAME:
4870       set_detailed_error(
4871           "Attempt to create non-IETF QUIC GOAWAY frame in IETF QUIC.");
4872       return RaiseError(QUIC_INTERNAL_ERROR);
4873     case WINDOW_UPDATE_FRAME:
4874       // Depending on whether there is a stream ID or not, will be either a
4875       // MAX_STREAM_DATA frame or a MAX_DATA frame.
4876       if (frame.window_update_frame.stream_id ==
4877           QuicUtils::GetInvalidStreamId(transport_version())) {
4878         type_byte = IETF_MAX_DATA;
4879       } else {
4880         type_byte = IETF_MAX_STREAM_DATA;
4881       }
4882       break;
4883     case BLOCKED_FRAME:
4884       if (frame.blocked_frame.stream_id ==
4885           QuicUtils::GetInvalidStreamId(transport_version())) {
4886         type_byte = IETF_DATA_BLOCKED;
4887       } else {
4888         type_byte = IETF_STREAM_DATA_BLOCKED;
4889       }
4890       break;
4891     case STOP_WAITING_FRAME:
4892       set_detailed_error(
4893           "Attempt to append type byte of STOP WAITING frame in IETF QUIC.");
4894       return RaiseError(QUIC_INTERNAL_ERROR);
4895     case PING_FRAME:
4896       type_byte = IETF_PING;
4897       break;
4898     case STREAM_FRAME:
4899       type_byte =
4900           GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4901       break;
4902     case ACK_FRAME:
4903       // Do nothing here, AppendIetfAckFrameAndTypeByte() will put the type byte
4904       // in the buffer.
4905       return true;
4906     case MTU_DISCOVERY_FRAME:
4907       // The path MTU discovery frame is encoded as a PING frame on the wire.
4908       type_byte = IETF_PING;
4909       break;
4910     case NEW_CONNECTION_ID_FRAME:
4911       type_byte = IETF_NEW_CONNECTION_ID;
4912       break;
4913     case RETIRE_CONNECTION_ID_FRAME:
4914       type_byte = IETF_RETIRE_CONNECTION_ID;
4915       break;
4916     case NEW_TOKEN_FRAME:
4917       type_byte = IETF_NEW_TOKEN;
4918       break;
4919     case MAX_STREAMS_FRAME:
4920       if (frame.max_streams_frame.unidirectional) {
4921         type_byte = IETF_MAX_STREAMS_UNIDIRECTIONAL;
4922       } else {
4923         type_byte = IETF_MAX_STREAMS_BIDIRECTIONAL;
4924       }
4925       break;
4926     case STREAMS_BLOCKED_FRAME:
4927       if (frame.streams_blocked_frame.unidirectional) {
4928         type_byte = IETF_STREAMS_BLOCKED_UNIDIRECTIONAL;
4929       } else {
4930         type_byte = IETF_STREAMS_BLOCKED_BIDIRECTIONAL;
4931       }
4932       break;
4933     case PATH_RESPONSE_FRAME:
4934       type_byte = IETF_PATH_RESPONSE;
4935       break;
4936     case PATH_CHALLENGE_FRAME:
4937       type_byte = IETF_PATH_CHALLENGE;
4938       break;
4939     case STOP_SENDING_FRAME:
4940       type_byte = IETF_STOP_SENDING;
4941       break;
4942     case MESSAGE_FRAME:
4943       return true;
4944     case CRYPTO_FRAME:
4945       type_byte = IETF_CRYPTO;
4946       break;
4947     case HANDSHAKE_DONE_FRAME:
4948       type_byte = IETF_HANDSHAKE_DONE;
4949       break;
4950     case ACK_FREQUENCY_FRAME:
4951       type_byte = IETF_ACK_FREQUENCY;
4952       break;
4953     default:
4954       QUIC_BUG(quic_bug_10850_75)
4955           << "Attempt to generate a frame type for an unsupported value: "
4956           << frame.type;
4957       return false;
4958   }
4959   return writer->WriteVarInt62(type_byte);
4960 }
4961 
4962 // static
AppendPacketNumber(QuicPacketNumberLength packet_number_length,QuicPacketNumber packet_number,QuicDataWriter * writer)4963 bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length,
4964                                     QuicPacketNumber packet_number,
4965                                     QuicDataWriter* writer) {
4966   QUICHE_DCHECK(packet_number.IsInitialized());
4967   if (!IsValidPacketNumberLength(packet_number_length)) {
4968     QUIC_BUG(quic_bug_10850_76)
4969         << "Invalid packet_number_length: " << packet_number_length;
4970     return false;
4971   }
4972   return writer->WriteBytesToUInt64(packet_number_length,
4973                                     packet_number.ToUint64());
4974 }
4975 
4976 // static
AppendStreamId(size_t stream_id_length,QuicStreamId stream_id,QuicDataWriter * writer)4977 bool QuicFramer::AppendStreamId(size_t stream_id_length, QuicStreamId stream_id,
4978                                 QuicDataWriter* writer) {
4979   if (stream_id_length == 0 || stream_id_length > 4) {
4980     QUIC_BUG(quic_bug_10850_77)
4981         << "Invalid stream_id_length: " << stream_id_length;
4982     return false;
4983   }
4984   return writer->WriteBytesToUInt64(stream_id_length, stream_id);
4985 }
4986 
4987 // static
AppendStreamOffset(size_t offset_length,QuicStreamOffset offset,QuicDataWriter * writer)4988 bool QuicFramer::AppendStreamOffset(size_t offset_length,
4989                                     QuicStreamOffset offset,
4990                                     QuicDataWriter* writer) {
4991   if (offset_length == 1 || offset_length > 8) {
4992     QUIC_BUG(quic_bug_10850_78)
4993         << "Invalid stream_offset_length: " << offset_length;
4994     return false;
4995   }
4996 
4997   return writer->WriteBytesToUInt64(offset_length, offset);
4998 }
4999 
5000 // static
AppendAckBlock(uint8_t gap,QuicPacketNumberLength length_length,uint64_t length,QuicDataWriter * writer)5001 bool QuicFramer::AppendAckBlock(uint8_t gap,
5002                                 QuicPacketNumberLength length_length,
5003                                 uint64_t length, QuicDataWriter* writer) {
5004   if (length == 0) {
5005     if (!IsValidPacketNumberLength(length_length)) {
5006       QUIC_BUG(quic_bug_10850_79)
5007           << "Invalid packet_number_length: " << length_length;
5008       return false;
5009     }
5010     return writer->WriteUInt8(gap) &&
5011            writer->WriteBytesToUInt64(length_length, length);
5012   }
5013   return writer->WriteUInt8(gap) &&
5014          AppendPacketNumber(length_length, QuicPacketNumber(length), writer);
5015 }
5016 
AppendStreamFrame(const QuicStreamFrame & frame,bool no_stream_frame_length,QuicDataWriter * writer)5017 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
5018                                    bool no_stream_frame_length,
5019                                    QuicDataWriter* writer) {
5020   if (VersionHasIetfQuicFrames(version_.transport_version)) {
5021     return AppendIetfStreamFrame(frame, no_stream_frame_length, writer);
5022   }
5023   if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
5024                       writer)) {
5025     QUIC_BUG(quic_bug_10850_80) << "Writing stream id size failed.";
5026     return false;
5027   }
5028   if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset,
5029                           writer)) {
5030     QUIC_BUG(quic_bug_10850_81) << "Writing offset size failed.";
5031     return false;
5032   }
5033   if (!no_stream_frame_length) {
5034     static_assert(
5035         std::numeric_limits<decltype(frame.data_length)>::max() <=
5036             std::numeric_limits<uint16_t>::max(),
5037         "If frame.data_length can hold more than a uint16_t than we need to "
5038         "check that frame.data_length <= std::numeric_limits<uint16_t>::max()");
5039     if (!writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) {
5040       QUIC_BUG(quic_bug_10850_82) << "Writing stream frame length failed";
5041       return false;
5042     }
5043   }
5044 
5045   if (data_producer_ != nullptr) {
5046     QUICHE_DCHECK_EQ(nullptr, frame.data_buffer);
5047     if (frame.data_length == 0) {
5048       return true;
5049     }
5050     if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
5051                                         frame.data_length,
5052                                         writer) != WRITE_SUCCESS) {
5053       QUIC_BUG(quic_bug_10850_83) << "Writing frame data failed.";
5054       return false;
5055     }
5056     return true;
5057   }
5058 
5059   if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
5060     QUIC_BUG(quic_bug_10850_84) << "Writing frame data failed.";
5061     return false;
5062   }
5063   return true;
5064 }
5065 
AppendNewTokenFrame(const QuicNewTokenFrame & frame,QuicDataWriter * writer)5066 bool QuicFramer::AppendNewTokenFrame(const QuicNewTokenFrame& frame,
5067                                      QuicDataWriter* writer) {
5068   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.token.length()))) {
5069     set_detailed_error("Writing token length failed.");
5070     return false;
5071   }
5072   if (!writer->WriteBytes(frame.token.data(), frame.token.length())) {
5073     set_detailed_error("Writing token buffer failed.");
5074     return false;
5075   }
5076   return true;
5077 }
5078 
ProcessNewTokenFrame(QuicDataReader * reader,QuicNewTokenFrame * frame)5079 bool QuicFramer::ProcessNewTokenFrame(QuicDataReader* reader,
5080                                       QuicNewTokenFrame* frame) {
5081   uint64_t length;
5082   if (!reader->ReadVarInt62(&length)) {
5083     set_detailed_error("Unable to read new token length.");
5084     return false;
5085   }
5086   if (length > kMaxNewTokenTokenLength) {
5087     set_detailed_error("Token length larger than maximum.");
5088     return false;
5089   }
5090 
5091   // TODO(ianswett): Don't use absl::string_view as an intermediary.
5092   absl::string_view data;
5093   if (!reader->ReadStringPiece(&data, length)) {
5094     set_detailed_error("Unable to read new token data.");
5095     return false;
5096   }
5097   frame->token = std::string(data);
5098   return true;
5099 }
5100 
5101 // Add a new ietf-format stream frame.
5102 // Bits controlling whether there is a frame-length and frame-offset
5103 // are in the QuicStreamFrame.
AppendIetfStreamFrame(const QuicStreamFrame & frame,bool last_frame_in_packet,QuicDataWriter * writer)5104 bool QuicFramer::AppendIetfStreamFrame(const QuicStreamFrame& frame,
5105                                        bool last_frame_in_packet,
5106                                        QuicDataWriter* writer) {
5107   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
5108     set_detailed_error("Writing stream id failed.");
5109     return false;
5110   }
5111 
5112   if (frame.offset != 0) {
5113     if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
5114       set_detailed_error("Writing data offset failed.");
5115       return false;
5116     }
5117   }
5118 
5119   if (!last_frame_in_packet) {
5120     if (!writer->WriteVarInt62(frame.data_length)) {
5121       set_detailed_error("Writing data length failed.");
5122       return false;
5123     }
5124   }
5125 
5126   if (frame.data_length == 0) {
5127     return true;
5128   }
5129   if (data_producer_ == nullptr) {
5130     if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
5131       set_detailed_error("Writing frame data failed.");
5132       return false;
5133     }
5134   } else {
5135     QUICHE_DCHECK_EQ(nullptr, frame.data_buffer);
5136 
5137     if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
5138                                         frame.data_length,
5139                                         writer) != WRITE_SUCCESS) {
5140       set_detailed_error("Writing frame data from producer failed.");
5141       return false;
5142     }
5143   }
5144   return true;
5145 }
5146 
AppendCryptoFrame(const QuicCryptoFrame & frame,QuicDataWriter * writer)5147 bool QuicFramer::AppendCryptoFrame(const QuicCryptoFrame& frame,
5148                                    QuicDataWriter* writer) {
5149   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
5150     set_detailed_error("Writing data offset failed.");
5151     return false;
5152   }
5153   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.data_length))) {
5154     set_detailed_error("Writing data length failed.");
5155     return false;
5156   }
5157   if (data_producer_ == nullptr) {
5158     if (frame.data_buffer == nullptr ||
5159         !writer->WriteBytes(frame.data_buffer, frame.data_length)) {
5160       set_detailed_error("Writing frame data failed.");
5161       return false;
5162     }
5163   } else {
5164     QUICHE_DCHECK_EQ(nullptr, frame.data_buffer);
5165     if (!data_producer_->WriteCryptoData(frame.level, frame.offset,
5166                                          frame.data_length, writer)) {
5167       return false;
5168     }
5169   }
5170   return true;
5171 }
5172 
AppendAckFrequencyFrame(const QuicAckFrequencyFrame & frame,QuicDataWriter * writer)5173 bool QuicFramer::AppendAckFrequencyFrame(const QuicAckFrequencyFrame& frame,
5174                                          QuicDataWriter* writer) {
5175   if (!writer->WriteVarInt62(frame.sequence_number)) {
5176     set_detailed_error("Writing sequence number failed.");
5177     return false;
5178   }
5179   if (!writer->WriteVarInt62(frame.packet_tolerance)) {
5180     set_detailed_error("Writing packet tolerance failed.");
5181     return false;
5182   }
5183   if (!writer->WriteVarInt62(
5184           static_cast<uint64_t>(frame.max_ack_delay.ToMicroseconds()))) {
5185     set_detailed_error("Writing max_ack_delay_us failed.");
5186     return false;
5187   }
5188   if (!writer->WriteUInt8(static_cast<uint8_t>(frame.ignore_order))) {
5189     set_detailed_error("Writing ignore_order failed.");
5190     return false;
5191   }
5192 
5193   return true;
5194 }
5195 
set_version(const ParsedQuicVersion version)5196 void QuicFramer::set_version(const ParsedQuicVersion version) {
5197   QUICHE_DCHECK(IsSupportedVersion(version))
5198       << ParsedQuicVersionToString(version);
5199   version_ = version;
5200 }
5201 
AppendAckFrameAndTypeByte(const QuicAckFrame & frame,QuicDataWriter * writer)5202 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
5203                                            QuicDataWriter* writer) {
5204   if (VersionHasIetfQuicFrames(transport_version())) {
5205     return AppendIetfAckFrameAndTypeByte(frame, writer);
5206   }
5207 
5208   const AckFrameInfo new_ack_info = GetAckFrameInfo(frame);
5209   QuicPacketNumber largest_acked = LargestAcked(frame);
5210   QuicPacketNumberLength largest_acked_length =
5211       GetMinPacketNumberLength(largest_acked);
5212   QuicPacketNumberLength ack_block_length =
5213       GetMinPacketNumberLength(QuicPacketNumber(new_ack_info.max_block_length));
5214   // Calculate available bytes for timestamps and ack blocks.
5215   int32_t available_timestamp_and_ack_block_bytes =
5216       writer->capacity() - writer->length() - ack_block_length -
5217       GetMinAckFrameSize(version_.transport_version, frame,
5218                          local_ack_delay_exponent_,
5219                          UseIetfAckWithReceiveTimestamp(frame)) -
5220       (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0);
5221   QUICHE_DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
5222 
5223   uint8_t type_byte = 0;
5224   SetBit(&type_byte, new_ack_info.num_ack_blocks != 0,
5225          kQuicHasMultipleAckBlocksOffset);
5226 
5227   SetBits(&type_byte, GetPacketNumberFlags(largest_acked_length),
5228           kQuicSequenceNumberLengthNumBits, kLargestAckedOffset);
5229 
5230   SetBits(&type_byte, GetPacketNumberFlags(ack_block_length),
5231           kQuicSequenceNumberLengthNumBits, kActBlockLengthOffset);
5232 
5233   type_byte |= kQuicFrameTypeAckMask;
5234 
5235   if (!writer->WriteUInt8(type_byte)) {
5236     return false;
5237   }
5238 
5239   size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes /
5240                               (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
5241 
5242   // Number of ack blocks.
5243   size_t num_ack_blocks =
5244       std::min(new_ack_info.num_ack_blocks, max_num_ack_blocks);
5245   if (num_ack_blocks > std::numeric_limits<uint8_t>::max()) {
5246     num_ack_blocks = std::numeric_limits<uint8_t>::max();
5247   }
5248 
5249   // Largest acked.
5250   if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) {
5251     return false;
5252   }
5253 
5254   // Largest acked delta time.
5255   uint64_t ack_delay_time_us = kUFloat16MaxValue;
5256   if (!frame.ack_delay_time.IsInfinite()) {
5257     QUICHE_DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
5258     ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
5259   }
5260   if (!writer->WriteUFloat16(ack_delay_time_us)) {
5261     return false;
5262   }
5263 
5264   if (num_ack_blocks > 0) {
5265     if (!writer->WriteBytes(&num_ack_blocks, 1)) {
5266       return false;
5267     }
5268   }
5269 
5270   // First ack block length.
5271   if (!AppendPacketNumber(ack_block_length,
5272                           QuicPacketNumber(new_ack_info.first_block_length),
5273                           writer)) {
5274     return false;
5275   }
5276 
5277   // Ack blocks.
5278   if (num_ack_blocks > 0) {
5279     size_t num_ack_blocks_written = 0;
5280     // Append, in descending order from the largest ACKed packet, a series of
5281     // ACK blocks that represents the successfully acknoweldged packets. Each
5282     // appended gap/block length represents a descending delta from the previous
5283     // block. i.e.:
5284     // |--- length ---|--- gap ---|--- length ---|--- gap ---|--- largest ---|
5285     // For gaps larger than can be represented by a single encoded gap, a 0
5286     // length gap of the maximum is used, i.e.:
5287     // |--- length ---|--- gap ---|- 0 -|--- gap ---|--- largest ---|
5288     auto itr = frame.packets.rbegin();
5289     QuicPacketNumber previous_start = itr->min();
5290     ++itr;
5291 
5292     for (;
5293          itr != frame.packets.rend() && num_ack_blocks_written < num_ack_blocks;
5294          previous_start = itr->min(), ++itr) {
5295       const auto& interval = *itr;
5296       const uint64_t total_gap = previous_start - interval.max();
5297       const size_t num_encoded_gaps =
5298           (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
5299           std::numeric_limits<uint8_t>::max();
5300 
5301       // Append empty ACK blocks because the gap is longer than a single gap.
5302       for (size_t i = 1;
5303            i < num_encoded_gaps && num_ack_blocks_written < num_ack_blocks;
5304            ++i) {
5305         if (!AppendAckBlock(std::numeric_limits<uint8_t>::max(),
5306                             ack_block_length, 0, writer)) {
5307           return false;
5308         }
5309         ++num_ack_blocks_written;
5310       }
5311       if (num_ack_blocks_written >= num_ack_blocks) {
5312         if (ABSL_PREDICT_FALSE(num_ack_blocks_written != num_ack_blocks)) {
5313           QUIC_BUG(quic_bug_10850_85)
5314               << "Wrote " << num_ack_blocks_written << ", expected to write "
5315               << num_ack_blocks;
5316         }
5317         break;
5318       }
5319 
5320       const uint8_t last_gap =
5321           total_gap -
5322           (num_encoded_gaps - 1) * std::numeric_limits<uint8_t>::max();
5323       // Append the final ACK block with a non-empty size.
5324       if (!AppendAckBlock(last_gap, ack_block_length, interval.Length(),
5325                           writer)) {
5326         return false;
5327       }
5328       ++num_ack_blocks_written;
5329     }
5330     QUICHE_DCHECK_EQ(num_ack_blocks, num_ack_blocks_written);
5331   }
5332   // Timestamps.
5333   // If we don't process timestamps or if we don't have enough available space
5334   // to append all the timestamps, don't append any of them.
5335   if (process_timestamps_ && writer->capacity() - writer->length() >=
5336                                  GetAckFrameTimeStampSize(frame)) {
5337     if (!AppendTimestampsToAckFrame(frame, writer)) {
5338       return false;
5339     }
5340   } else {
5341     uint8_t num_received_packets = 0;
5342     if (!writer->WriteBytes(&num_received_packets, 1)) {
5343       return false;
5344     }
5345   }
5346 
5347   return true;
5348 }
5349 
AppendTimestampsToAckFrame(const QuicAckFrame & frame,QuicDataWriter * writer)5350 bool QuicFramer::AppendTimestampsToAckFrame(const QuicAckFrame& frame,
5351                                             QuicDataWriter* writer) {
5352   QUICHE_DCHECK_GE(std::numeric_limits<uint8_t>::max(),
5353                    frame.received_packet_times.size());
5354   // num_received_packets is only 1 byte.
5355   if (frame.received_packet_times.size() >
5356       std::numeric_limits<uint8_t>::max()) {
5357     return false;
5358   }
5359 
5360   uint8_t num_received_packets = frame.received_packet_times.size();
5361   if (!writer->WriteBytes(&num_received_packets, 1)) {
5362     return false;
5363   }
5364   if (num_received_packets == 0) {
5365     return true;
5366   }
5367 
5368   auto it = frame.received_packet_times.begin();
5369   QuicPacketNumber packet_number = it->first;
5370   uint64_t delta_from_largest_observed = LargestAcked(frame) - packet_number;
5371 
5372   QUICHE_DCHECK_GE(std::numeric_limits<uint8_t>::max(),
5373                    delta_from_largest_observed);
5374   if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
5375     return false;
5376   }
5377 
5378   if (!writer->WriteUInt8(delta_from_largest_observed)) {
5379     return false;
5380   }
5381 
5382   // Use the lowest 4 bytes of the time delta from the creation_time_.
5383   const uint64_t time_epoch_delta_us = UINT64_C(1) << 32;
5384   uint32_t time_delta_us =
5385       static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() &
5386                             (time_epoch_delta_us - 1));
5387   if (!writer->WriteUInt32(time_delta_us)) {
5388     return false;
5389   }
5390 
5391   QuicTime prev_time = it->second;
5392 
5393   for (++it; it != frame.received_packet_times.end(); ++it) {
5394     packet_number = it->first;
5395     delta_from_largest_observed = LargestAcked(frame) - packet_number;
5396 
5397     if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
5398       return false;
5399     }
5400 
5401     if (!writer->WriteUInt8(delta_from_largest_observed)) {
5402       return false;
5403     }
5404 
5405     uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds();
5406     prev_time = it->second;
5407     if (!writer->WriteUFloat16(frame_time_delta_us)) {
5408       return false;
5409     }
5410   }
5411   return true;
5412 }
5413 
5414 absl::InlinedVector<QuicFramer::AckTimestampRange, 2>
GetAckTimestampRanges(const QuicAckFrame & frame,std::string & detailed_error) const5415 QuicFramer::GetAckTimestampRanges(const QuicAckFrame& frame,
5416                                   std::string& detailed_error) const {
5417   detailed_error = "";
5418   if (frame.received_packet_times.empty()) {
5419     return {};
5420   }
5421 
5422   absl::InlinedVector<AckTimestampRange, 2> timestamp_ranges;
5423 
5424   for (size_t r = 0; r < std::min<size_t>(max_receive_timestamps_per_ack_,
5425                                           frame.received_packet_times.size());
5426        ++r) {
5427     const size_t i = frame.received_packet_times.size() - 1 - r;
5428     const QuicPacketNumber packet_number = frame.received_packet_times[i].first;
5429     const QuicTime receive_timestamp = frame.received_packet_times[i].second;
5430 
5431     if (timestamp_ranges.empty()) {
5432       if (receive_timestamp < creation_time_ ||
5433           LargestAcked(frame) < packet_number) {
5434         detailed_error =
5435             "The first packet is either received earlier than framer creation "
5436             "time, or larger than largest acked packet.";
5437         QUIC_BUG(quic_framer_ack_ts_first_packet_bad)
5438             << detailed_error << " receive_timestamp:" << receive_timestamp
5439             << ", framer_creation_time:" << creation_time_
5440             << ", packet_number:" << packet_number
5441             << ", largest_acked:" << LargestAcked(frame);
5442         return {};
5443       }
5444       timestamp_ranges.push_back(AckTimestampRange());
5445       timestamp_ranges.back().gap = LargestAcked(frame) - packet_number;
5446       timestamp_ranges.back().range_begin = i;
5447       timestamp_ranges.back().range_end = i;
5448       continue;
5449     }
5450 
5451     const size_t prev_i = timestamp_ranges.back().range_end;
5452     const QuicPacketNumber prev_packet_number =
5453         frame.received_packet_times[prev_i].first;
5454     const QuicTime prev_receive_timestamp =
5455         frame.received_packet_times[prev_i].second;
5456 
5457     QUIC_DVLOG(3) << "prev_packet_number:" << prev_packet_number
5458                   << ", packet_number:" << packet_number;
5459     if (prev_receive_timestamp < receive_timestamp ||
5460         prev_packet_number <= packet_number) {
5461       detailed_error = "Packet number and/or receive time not in order.";
5462       QUIC_BUG(quic_framer_ack_ts_packet_out_of_order)
5463           << detailed_error << " packet_number:" << packet_number
5464           << ", receive_timestamp:" << receive_timestamp
5465           << ", prev_packet_number:" << prev_packet_number
5466           << ", prev_receive_timestamp:" << prev_receive_timestamp;
5467       return {};
5468     }
5469 
5470     if (prev_packet_number == packet_number + 1) {
5471       timestamp_ranges.back().range_end = i;
5472     } else {
5473       timestamp_ranges.push_back(AckTimestampRange());
5474       timestamp_ranges.back().gap = prev_packet_number - 2 - packet_number;
5475       timestamp_ranges.back().range_begin = i;
5476       timestamp_ranges.back().range_end = i;
5477     }
5478   }
5479 
5480   return timestamp_ranges;
5481 }
5482 
FrameAckTimestampRanges(const QuicAckFrame & frame,const absl::InlinedVector<AckTimestampRange,2> & timestamp_ranges,QuicDataWriter * writer) const5483 int64_t QuicFramer::FrameAckTimestampRanges(
5484     const QuicAckFrame& frame,
5485     const absl::InlinedVector<AckTimestampRange, 2>& timestamp_ranges,
5486     QuicDataWriter* writer) const {
5487   int64_t size = 0;
5488   auto maybe_write_var_int62 = [&](uint64_t value) {
5489     size += QuicDataWriter::GetVarInt62Len(value);
5490     if (writer != nullptr && !writer->WriteVarInt62(value)) {
5491       return false;
5492     }
5493     return true;
5494   };
5495 
5496   if (!maybe_write_var_int62(timestamp_ranges.size())) {
5497     return -1;
5498   }
5499 
5500   // |effective_prev_time| is the exponent-encoded timestamp of the previous
5501   // packet.
5502   std::optional<QuicTime> effective_prev_time;
5503   for (const AckTimestampRange& range : timestamp_ranges) {
5504     QUIC_DVLOG(3) << "Range: gap:" << range.gap << ", beg:" << range.range_begin
5505                   << ", end:" << range.range_end;
5506     if (!maybe_write_var_int62(range.gap)) {
5507       return -1;
5508     }
5509 
5510     if (!maybe_write_var_int62(range.range_begin - range.range_end + 1)) {
5511       return -1;
5512     }
5513 
5514     for (int64_t i = range.range_begin; i >= range.range_end; --i) {
5515       const QuicTime receive_timestamp = frame.received_packet_times[i].second;
5516       uint64_t time_delta;
5517       if (effective_prev_time.has_value()) {
5518         time_delta =
5519             (*effective_prev_time - receive_timestamp).ToMicroseconds();
5520         QUIC_DVLOG(3) << "time_delta:" << time_delta
5521                       << ", exponent:" << receive_timestamps_exponent_
5522                       << ", effective_prev_time:" << *effective_prev_time
5523                       << ", recv_time:" << receive_timestamp;
5524         time_delta = time_delta >> receive_timestamps_exponent_;
5525         effective_prev_time = *effective_prev_time -
5526                               QuicTime::Delta::FromMicroseconds(
5527                                   time_delta << receive_timestamps_exponent_);
5528       } else {
5529         // The first delta is from framer creation to the current receive
5530         // timestamp (forward in time), whereas in the common case subsequent
5531         // deltas move backwards in time.
5532         time_delta = (receive_timestamp - creation_time_).ToMicroseconds();
5533         QUIC_DVLOG(3) << "First time_delta:" << time_delta
5534                       << ", exponent:" << receive_timestamps_exponent_
5535                       << ", recv_time:" << receive_timestamp
5536                       << ", creation_time:" << creation_time_;
5537         // Round up the first exponent-encoded time delta so that the next
5538         // receive timestamp is guaranteed to be decreasing.
5539         time_delta = ((time_delta - 1) >> receive_timestamps_exponent_) + 1;
5540         effective_prev_time =
5541             creation_time_ + QuicTime::Delta::FromMicroseconds(
5542                                  time_delta << receive_timestamps_exponent_);
5543       }
5544 
5545       if (!maybe_write_var_int62(time_delta)) {
5546         return -1;
5547       }
5548     }
5549   }
5550 
5551   return size;
5552 }
5553 
AppendIetfTimestampsToAckFrame(const QuicAckFrame & frame,QuicDataWriter * writer)5554 bool QuicFramer::AppendIetfTimestampsToAckFrame(const QuicAckFrame& frame,
5555                                                 QuicDataWriter* writer) {
5556   QUICHE_DCHECK(!frame.received_packet_times.empty());
5557   std::string detailed_error;
5558   const absl::InlinedVector<AckTimestampRange, 2> timestamp_ranges =
5559       GetAckTimestampRanges(frame, detailed_error);
5560   if (!detailed_error.empty()) {
5561     set_detailed_error(std::move(detailed_error));
5562     return false;
5563   }
5564 
5565   // Compute the size first using a null writer.
5566   int64_t size =
5567       FrameAckTimestampRanges(frame, timestamp_ranges, /*writer=*/nullptr);
5568   if (size > static_cast<int64_t>(writer->capacity() - writer->length())) {
5569     QUIC_DVLOG(1) << "Insufficient room to write IETF ack receive timestamps. "
5570                      "size_remain:"
5571                   << (writer->capacity() - writer->length())
5572                   << ", size_needed:" << size;
5573     // Write a Timestamp Range Count of 0.
5574     return writer->WriteVarInt62(0);
5575   }
5576 
5577   return FrameAckTimestampRanges(frame, timestamp_ranges, writer) > 0;
5578 }
5579 
AppendIetfAckFrameAndTypeByte(const QuicAckFrame & frame,QuicDataWriter * writer)5580 bool QuicFramer::AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
5581                                                QuicDataWriter* writer) {
5582   uint8_t type = IETF_ACK;
5583   uint64_t ecn_size = 0;
5584   if (UseIetfAckWithReceiveTimestamp(frame)) {
5585     type = IETF_ACK_RECEIVE_TIMESTAMPS;
5586   } else if (frame.ecn_counters.has_value()) {
5587     // Change frame type to ACK_ECN if any ECN count is available.
5588     type = IETF_ACK_ECN;
5589     ecn_size = AckEcnCountSize(frame);
5590   }
5591 
5592   if (!writer->WriteVarInt62(type)) {
5593     set_detailed_error("No room for frame-type");
5594     return false;
5595   }
5596 
5597   QuicPacketNumber largest_acked = LargestAcked(frame);
5598   if (!writer->WriteVarInt62(largest_acked.ToUint64())) {
5599     set_detailed_error("No room for largest-acked in ack frame");
5600     return false;
5601   }
5602 
5603   uint64_t ack_delay_time_us = quiche::kVarInt62MaxValue;
5604   if (!frame.ack_delay_time.IsInfinite()) {
5605     QUICHE_DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
5606     ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
5607     ack_delay_time_us = ack_delay_time_us >> local_ack_delay_exponent_;
5608   }
5609 
5610   if (!writer->WriteVarInt62(ack_delay_time_us)) {
5611     set_detailed_error("No room for ack-delay in ack frame");
5612     return false;
5613   }
5614 
5615   if (frame.packets.Empty() || frame.packets.Max() != largest_acked) {
5616     QUIC_BUG(quic_bug_10850_88) << "Malformed ack frame: " << frame;
5617     set_detailed_error("Malformed ack frame");
5618     return false;
5619   }
5620 
5621   // Latch ack_block_count for potential truncation.
5622   const uint64_t ack_block_count = frame.packets.NumIntervals() - 1;
5623   QuicDataWriter count_writer(QuicDataWriter::GetVarInt62Len(ack_block_count),
5624                               writer->data() + writer->length());
5625   if (!writer->WriteVarInt62(ack_block_count)) {
5626     set_detailed_error("No room for ack block count in ack frame");
5627     return false;
5628   }
5629   auto iter = frame.packets.rbegin();
5630   if (!writer->WriteVarInt62(iter->Length() - 1)) {
5631     set_detailed_error("No room for first ack block in ack frame");
5632     return false;
5633   }
5634   QuicPacketNumber previous_smallest = iter->min();
5635   ++iter;
5636   // Append remaining ACK blocks.
5637   uint64_t appended_ack_blocks = 0;
5638   for (; iter != frame.packets.rend(); ++iter) {
5639     const uint64_t gap = previous_smallest - iter->max() - 1;
5640     const uint64_t ack_range = iter->Length() - 1;
5641 
5642     if (type == IETF_ACK_RECEIVE_TIMESTAMPS &&
5643         writer->remaining() <
5644             static_cast<size_t>(QuicDataWriter::GetVarInt62Len(gap) +
5645                                 QuicDataWriter::GetVarInt62Len(ack_range) +
5646                                 QuicDataWriter::GetVarInt62Len(0))) {
5647       // If we write this ACK range we won't have space for a timestamp range
5648       // count of 0.
5649       break;
5650     } else if (writer->remaining() < ecn_size ||
5651                writer->remaining() - ecn_size <
5652                    static_cast<size_t>(
5653                        QuicDataWriter::GetVarInt62Len(gap) +
5654                        QuicDataWriter::GetVarInt62Len(ack_range))) {
5655       // ACK range does not fit, truncate it.
5656       break;
5657     }
5658     const bool success =
5659         writer->WriteVarInt62(gap) && writer->WriteVarInt62(ack_range);
5660     QUICHE_DCHECK(success);
5661     previous_smallest = iter->min();
5662     ++appended_ack_blocks;
5663   }
5664 
5665   if (appended_ack_blocks < ack_block_count) {
5666     // Truncation is needed, rewrite the ack block count.
5667     if (QuicDataWriter::GetVarInt62Len(appended_ack_blocks) !=
5668             QuicDataWriter::GetVarInt62Len(ack_block_count) ||
5669         !count_writer.WriteVarInt62(appended_ack_blocks)) {
5670       // This should never happen as ack_block_count is limited by
5671       // max_ack_ranges_.
5672       QUIC_BUG(quic_bug_10850_89)
5673           << "Ack frame truncation fails. ack_block_count: " << ack_block_count
5674           << ", appended count: " << appended_ack_blocks;
5675       set_detailed_error("ACK frame truncation fails");
5676       return false;
5677     }
5678     QUIC_DLOG(INFO) << ENDPOINT << "ACK ranges get truncated from "
5679                     << ack_block_count << " to " << appended_ack_blocks;
5680   }
5681 
5682   if (type == IETF_ACK_ECN) {
5683     // Encode the ECN counts.
5684     if (!writer->WriteVarInt62(frame.ecn_counters->ect0)) {
5685       set_detailed_error("No room for ect_0_count in ack frame");
5686       return false;
5687     }
5688     if (!writer->WriteVarInt62(frame.ecn_counters->ect1)) {
5689       set_detailed_error("No room for ect_1_count in ack frame");
5690       return false;
5691     }
5692     if (!writer->WriteVarInt62(frame.ecn_counters->ce)) {
5693       set_detailed_error("No room for ecn_ce_count in ack frame");
5694       return false;
5695     }
5696   }
5697 
5698   if (type == IETF_ACK_RECEIVE_TIMESTAMPS) {
5699     if (!AppendIetfTimestampsToAckFrame(frame, writer)) {
5700       return false;
5701     }
5702   }
5703 
5704   return true;
5705 }
5706 
AppendRstStreamFrame(const QuicRstStreamFrame & frame,QuicDataWriter * writer)5707 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame,
5708                                       QuicDataWriter* writer) {
5709   if (VersionHasIetfQuicFrames(version_.transport_version)) {
5710     return AppendIetfResetStreamFrame(frame, writer);
5711   }
5712   if (!writer->WriteUInt32(frame.stream_id)) {
5713     return false;
5714   }
5715 
5716   if (!writer->WriteUInt64(frame.byte_offset)) {
5717     return false;
5718   }
5719 
5720   uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5721   if (!writer->WriteUInt32(error_code)) {
5722     return false;
5723   }
5724 
5725   return true;
5726 }
5727 
AppendConnectionCloseFrame(const QuicConnectionCloseFrame & frame,QuicDataWriter * writer)5728 bool QuicFramer::AppendConnectionCloseFrame(
5729     const QuicConnectionCloseFrame& frame, QuicDataWriter* writer) {
5730   if (VersionHasIetfQuicFrames(version_.transport_version)) {
5731     return AppendIetfConnectionCloseFrame(frame, writer);
5732   }
5733   uint32_t error_code = static_cast<uint32_t>(frame.wire_error_code);
5734   if (!writer->WriteUInt32(error_code)) {
5735     return false;
5736   }
5737   if (!writer->WriteStringPiece16(TruncateErrorString(frame.error_details))) {
5738     return false;
5739   }
5740   return true;
5741 }
5742 
AppendGoAwayFrame(const QuicGoAwayFrame & frame,QuicDataWriter * writer)5743 bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame,
5744                                    QuicDataWriter* writer) {
5745   uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5746   if (!writer->WriteUInt32(error_code)) {
5747     return false;
5748   }
5749   uint32_t stream_id = static_cast<uint32_t>(frame.last_good_stream_id);
5750   if (!writer->WriteUInt32(stream_id)) {
5751     return false;
5752   }
5753   if (!writer->WriteStringPiece16(TruncateErrorString(frame.reason_phrase))) {
5754     return false;
5755   }
5756   return true;
5757 }
5758 
AppendWindowUpdateFrame(const QuicWindowUpdateFrame & frame,QuicDataWriter * writer)5759 bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
5760                                          QuicDataWriter* writer) {
5761   uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5762   if (!writer->WriteUInt32(stream_id)) {
5763     return false;
5764   }
5765   if (!writer->WriteUInt64(frame.max_data)) {
5766     return false;
5767   }
5768   return true;
5769 }
5770 
AppendBlockedFrame(const QuicBlockedFrame & frame,QuicDataWriter * writer)5771 bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame,
5772                                     QuicDataWriter* writer) {
5773   if (VersionHasIetfQuicFrames(version_.transport_version)) {
5774     if (frame.stream_id == QuicUtils::GetInvalidStreamId(transport_version())) {
5775       return AppendDataBlockedFrame(frame, writer);
5776     }
5777     return AppendStreamDataBlockedFrame(frame, writer);
5778   }
5779   uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5780   if (!writer->WriteUInt32(stream_id)) {
5781     return false;
5782   }
5783   return true;
5784 }
5785 
AppendPaddingFrame(const QuicPaddingFrame & frame,QuicDataWriter * writer)5786 bool QuicFramer::AppendPaddingFrame(const QuicPaddingFrame& frame,
5787                                     QuicDataWriter* writer) {
5788   if (frame.num_padding_bytes == 0) {
5789     return false;
5790   }
5791   if (frame.num_padding_bytes < 0) {
5792     QUIC_BUG_IF(quic_bug_12975_9, frame.num_padding_bytes != -1);
5793     writer->WritePadding();
5794     return true;
5795   }
5796   // Please note, num_padding_bytes includes type byte which has been written.
5797   return writer->WritePaddingBytes(frame.num_padding_bytes - 1);
5798 }
5799 
AppendMessageFrameAndTypeByte(const QuicMessageFrame & frame,bool last_frame_in_packet,QuicDataWriter * writer)5800 bool QuicFramer::AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
5801                                                bool last_frame_in_packet,
5802                                                QuicDataWriter* writer) {
5803   uint8_t type_byte;
5804   if (VersionHasIetfQuicFrames(version_.transport_version)) {
5805     type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH_V99
5806                                      : IETF_EXTENSION_MESSAGE_V99;
5807   } else {
5808     type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH
5809                                      : IETF_EXTENSION_MESSAGE;
5810   }
5811   if (!writer->WriteUInt8(type_byte)) {
5812     return false;
5813   }
5814   if (!last_frame_in_packet && !writer->WriteVarInt62(frame.message_length)) {
5815     return false;
5816   }
5817   for (const auto& slice : frame.message_data) {
5818     if (!writer->WriteBytes(slice.data(), slice.length())) {
5819       return false;
5820     }
5821   }
5822   return true;
5823 }
5824 
RaiseError(QuicErrorCode error)5825 bool QuicFramer::RaiseError(QuicErrorCode error) {
5826   QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error)
5827                   << " detail: " << detailed_error_;
5828   set_error(error);
5829   if (visitor_) {
5830     visitor_->OnError(this);
5831   }
5832   return false;
5833 }
5834 
IsVersionNegotiation(const QuicPacketHeader & header) const5835 bool QuicFramer::IsVersionNegotiation(const QuicPacketHeader& header) const {
5836   return header.form == IETF_QUIC_LONG_HEADER_PACKET &&
5837          header.long_packet_type == VERSION_NEGOTIATION;
5838 }
5839 
AppendIetfConnectionCloseFrame(const QuicConnectionCloseFrame & frame,QuicDataWriter * writer)5840 bool QuicFramer::AppendIetfConnectionCloseFrame(
5841     const QuicConnectionCloseFrame& frame, QuicDataWriter* writer) {
5842   if (frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE &&
5843       frame.close_type != IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
5844     QUIC_BUG(quic_bug_10850_90)
5845         << "Invalid close_type for writing IETF CONNECTION CLOSE.";
5846     set_detailed_error("Invalid close_type for writing IETF CONNECTION CLOSE.");
5847     return false;
5848   }
5849 
5850   if (!writer->WriteVarInt62(frame.wire_error_code)) {
5851     set_detailed_error("Can not write connection close frame error code");
5852     return false;
5853   }
5854 
5855   if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5856     // Write the frame-type of the frame causing the error only
5857     // if it's a CONNECTION_CLOSE/Transport.
5858     if (!writer->WriteVarInt62(frame.transport_close_frame_type)) {
5859       set_detailed_error("Writing frame type failed.");
5860       return false;
5861     }
5862   }
5863 
5864   // There may be additional error information available in the extracted error
5865   // code. Encode the error information in the reason phrase and serialize the
5866   // result.
5867   std::string final_error_string =
5868       GenerateErrorString(frame.error_details, frame.quic_error_code);
5869   if (!writer->WriteStringPieceVarInt62(
5870           TruncateErrorString(final_error_string))) {
5871     set_detailed_error("Can not write connection close phrase");
5872     return false;
5873   }
5874   return true;
5875 }
5876 
ProcessIetfConnectionCloseFrame(QuicDataReader * reader,QuicConnectionCloseType type,QuicConnectionCloseFrame * frame)5877 bool QuicFramer::ProcessIetfConnectionCloseFrame(
5878     QuicDataReader* reader, QuicConnectionCloseType type,
5879     QuicConnectionCloseFrame* frame) {
5880   frame->close_type = type;
5881 
5882   uint64_t error_code;
5883   if (!reader->ReadVarInt62(&error_code)) {
5884     set_detailed_error("Unable to read connection close error code.");
5885     return false;
5886   }
5887 
5888   frame->wire_error_code = error_code;
5889 
5890   if (type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5891     // The frame-type of the frame causing the error is present only
5892     // if it's a CONNECTION_CLOSE/Transport.
5893     if (!reader->ReadVarInt62(&frame->transport_close_frame_type)) {
5894       set_detailed_error("Unable to read connection close frame type.");
5895       return false;
5896     }
5897   }
5898 
5899   uint64_t phrase_length;
5900   if (!reader->ReadVarInt62(&phrase_length)) {
5901     set_detailed_error("Unable to read connection close error details.");
5902     return false;
5903   }
5904 
5905   absl::string_view phrase;
5906   if (!reader->ReadStringPiece(&phrase, static_cast<size_t>(phrase_length))) {
5907     set_detailed_error("Unable to read connection close error details.");
5908     return false;
5909   }
5910   frame->error_details = std::string(phrase);
5911 
5912   // The frame may have an extracted error code in it. Look for it and
5913   // extract it. If it's not present, MaybeExtract will return
5914   // QUIC_IETF_GQUIC_ERROR_MISSING.
5915   MaybeExtractQuicErrorCode(frame);
5916   return true;
5917 }
5918 
5919 // IETF Quic Path Challenge/Response frames.
ProcessPathChallengeFrame(QuicDataReader * reader,QuicPathChallengeFrame * frame)5920 bool QuicFramer::ProcessPathChallengeFrame(QuicDataReader* reader,
5921                                            QuicPathChallengeFrame* frame) {
5922   if (!reader->ReadBytes(frame->data_buffer.data(),
5923                          frame->data_buffer.size())) {
5924     set_detailed_error("Can not read path challenge data.");
5925     return false;
5926   }
5927   return true;
5928 }
5929 
ProcessPathResponseFrame(QuicDataReader * reader,QuicPathResponseFrame * frame)5930 bool QuicFramer::ProcessPathResponseFrame(QuicDataReader* reader,
5931                                           QuicPathResponseFrame* frame) {
5932   if (!reader->ReadBytes(frame->data_buffer.data(),
5933                          frame->data_buffer.size())) {
5934     set_detailed_error("Can not read path response data.");
5935     return false;
5936   }
5937   return true;
5938 }
5939 
AppendPathChallengeFrame(const QuicPathChallengeFrame & frame,QuicDataWriter * writer)5940 bool QuicFramer::AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
5941                                           QuicDataWriter* writer) {
5942   if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5943     set_detailed_error("Writing Path Challenge data failed.");
5944     return false;
5945   }
5946   return true;
5947 }
5948 
AppendPathResponseFrame(const QuicPathResponseFrame & frame,QuicDataWriter * writer)5949 bool QuicFramer::AppendPathResponseFrame(const QuicPathResponseFrame& frame,
5950                                          QuicDataWriter* writer) {
5951   if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5952     set_detailed_error("Writing Path Response data failed.");
5953     return false;
5954   }
5955   return true;
5956 }
5957 
5958 // Add a new ietf-format stream reset frame.
5959 // General format is
5960 //    stream id
5961 //    application error code
5962 //    final offset
AppendIetfResetStreamFrame(const QuicRstStreamFrame & frame,QuicDataWriter * writer)5963 bool QuicFramer::AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
5964                                             QuicDataWriter* writer) {
5965   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
5966     set_detailed_error("Writing reset-stream stream id failed.");
5967     return false;
5968   }
5969   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.ietf_error_code))) {
5970     set_detailed_error("Writing reset-stream error code failed.");
5971     return false;
5972   }
5973   if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.byte_offset))) {
5974     set_detailed_error("Writing reset-stream final-offset failed.");
5975     return false;
5976   }
5977   return true;
5978 }
5979 
ProcessIetfResetStreamFrame(QuicDataReader * reader,QuicRstStreamFrame * frame)5980 bool QuicFramer::ProcessIetfResetStreamFrame(QuicDataReader* reader,
5981                                              QuicRstStreamFrame* frame) {
5982   // Get Stream ID from frame. ReadVarIntStreamID returns false
5983   // if either A) there is a read error or B) the resulting value of
5984   // the Stream ID is larger than the maximum allowed value.
5985   if (!ReadUint32FromVarint62(reader, IETF_RST_STREAM, &frame->stream_id)) {
5986     return false;
5987   }
5988 
5989   if (!reader->ReadVarInt62(&frame->ietf_error_code)) {
5990     set_detailed_error("Unable to read rst stream error code.");
5991     return false;
5992   }
5993 
5994   frame->error_code =
5995       IetfResetStreamErrorCodeToRstStreamErrorCode(frame->ietf_error_code);
5996 
5997   if (!reader->ReadVarInt62(&frame->byte_offset)) {
5998     set_detailed_error("Unable to read rst stream sent byte offset.");
5999     return false;
6000   }
6001   return true;
6002 }
6003 
ProcessStopSendingFrame(QuicDataReader * reader,QuicStopSendingFrame * stop_sending_frame)6004 bool QuicFramer::ProcessStopSendingFrame(
6005     QuicDataReader* reader, QuicStopSendingFrame* stop_sending_frame) {
6006   if (!ReadUint32FromVarint62(reader, IETF_STOP_SENDING,
6007                               &stop_sending_frame->stream_id)) {
6008     return false;
6009   }
6010 
6011   if (!reader->ReadVarInt62(&stop_sending_frame->ietf_error_code)) {
6012     set_detailed_error("Unable to read stop sending application error code.");
6013     return false;
6014   }
6015 
6016   stop_sending_frame->error_code = IetfResetStreamErrorCodeToRstStreamErrorCode(
6017       stop_sending_frame->ietf_error_code);
6018   return true;
6019 }
6020 
AppendStopSendingFrame(const QuicStopSendingFrame & stop_sending_frame,QuicDataWriter * writer)6021 bool QuicFramer::AppendStopSendingFrame(
6022     const QuicStopSendingFrame& stop_sending_frame, QuicDataWriter* writer) {
6023   if (!writer->WriteVarInt62(stop_sending_frame.stream_id)) {
6024     set_detailed_error("Can not write stop sending stream id");
6025     return false;
6026   }
6027   if (!writer->WriteVarInt62(
6028           static_cast<uint64_t>(stop_sending_frame.ietf_error_code))) {
6029     set_detailed_error("Can not write application error code");
6030     return false;
6031   }
6032   return true;
6033 }
6034 
6035 // Append/process IETF-Format MAX_DATA Frame
AppendMaxDataFrame(const QuicWindowUpdateFrame & frame,QuicDataWriter * writer)6036 bool QuicFramer::AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
6037                                     QuicDataWriter* writer) {
6038   if (!writer->WriteVarInt62(frame.max_data)) {
6039     set_detailed_error("Can not write MAX_DATA byte-offset");
6040     return false;
6041   }
6042   return true;
6043 }
6044 
ProcessMaxDataFrame(QuicDataReader * reader,QuicWindowUpdateFrame * frame)6045 bool QuicFramer::ProcessMaxDataFrame(QuicDataReader* reader,
6046                                      QuicWindowUpdateFrame* frame) {
6047   frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
6048   if (!reader->ReadVarInt62(&frame->max_data)) {
6049     set_detailed_error("Can not read MAX_DATA byte-offset");
6050     return false;
6051   }
6052   return true;
6053 }
6054 
6055 // Append/process IETF-Format MAX_STREAM_DATA Frame
AppendMaxStreamDataFrame(const QuicWindowUpdateFrame & frame,QuicDataWriter * writer)6056 bool QuicFramer::AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
6057                                           QuicDataWriter* writer) {
6058   if (!writer->WriteVarInt62(frame.stream_id)) {
6059     set_detailed_error("Can not write MAX_STREAM_DATA stream id");
6060     return false;
6061   }
6062   if (!writer->WriteVarInt62(frame.max_data)) {
6063     set_detailed_error("Can not write MAX_STREAM_DATA byte-offset");
6064     return false;
6065   }
6066   return true;
6067 }
6068 
ProcessMaxStreamDataFrame(QuicDataReader * reader,QuicWindowUpdateFrame * frame)6069 bool QuicFramer::ProcessMaxStreamDataFrame(QuicDataReader* reader,
6070                                            QuicWindowUpdateFrame* frame) {
6071   if (!ReadUint32FromVarint62(reader, IETF_MAX_STREAM_DATA,
6072                               &frame->stream_id)) {
6073     return false;
6074   }
6075   if (!reader->ReadVarInt62(&frame->max_data)) {
6076     set_detailed_error("Can not read MAX_STREAM_DATA byte-count");
6077     return false;
6078   }
6079   return true;
6080 }
6081 
AppendMaxStreamsFrame(const QuicMaxStreamsFrame & frame,QuicDataWriter * writer)6082 bool QuicFramer::AppendMaxStreamsFrame(const QuicMaxStreamsFrame& frame,
6083                                        QuicDataWriter* writer) {
6084   if (!writer->WriteVarInt62(frame.stream_count)) {
6085     set_detailed_error("Can not write MAX_STREAMS stream count");
6086     return false;
6087   }
6088   return true;
6089 }
6090 
ProcessMaxStreamsFrame(QuicDataReader * reader,QuicMaxStreamsFrame * frame,uint64_t frame_type)6091 bool QuicFramer::ProcessMaxStreamsFrame(QuicDataReader* reader,
6092                                         QuicMaxStreamsFrame* frame,
6093                                         uint64_t frame_type) {
6094   if (!ReadUint32FromVarint62(reader,
6095                               static_cast<QuicIetfFrameType>(frame_type),
6096                               &frame->stream_count)) {
6097     return false;
6098   }
6099   frame->unidirectional = (frame_type == IETF_MAX_STREAMS_UNIDIRECTIONAL);
6100   return true;
6101 }
6102 
AppendDataBlockedFrame(const QuicBlockedFrame & frame,QuicDataWriter * writer)6103 bool QuicFramer::AppendDataBlockedFrame(const QuicBlockedFrame& frame,
6104                                         QuicDataWriter* writer) {
6105   if (!writer->WriteVarInt62(frame.offset)) {
6106     set_detailed_error("Can not write blocked offset.");
6107     return false;
6108   }
6109   return true;
6110 }
6111 
ProcessDataBlockedFrame(QuicDataReader * reader,QuicBlockedFrame * frame)6112 bool QuicFramer::ProcessDataBlockedFrame(QuicDataReader* reader,
6113                                          QuicBlockedFrame* frame) {
6114   // Indicates that it is a BLOCKED frame (as opposed to STREAM_BLOCKED).
6115   frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
6116   if (!reader->ReadVarInt62(&frame->offset)) {
6117     set_detailed_error("Can not read blocked offset.");
6118     return false;
6119   }
6120   return true;
6121 }
6122 
AppendStreamDataBlockedFrame(const QuicBlockedFrame & frame,QuicDataWriter * writer)6123 bool QuicFramer::AppendStreamDataBlockedFrame(const QuicBlockedFrame& frame,
6124                                               QuicDataWriter* writer) {
6125   if (!writer->WriteVarInt62(frame.stream_id)) {
6126     set_detailed_error("Can not write stream blocked stream id.");
6127     return false;
6128   }
6129   if (!writer->WriteVarInt62(frame.offset)) {
6130     set_detailed_error("Can not write stream blocked offset.");
6131     return false;
6132   }
6133   return true;
6134 }
6135 
ProcessStreamDataBlockedFrame(QuicDataReader * reader,QuicBlockedFrame * frame)6136 bool QuicFramer::ProcessStreamDataBlockedFrame(QuicDataReader* reader,
6137                                                QuicBlockedFrame* frame) {
6138   if (!ReadUint32FromVarint62(reader, IETF_STREAM_DATA_BLOCKED,
6139                               &frame->stream_id)) {
6140     return false;
6141   }
6142   if (!reader->ReadVarInt62(&frame->offset)) {
6143     set_detailed_error("Can not read stream blocked offset.");
6144     return false;
6145   }
6146   return true;
6147 }
6148 
AppendStreamsBlockedFrame(const QuicStreamsBlockedFrame & frame,QuicDataWriter * writer)6149 bool QuicFramer::AppendStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
6150                                            QuicDataWriter* writer) {
6151   if (!writer->WriteVarInt62(frame.stream_count)) {
6152     set_detailed_error("Can not write STREAMS_BLOCKED stream count");
6153     return false;
6154   }
6155   return true;
6156 }
6157 
ProcessStreamsBlockedFrame(QuicDataReader * reader,QuicStreamsBlockedFrame * frame,uint64_t frame_type)6158 bool QuicFramer::ProcessStreamsBlockedFrame(QuicDataReader* reader,
6159                                             QuicStreamsBlockedFrame* frame,
6160                                             uint64_t frame_type) {
6161   if (!ReadUint32FromVarint62(reader,
6162                               static_cast<QuicIetfFrameType>(frame_type),
6163                               &frame->stream_count)) {
6164     return false;
6165   }
6166   if (frame->stream_count > QuicUtils::GetMaxStreamCount()) {
6167     // If stream count is such that the resulting stream ID would exceed our
6168     // implementation limit, generate an error.
6169     set_detailed_error(
6170         "STREAMS_BLOCKED stream count exceeds implementation limit.");
6171     return false;
6172   }
6173   frame->unidirectional = (frame_type == IETF_STREAMS_BLOCKED_UNIDIRECTIONAL);
6174   return true;
6175 }
6176 
AppendNewConnectionIdFrame(const QuicNewConnectionIdFrame & frame,QuicDataWriter * writer)6177 bool QuicFramer::AppendNewConnectionIdFrame(
6178     const QuicNewConnectionIdFrame& frame, QuicDataWriter* writer) {
6179   if (!writer->WriteVarInt62(frame.sequence_number)) {
6180     set_detailed_error("Can not write New Connection ID sequence number");
6181     return false;
6182   }
6183   if (!writer->WriteVarInt62(frame.retire_prior_to)) {
6184     set_detailed_error("Can not write New Connection ID retire_prior_to");
6185     return false;
6186   }
6187   if (!writer->WriteLengthPrefixedConnectionId(frame.connection_id)) {
6188     set_detailed_error("Can not write New Connection ID frame connection ID");
6189     return false;
6190   }
6191 
6192   if (!writer->WriteBytes(
6193           static_cast<const void*>(&frame.stateless_reset_token),
6194           sizeof(frame.stateless_reset_token))) {
6195     set_detailed_error("Can not write New Connection ID Reset Token");
6196     return false;
6197   }
6198   return true;
6199 }
6200 
ProcessNewConnectionIdFrame(QuicDataReader * reader,QuicNewConnectionIdFrame * frame)6201 bool QuicFramer::ProcessNewConnectionIdFrame(QuicDataReader* reader,
6202                                              QuicNewConnectionIdFrame* frame) {
6203   if (!reader->ReadVarInt62(&frame->sequence_number)) {
6204     set_detailed_error(
6205         "Unable to read new connection ID frame sequence number.");
6206     return false;
6207   }
6208 
6209   if (!reader->ReadVarInt62(&frame->retire_prior_to)) {
6210     set_detailed_error(
6211         "Unable to read new connection ID frame retire_prior_to.");
6212     return false;
6213   }
6214   if (frame->retire_prior_to > frame->sequence_number) {
6215     set_detailed_error("Retire_prior_to > sequence_number.");
6216     return false;
6217   }
6218 
6219   if (!reader->ReadLengthPrefixedConnectionId(&frame->connection_id)) {
6220     set_detailed_error("Unable to read new connection ID frame connection id.");
6221     return false;
6222   }
6223 
6224   if (!QuicUtils::IsConnectionIdValidForVersion(frame->connection_id,
6225                                                 transport_version())) {
6226     set_detailed_error("Invalid new connection ID length for version.");
6227     return false;
6228   }
6229 
6230   if (!reader->ReadBytes(&frame->stateless_reset_token,
6231                          sizeof(frame->stateless_reset_token))) {
6232     set_detailed_error("Can not read new connection ID frame reset token.");
6233     return false;
6234   }
6235   return true;
6236 }
6237 
AppendRetireConnectionIdFrame(const QuicRetireConnectionIdFrame & frame,QuicDataWriter * writer)6238 bool QuicFramer::AppendRetireConnectionIdFrame(
6239     const QuicRetireConnectionIdFrame& frame, QuicDataWriter* writer) {
6240   if (!writer->WriteVarInt62(frame.sequence_number)) {
6241     set_detailed_error("Can not write Retire Connection ID sequence number");
6242     return false;
6243   }
6244   return true;
6245 }
6246 
ProcessRetireConnectionIdFrame(QuicDataReader * reader,QuicRetireConnectionIdFrame * frame)6247 bool QuicFramer::ProcessRetireConnectionIdFrame(
6248     QuicDataReader* reader, QuicRetireConnectionIdFrame* frame) {
6249   if (!reader->ReadVarInt62(&frame->sequence_number)) {
6250     set_detailed_error(
6251         "Unable to read retire connection ID frame sequence number.");
6252     return false;
6253   }
6254   return true;
6255 }
6256 
ReadUint32FromVarint62(QuicDataReader * reader,QuicIetfFrameType type,QuicStreamId * id)6257 bool QuicFramer::ReadUint32FromVarint62(QuicDataReader* reader,
6258                                         QuicIetfFrameType type,
6259                                         QuicStreamId* id) {
6260   uint64_t temp_uint64;
6261   if (!reader->ReadVarInt62(&temp_uint64)) {
6262     set_detailed_error("Unable to read " + QuicIetfFrameTypeString(type) +
6263                        " frame stream id/count.");
6264     return false;
6265   }
6266   if (temp_uint64 > kMaxQuicStreamId) {
6267     set_detailed_error("Stream id/count of " + QuicIetfFrameTypeString(type) +
6268                        "frame is too large.");
6269     return false;
6270   }
6271   *id = static_cast<uint32_t>(temp_uint64);
6272   return true;
6273 }
6274 
GetStreamFrameTypeByte(const QuicStreamFrame & frame,bool last_frame_in_packet) const6275 uint8_t QuicFramer::GetStreamFrameTypeByte(const QuicStreamFrame& frame,
6276                                            bool last_frame_in_packet) const {
6277   if (VersionHasIetfQuicFrames(version_.transport_version)) {
6278     return GetIetfStreamFrameTypeByte(frame, last_frame_in_packet);
6279   }
6280   uint8_t type_byte = 0;
6281   // Fin bit.
6282   type_byte |= frame.fin ? kQuicStreamFinMask : 0;
6283 
6284   // Data Length bit.
6285   type_byte <<= kQuicStreamDataLengthShift;
6286   type_byte |= last_frame_in_packet ? 0 : kQuicStreamDataLengthMask;
6287 
6288   // Offset 3 bits.
6289   type_byte <<= kQuicStreamShift;
6290   const size_t offset_len = GetStreamOffsetSize(frame.offset);
6291   if (offset_len > 0) {
6292     type_byte |= offset_len - 1;
6293   }
6294 
6295   // stream id 2 bits.
6296   type_byte <<= kQuicStreamIdShift;
6297   type_byte |= GetStreamIdSize(frame.stream_id) - 1;
6298   type_byte |= kQuicFrameTypeStreamMask;  // Set Stream Frame Type to 1.
6299 
6300   return type_byte;
6301 }
6302 
GetIetfStreamFrameTypeByte(const QuicStreamFrame & frame,bool last_frame_in_packet) const6303 uint8_t QuicFramer::GetIetfStreamFrameTypeByte(
6304     const QuicStreamFrame& frame, bool last_frame_in_packet) const {
6305   QUICHE_DCHECK(VersionHasIetfQuicFrames(version_.transport_version));
6306   uint8_t type_byte = IETF_STREAM;
6307   if (!last_frame_in_packet) {
6308     type_byte |= IETF_STREAM_FRAME_LEN_BIT;
6309   }
6310   if (frame.offset != 0) {
6311     type_byte |= IETF_STREAM_FRAME_OFF_BIT;
6312   }
6313   if (frame.fin) {
6314     type_byte |= IETF_STREAM_FRAME_FIN_BIT;
6315   }
6316   return type_byte;
6317 }
6318 
EnableMultiplePacketNumberSpacesSupport()6319 void QuicFramer::EnableMultiplePacketNumberSpacesSupport() {
6320   if (supports_multiple_packet_number_spaces_) {
6321     QUIC_BUG(quic_bug_10850_91)
6322         << "Multiple packet number spaces has already been enabled";
6323     return;
6324   }
6325   if (largest_packet_number_.IsInitialized()) {
6326     QUIC_BUG(quic_bug_10850_92)
6327         << "Try to enable multiple packet number spaces support after any "
6328            "packet has been received.";
6329     return;
6330   }
6331 
6332   supports_multiple_packet_number_spaces_ = true;
6333 }
6334 
6335 // static
ParsePublicHeaderDispatcher(const QuicEncryptedPacket & packet,uint8_t expected_destination_connection_id_length,PacketHeaderFormat * format,QuicLongHeaderType * long_packet_type,bool * version_present,bool * has_length_prefix,QuicVersionLabel * version_label,ParsedQuicVersion * parsed_version,QuicConnectionId * destination_connection_id,QuicConnectionId * source_connection_id,std::optional<absl::string_view> * retry_token,std::string * detailed_error)6336 QuicErrorCode QuicFramer::ParsePublicHeaderDispatcher(
6337     const QuicEncryptedPacket& packet,
6338     uint8_t expected_destination_connection_id_length,
6339     PacketHeaderFormat* format, QuicLongHeaderType* long_packet_type,
6340     bool* version_present, bool* has_length_prefix,
6341     QuicVersionLabel* version_label, ParsedQuicVersion* parsed_version,
6342     QuicConnectionId* destination_connection_id,
6343     QuicConnectionId* source_connection_id,
6344     std::optional<absl::string_view>* retry_token,
6345     std::string* detailed_error) {
6346   QuicDataReader reader(packet.data(), packet.length());
6347   if (reader.IsDoneReading()) {
6348     *detailed_error = "Unable to read first byte.";
6349     return QUIC_INVALID_PACKET_HEADER;
6350   }
6351   const uint8_t first_byte = reader.PeekByte();
6352   if ((first_byte & FLAGS_LONG_HEADER) == 0 &&
6353       (first_byte & FLAGS_FIXED_BIT) == 0 &&
6354       (first_byte & FLAGS_DEMULTIPLEXING_BIT) == 0) {
6355     // All versions of Google QUIC up to and including Q043 set
6356     // FLAGS_DEMULTIPLEXING_BIT to one on all client-to-server packets. Q044
6357     // and Q045 were never default-enabled in production. All subsequent
6358     // versions of Google QUIC (starting with Q046) require FLAGS_FIXED_BIT to
6359     // be set to one on all packets. All versions of IETF QUIC (since
6360     // draft-ietf-quic-transport-17 which was earlier than the first IETF QUIC
6361     // version that was deployed in production by any implementation) also
6362     // require FLAGS_FIXED_BIT to be set to one on all packets. If a packet
6363     // has the FLAGS_LONG_HEADER bit set to one, it could be a first flight
6364     // from an unknown future version that allows the other two bits to be set
6365     // to zero. Based on this, packets that have all three of those bits set
6366     // to zero are known to be invalid.
6367     *detailed_error = "Invalid flags.";
6368     return QUIC_INVALID_PACKET_HEADER;
6369   }
6370   const bool ietf_format = QuicUtils::IsIetfPacketHeader(first_byte);
6371   uint8_t unused_first_byte;
6372   quiche::QuicheVariableLengthIntegerLength retry_token_length_length;
6373   absl::string_view maybe_retry_token;
6374   QuicErrorCode error_code = ParsePublicHeader(
6375       &reader, expected_destination_connection_id_length, ietf_format,
6376       &unused_first_byte, format, version_present, has_length_prefix,
6377       version_label, parsed_version, destination_connection_id,
6378       source_connection_id, long_packet_type, &retry_token_length_length,
6379       &maybe_retry_token, detailed_error);
6380   if (retry_token_length_length != quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0) {
6381     *retry_token = maybe_retry_token;
6382   } else {
6383     retry_token->reset();
6384   }
6385   return error_code;
6386 }
6387 
6388 // static
ParsePublicHeaderDispatcherShortHeaderLengthUnknown(const QuicEncryptedPacket & packet,PacketHeaderFormat * format,QuicLongHeaderType * long_packet_type,bool * version_present,bool * has_length_prefix,QuicVersionLabel * version_label,ParsedQuicVersion * parsed_version,QuicConnectionId * destination_connection_id,QuicConnectionId * source_connection_id,std::optional<absl::string_view> * retry_token,std::string * detailed_error,ConnectionIdGeneratorInterface & generator)6389 QuicErrorCode QuicFramer::ParsePublicHeaderDispatcherShortHeaderLengthUnknown(
6390     const QuicEncryptedPacket& packet, PacketHeaderFormat* format,
6391     QuicLongHeaderType* long_packet_type, bool* version_present,
6392     bool* has_length_prefix, QuicVersionLabel* version_label,
6393     ParsedQuicVersion* parsed_version,
6394     QuicConnectionId* destination_connection_id,
6395     QuicConnectionId* source_connection_id,
6396     std::optional<absl::string_view>* retry_token, std::string* detailed_error,
6397     ConnectionIdGeneratorInterface& generator) {
6398   QuicDataReader reader(packet.data(), packet.length());
6399   // Get the first two bytes.
6400   if (reader.BytesRemaining() < 2) {
6401     *detailed_error = "Unable to read first two bytes.";
6402     return QUIC_INVALID_PACKET_HEADER;
6403   }
6404   uint8_t two_bytes[2];
6405   reader.ReadBytes(two_bytes, 2);
6406   uint8_t expected_destination_connection_id_length =
6407       (!QuicUtils::IsIetfPacketHeader(two_bytes[0]) ||
6408        two_bytes[0] & FLAGS_LONG_HEADER)
6409           ? 0
6410           : generator.ConnectionIdLength(two_bytes[1]);
6411   return ParsePublicHeaderDispatcher(
6412       packet, expected_destination_connection_id_length, format,
6413       long_packet_type, version_present, has_length_prefix, version_label,
6414       parsed_version, destination_connection_id, source_connection_id,
6415       retry_token, detailed_error);
6416 }
6417 
6418 // static
ParsePublicHeaderGoogleQuic(QuicDataReader * reader,uint8_t * first_byte,PacketHeaderFormat * format,bool * version_present,QuicVersionLabel * version_label,ParsedQuicVersion * parsed_version,QuicConnectionId * destination_connection_id,std::string * detailed_error)6419 QuicErrorCode QuicFramer::ParsePublicHeaderGoogleQuic(
6420     QuicDataReader* reader, uint8_t* first_byte, PacketHeaderFormat* format,
6421     bool* version_present, QuicVersionLabel* version_label,
6422     ParsedQuicVersion* parsed_version,
6423     QuicConnectionId* destination_connection_id, std::string* detailed_error) {
6424   *format = GOOGLE_QUIC_PACKET;
6425   *version_present = (*first_byte & PACKET_PUBLIC_FLAGS_VERSION) != 0;
6426   uint8_t destination_connection_id_length = 0;
6427   if ((*first_byte & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) != 0) {
6428     destination_connection_id_length = kQuicDefaultConnectionIdLength;
6429   }
6430   if (!reader->ReadConnectionId(destination_connection_id,
6431                                 destination_connection_id_length)) {
6432     *detailed_error = "Unable to read ConnectionId.";
6433     return QUIC_INVALID_PACKET_HEADER;
6434   }
6435   if (*version_present) {
6436     if (!ProcessVersionLabel(reader, version_label)) {
6437       *detailed_error = "Unable to read protocol version.";
6438       return QUIC_INVALID_PACKET_HEADER;
6439     }
6440     *parsed_version = ParseQuicVersionLabel(*version_label);
6441   }
6442   return QUIC_NO_ERROR;
6443 }
6444 
6445 namespace {
6446 
6447 const QuicVersionLabel kProxVersionLabel = 0x50524F58;  // "PROX"
6448 
PacketHasLengthPrefixedConnectionIds(const QuicDataReader & reader,ParsedQuicVersion parsed_version,QuicVersionLabel version_label,uint8_t first_byte)6449 inline bool PacketHasLengthPrefixedConnectionIds(
6450     const QuicDataReader& reader, ParsedQuicVersion parsed_version,
6451     QuicVersionLabel version_label, uint8_t first_byte) {
6452   if (parsed_version.IsKnown()) {
6453     return parsed_version.HasLengthPrefixedConnectionIds();
6454   }
6455 
6456   // Received unsupported version, check known old unsupported versions.
6457   if (QuicVersionLabelUses4BitConnectionIdLength(version_label)) {
6458     return false;
6459   }
6460 
6461   // Received unknown version, check connection ID length byte.
6462   if (reader.IsDoneReading()) {
6463     // This check is required to safely peek the connection ID length byte.
6464     return true;
6465   }
6466   const uint8_t connection_id_length_byte = reader.PeekByte();
6467 
6468   // Check for packets produced by older versions of
6469   // QuicFramer::WriteClientVersionNegotiationProbePacket
6470   if (first_byte == 0xc0 && (connection_id_length_byte & 0x0f) == 0 &&
6471       connection_id_length_byte >= 0x50 && version_label == 0xcabadaba) {
6472     return false;
6473   }
6474 
6475   // Check for munged packets with version tag PROX.
6476   if ((connection_id_length_byte & 0x0f) == 0 &&
6477       connection_id_length_byte >= 0x20 && version_label == kProxVersionLabel) {
6478     return false;
6479   }
6480 
6481   return true;
6482 }
6483 
ParseLongHeaderConnectionIds(QuicDataReader & reader,bool has_length_prefix,QuicVersionLabel version_label,QuicConnectionId & destination_connection_id,QuicConnectionId & source_connection_id,std::string & detailed_error)6484 inline bool ParseLongHeaderConnectionIds(
6485     QuicDataReader& reader, bool has_length_prefix,
6486     QuicVersionLabel version_label, QuicConnectionId& destination_connection_id,
6487     QuicConnectionId& source_connection_id, std::string& detailed_error) {
6488   if (has_length_prefix) {
6489     if (!reader.ReadLengthPrefixedConnectionId(&destination_connection_id)) {
6490       detailed_error = "Unable to read destination connection ID.";
6491       return false;
6492     }
6493     if (!reader.ReadLengthPrefixedConnectionId(&source_connection_id)) {
6494       if (version_label == kProxVersionLabel) {
6495         // The "PROX" version does not follow the length-prefixed invariants,
6496         // and can therefore attempt to read a payload byte and interpret it
6497         // as the source connection ID length, which could fail to parse.
6498         // In that scenario we keep the source connection ID empty but mark
6499         // parsing as successful.
6500         return true;
6501       }
6502       detailed_error = "Unable to read source connection ID.";
6503       return false;
6504     }
6505   } else {
6506     // Parse connection ID lengths.
6507     uint8_t connection_id_lengths_byte;
6508     if (!reader.ReadUInt8(&connection_id_lengths_byte)) {
6509       detailed_error = "Unable to read connection ID lengths.";
6510       return false;
6511     }
6512     uint8_t destination_connection_id_length =
6513         (connection_id_lengths_byte & kDestinationConnectionIdLengthMask) >> 4;
6514     if (destination_connection_id_length != 0) {
6515       destination_connection_id_length += kConnectionIdLengthAdjustment;
6516     }
6517     uint8_t source_connection_id_length =
6518         connection_id_lengths_byte & kSourceConnectionIdLengthMask;
6519     if (source_connection_id_length != 0) {
6520       source_connection_id_length += kConnectionIdLengthAdjustment;
6521     }
6522 
6523     // Read destination connection ID.
6524     if (!reader.ReadConnectionId(&destination_connection_id,
6525                                  destination_connection_id_length)) {
6526       detailed_error = "Unable to read destination connection ID.";
6527       return false;
6528     }
6529 
6530     // Read source connection ID.
6531     if (!reader.ReadConnectionId(&source_connection_id,
6532                                  source_connection_id_length)) {
6533       detailed_error = "Unable to read source connection ID.";
6534       return false;
6535     }
6536   }
6537   return true;
6538 }
6539 
6540 }  // namespace
6541 
6542 // static
ParsePublicHeader(QuicDataReader * reader,uint8_t expected_destination_connection_id_length,bool ietf_format,uint8_t * first_byte,PacketHeaderFormat * format,bool * version_present,bool * has_length_prefix,QuicVersionLabel * version_label,ParsedQuicVersion * parsed_version,QuicConnectionId * destination_connection_id,QuicConnectionId * source_connection_id,QuicLongHeaderType * long_packet_type,quiche::QuicheVariableLengthIntegerLength * retry_token_length_length,absl::string_view * retry_token,std::string * detailed_error)6543 QuicErrorCode QuicFramer::ParsePublicHeader(
6544     QuicDataReader* reader, uint8_t expected_destination_connection_id_length,
6545     bool ietf_format, uint8_t* first_byte, PacketHeaderFormat* format,
6546     bool* version_present, bool* has_length_prefix,
6547     QuicVersionLabel* version_label, ParsedQuicVersion* parsed_version,
6548     QuicConnectionId* destination_connection_id,
6549     QuicConnectionId* source_connection_id,
6550     QuicLongHeaderType* long_packet_type,
6551     quiche::QuicheVariableLengthIntegerLength* retry_token_length_length,
6552     absl::string_view* retry_token, std::string* detailed_error) {
6553   *version_present = false;
6554   *has_length_prefix = false;
6555   *version_label = 0;
6556   *parsed_version = UnsupportedQuicVersion();
6557   *source_connection_id = EmptyQuicConnectionId();
6558   *long_packet_type = INVALID_PACKET_TYPE;
6559   *retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
6560   *retry_token = absl::string_view();
6561   *detailed_error = "";
6562 
6563   if (!reader->ReadUInt8(first_byte)) {
6564     *detailed_error = "Unable to read first byte.";
6565     return QUIC_INVALID_PACKET_HEADER;
6566   }
6567 
6568   if (!ietf_format) {
6569     return ParsePublicHeaderGoogleQuic(
6570         reader, first_byte, format, version_present, version_label,
6571         parsed_version, destination_connection_id, detailed_error);
6572   }
6573 
6574   *format = GetIetfPacketHeaderFormat(*first_byte);
6575 
6576   if (*format == IETF_QUIC_SHORT_HEADER_PACKET) {
6577     if (!reader->ReadConnectionId(destination_connection_id,
6578                                   expected_destination_connection_id_length)) {
6579       *detailed_error = "Unable to read destination connection ID.";
6580       return QUIC_INVALID_PACKET_HEADER;
6581     }
6582     return QUIC_NO_ERROR;
6583   }
6584 
6585   QUICHE_DCHECK_EQ(IETF_QUIC_LONG_HEADER_PACKET, *format);
6586   *version_present = true;
6587   if (!ProcessVersionLabel(reader, version_label)) {
6588     *detailed_error = "Unable to read protocol version.";
6589     return QUIC_INVALID_PACKET_HEADER;
6590   }
6591 
6592   if (*version_label == 0) {
6593     *long_packet_type = VERSION_NEGOTIATION;
6594   }
6595 
6596   // Parse version.
6597   *parsed_version = ParseQuicVersionLabel(*version_label);
6598 
6599   // Figure out which IETF QUIC invariants this packet follows.
6600   *has_length_prefix = PacketHasLengthPrefixedConnectionIds(
6601       *reader, *parsed_version, *version_label, *first_byte);
6602 
6603   // Parse connection IDs.
6604   if (!ParseLongHeaderConnectionIds(*reader, *has_length_prefix, *version_label,
6605                                     *destination_connection_id,
6606                                     *source_connection_id, *detailed_error)) {
6607     return QUIC_INVALID_PACKET_HEADER;
6608   }
6609 
6610   if (!parsed_version->IsKnown()) {
6611     // Skip parsing of long packet type and retry token for unknown versions.
6612     return QUIC_NO_ERROR;
6613   }
6614 
6615   // Parse long packet type.
6616   *long_packet_type = GetLongHeaderType(*first_byte, *parsed_version);
6617 
6618   switch (*long_packet_type) {
6619     case INVALID_PACKET_TYPE:
6620       *detailed_error = "Unable to parse long packet type.";
6621       return QUIC_INVALID_PACKET_HEADER;
6622     case INITIAL:
6623       if (!parsed_version->SupportsRetry()) {
6624         // Retry token is only present on initial packets for some versions.
6625         return QUIC_NO_ERROR;
6626       }
6627       break;
6628     default:
6629       return QUIC_NO_ERROR;
6630   }
6631 
6632   *retry_token_length_length = reader->PeekVarInt62Length();
6633   uint64_t retry_token_length;
6634   if (!reader->ReadVarInt62(&retry_token_length)) {
6635     *retry_token_length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
6636     *detailed_error = "Unable to read retry token length.";
6637     return QUIC_INVALID_PACKET_HEADER;
6638   }
6639 
6640   if (!reader->ReadStringPiece(retry_token, retry_token_length)) {
6641     *detailed_error = "Unable to read retry token.";
6642     return QUIC_INVALID_PACKET_HEADER;
6643   }
6644 
6645   return QUIC_NO_ERROR;
6646 }
6647 
6648 // static
WriteClientVersionNegotiationProbePacket(char * packet_bytes,QuicByteCount packet_length,const char * destination_connection_id_bytes,uint8_t destination_connection_id_length)6649 bool QuicFramer::WriteClientVersionNegotiationProbePacket(
6650     char* packet_bytes, QuicByteCount packet_length,
6651     const char* destination_connection_id_bytes,
6652     uint8_t destination_connection_id_length) {
6653   if (packet_bytes == nullptr) {
6654     QUIC_BUG(quic_bug_10850_93) << "Invalid packet_bytes";
6655     return false;
6656   }
6657   if (packet_length < kMinPacketSizeForVersionNegotiation ||
6658       packet_length > 65535) {
6659     QUIC_BUG(quic_bug_10850_94) << "Invalid packet_length";
6660     return false;
6661   }
6662   if (destination_connection_id_length > kQuicMaxConnectionId4BitLength ||
6663       destination_connection_id_length < kQuicDefaultConnectionIdLength) {
6664     QUIC_BUG(quic_bug_10850_95) << "Invalid connection_id_length";
6665     return false;
6666   }
6667   // clang-format off
6668   const unsigned char packet_start_bytes[] = {
6669     // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
6670     0xc0,
6671     // Version, part of the IETF space reserved for negotiation.
6672     // This intentionally differs from QuicVersionReservedForNegotiation()
6673     // to allow differentiating them over the wire.
6674     0xca, 0xba, 0xda, 0xda,
6675   };
6676   // clang-format on
6677   static_assert(sizeof(packet_start_bytes) == 5, "bad packet_start_bytes size");
6678   QuicDataWriter writer(packet_length, packet_bytes);
6679   if (!writer.WriteBytes(packet_start_bytes, sizeof(packet_start_bytes))) {
6680     QUIC_BUG(quic_bug_10850_96) << "Failed to write packet start";
6681     return false;
6682   }
6683 
6684   QuicConnectionId destination_connection_id(destination_connection_id_bytes,
6685                                              destination_connection_id_length);
6686   if (!AppendIetfConnectionIds(
6687           /*version_flag=*/true, /*use_length_prefix=*/true,
6688           destination_connection_id, EmptyQuicConnectionId(), &writer)) {
6689     QUIC_BUG(quic_bug_10850_97) << "Failed to write connection IDs";
6690     return false;
6691   }
6692   // Add 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
6693   // not parse with any known version. The zeroes make sure that packet numbers,
6694   // retry token lengths and payload lengths are parsed as zero, and if the
6695   // zeroes are treated as padding frames, 0xff is known to not parse as a
6696   // valid frame type.
6697   if (!writer.WriteUInt64(0) ||
6698       !writer.WriteUInt64(std::numeric_limits<uint64_t>::max())) {
6699     QUIC_BUG(quic_bug_10850_98) << "Failed to write 18 bytes";
6700     return false;
6701   }
6702   // Make sure the polite greeting below is padded to a 16-byte boundary to
6703   // make it easier to read in tcpdump.
6704   while (writer.length() % 16 != 0) {
6705     if (!writer.WriteUInt8(0)) {
6706       QUIC_BUG(quic_bug_10850_99) << "Failed to write padding byte";
6707       return false;
6708     }
6709   }
6710   // Add a polite greeting in case a human sees this in tcpdump.
6711   static const char polite_greeting[] =
6712       "This packet only exists to trigger IETF QUIC version negotiation. "
6713       "Please respond with a Version Negotiation packet indicating what "
6714       "versions you support. Thank you and have a nice day.";
6715   if (!writer.WriteBytes(polite_greeting, sizeof(polite_greeting))) {
6716     QUIC_BUG(quic_bug_10850_100) << "Failed to write polite greeting";
6717     return false;
6718   }
6719   // Fill the rest of the packet with zeroes.
6720   writer.WritePadding();
6721   QUICHE_DCHECK_EQ(0u, writer.remaining());
6722   return true;
6723 }
6724 
6725 // static
ParseServerVersionNegotiationProbeResponse(const char * packet_bytes,QuicByteCount packet_length,char * source_connection_id_bytes,uint8_t * source_connection_id_length_out,std::string * detailed_error)6726 bool QuicFramer::ParseServerVersionNegotiationProbeResponse(
6727     const char* packet_bytes, QuicByteCount packet_length,
6728     char* source_connection_id_bytes, uint8_t* source_connection_id_length_out,
6729     std::string* detailed_error) {
6730   if (detailed_error == nullptr) {
6731     QUIC_BUG(quic_bug_10850_101) << "Invalid error_details";
6732     return false;
6733   }
6734   *detailed_error = "";
6735   if (packet_bytes == nullptr) {
6736     *detailed_error = "Invalid packet_bytes";
6737     return false;
6738   }
6739   if (packet_length < 6) {
6740     *detailed_error = "Invalid packet_length";
6741     return false;
6742   }
6743   if (source_connection_id_bytes == nullptr) {
6744     *detailed_error = "Invalid source_connection_id_bytes";
6745     return false;
6746   }
6747   if (source_connection_id_length_out == nullptr) {
6748     *detailed_error = "Invalid source_connection_id_length_out";
6749     return false;
6750   }
6751   QuicDataReader reader(packet_bytes, packet_length);
6752   uint8_t type_byte = 0;
6753   if (!reader.ReadUInt8(&type_byte)) {
6754     *detailed_error = "Failed to read type byte";
6755     return false;
6756   }
6757   if ((type_byte & 0x80) == 0) {
6758     *detailed_error = "Packet does not have long header";
6759     return false;
6760   }
6761   uint32_t version = 0;
6762   if (!reader.ReadUInt32(&version)) {
6763     *detailed_error = "Failed to read version";
6764     return false;
6765   }
6766   if (version != 0) {
6767     *detailed_error = "Packet is not a version negotiation packet";
6768     return false;
6769   }
6770 
6771   QuicConnectionId destination_connection_id, source_connection_id;
6772   if (!reader.ReadLengthPrefixedConnectionId(&destination_connection_id)) {
6773     *detailed_error = "Failed to read destination connection ID";
6774     return false;
6775   }
6776   if (!reader.ReadLengthPrefixedConnectionId(&source_connection_id)) {
6777     *detailed_error = "Failed to read source connection ID";
6778     return false;
6779   }
6780 
6781   if (destination_connection_id.length() != 0) {
6782     *detailed_error = "Received unexpected destination connection ID length";
6783     return false;
6784   }
6785   if (*source_connection_id_length_out < source_connection_id.length()) {
6786     *detailed_error =
6787         absl::StrCat("*source_connection_id_length_out too small ",
6788                      static_cast<int>(*source_connection_id_length_out), " < ",
6789                      static_cast<int>(source_connection_id.length()));
6790     return false;
6791   }
6792 
6793   memcpy(source_connection_id_bytes, source_connection_id.data(),
6794          source_connection_id.length());
6795   *source_connection_id_length_out = source_connection_id.length();
6796 
6797   return true;
6798 }
6799 
6800 // Look for and parse the error code from the "<quic_error_code>:" text that
6801 // may be present at the start of the CONNECTION_CLOSE error details string.
6802 // This text, inserted by the peer if it's using Google's QUIC implementation,
6803 // contains additional error information that narrows down the exact error.  If
6804 // the string is not found, or is not properly formed, it returns
6805 // ErrorCode::QUIC_IETF_GQUIC_ERROR_MISSING
MaybeExtractQuicErrorCode(QuicConnectionCloseFrame * frame)6806 void MaybeExtractQuicErrorCode(QuicConnectionCloseFrame* frame) {
6807   std::vector<absl::string_view> ed = absl::StrSplit(frame->error_details, ':');
6808   uint64_t extracted_error_code;
6809   if (ed.size() < 2 || !quiche::QuicheTextUtils::IsAllDigits(ed[0]) ||
6810       !absl::SimpleAtoi(ed[0], &extracted_error_code) ||
6811       extracted_error_code >
6812           std::numeric_limits<
6813               std::underlying_type<QuicErrorCode>::type>::max()) {
6814     if (frame->close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE &&
6815         frame->wire_error_code == NO_IETF_QUIC_ERROR) {
6816       frame->quic_error_code = QUIC_NO_ERROR;
6817     } else {
6818       frame->quic_error_code = QUIC_IETF_GQUIC_ERROR_MISSING;
6819     }
6820     return;
6821   }
6822   // Return the error code (numeric) and the error details string without the
6823   // error code prefix. Note that Split returns everything up to, but not
6824   // including, the split character, so the length of ed[0] is just the number
6825   // of digits in the error number. In removing the prefix, 1 is added to the
6826   // length to account for the :
6827   absl::string_view x = absl::string_view(frame->error_details);
6828   x.remove_prefix(ed[0].length() + 1);
6829   frame->error_details = std::string(x);
6830   frame->quic_error_code = static_cast<QuicErrorCode>(extracted_error_code);
6831 }
6832 
6833 #undef ENDPOINT  // undef for jumbo builds
6834 }  // namespace quic
6835