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, ¤t_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(×tamp_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(×tamp_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(×tamp_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