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