blob: df019cfe0b9e612bb37b64f84b7cfd1ed9d05c0c [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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 "net/third_party/quiche/src/quic/core/quic_framer.h"
6
7#include <cstddef>
8#include <cstdint>
9#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070010#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050011
12#include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h"
nharper55fa6132019-05-07 19:37:21 -070013#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050014#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h"
15#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
nharper55fa6132019-05-07 19:37:21 -070016#include "net/third_party/quiche/src/quic/core/crypto/crypto_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050017#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
18#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
19#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
20#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
21#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
22#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
23#include "net/third_party/quiche/src/quic/core/quic_constants.h"
24#include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
25#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
ianswett97b690b2019-05-02 15:12:43 -070026#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050027#include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h"
28#include "net/third_party/quiche/src/quic/core/quic_stream_frame_data_producer.h"
29#include "net/third_party/quiche/src/quic/core/quic_types.h"
30#include "net/third_party/quiche/src/quic/core/quic_utils.h"
31#include "net/third_party/quiche/src/quic/core/quic_versions.h"
32#include "net/third_party/quiche/src/quic/platform/api/quic_aligned.h"
dschinazie8d7fa72019-04-05 14:44:40 -070033#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050034#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
35#include "net/third_party/quiche/src/quic/platform/api/quic_client_stats.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050036#include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h"
37#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
38#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
39#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
40#include "net/third_party/quiche/src/quic/platform/api/quic_map_util.h"
41#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
42#include "net/third_party/quiche/src/quic/platform/api/quic_stack_trace.h"
43#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050044#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
45
46namespace quic {
47
48namespace {
49
50#define ENDPOINT \
51 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
52
53// How much to shift the timestamp in the IETF Ack frame.
54// TODO(fkastenholz) when we get real IETF QUIC, need to get
55// the currect shift from the transport parameters.
56const int kIetfAckTimestampShift = 3;
57
58// Number of bits the packet number length bits are shifted from the right
59// edge of the header.
60const uint8_t kPublicHeaderSequenceNumberShift = 4;
61
62// There are two interpretations for the Frame Type byte in the QUIC protocol,
63// resulting in two Frame Types: Special Frame Types and Regular Frame Types.
64//
65// Regular Frame Types use the Frame Type byte simply. Currently defined
66// Regular Frame Types are:
67// Padding : 0b 00000000 (0x00)
68// ResetStream : 0b 00000001 (0x01)
69// ConnectionClose : 0b 00000010 (0x02)
70// GoAway : 0b 00000011 (0x03)
71// WindowUpdate : 0b 00000100 (0x04)
72// Blocked : 0b 00000101 (0x05)
73//
74// Special Frame Types encode both a Frame Type and corresponding flags
75// all in the Frame Type byte. Currently defined Special Frame Types
76// are:
77// Stream : 0b 1xxxxxxx
78// Ack : 0b 01xxxxxx
79//
80// Semantics of the flag bits above (the x bits) depends on the frame type.
81
82// Masks to determine if the frame type is a special use
83// and for specific special frame types.
84const uint8_t kQuicFrameTypeBrokenMask = 0xE0; // 0b 11100000
85const uint8_t kQuicFrameTypeSpecialMask = 0xC0; // 0b 11000000
86const uint8_t kQuicFrameTypeStreamMask = 0x80;
87const uint8_t kQuicFrameTypeAckMask = 0x40;
88static_assert(kQuicFrameTypeSpecialMask ==
89 (kQuicFrameTypeStreamMask | kQuicFrameTypeAckMask),
90 "Invalid kQuicFrameTypeSpecialMask");
91
92// The stream type format is 1FDOOOSS, where
93// F is the fin bit.
94// D is the data length bit (0 or 2 bytes).
95// OO/OOO are the size of the offset.
96// SS is the size of the stream ID.
97// Note that the stream encoding can not be determined by inspection. It can
98// be determined only by knowing the QUIC Version.
99// Stream frame relative shifts and masks for interpreting the stream flags.
100// StreamID may be 1, 2, 3, or 4 bytes.
101const uint8_t kQuicStreamIdShift = 2;
102const uint8_t kQuicStreamIDLengthMask = 0x03;
103
104// Offset may be 0, 2, 4, or 8 bytes.
105const uint8_t kQuicStreamShift = 3;
106const uint8_t kQuicStreamOffsetMask = 0x07;
107
108// Data length may be 0 or 2 bytes.
109const uint8_t kQuicStreamDataLengthShift = 1;
110const uint8_t kQuicStreamDataLengthMask = 0x01;
111
112// Fin bit may be set or not.
113const uint8_t kQuicStreamFinShift = 1;
114const uint8_t kQuicStreamFinMask = 0x01;
115
116// The format is 01M0LLOO, where
117// M if set, there are multiple ack blocks in the frame.
118// LL is the size of the largest ack field.
119// OO is the size of the ack blocks offset field.
120// packet number size shift used in AckFrames.
121const uint8_t kQuicSequenceNumberLengthNumBits = 2;
122const uint8_t kActBlockLengthOffset = 0;
123const uint8_t kLargestAckedOffset = 2;
124
125// Acks may have only one ack block.
126const uint8_t kQuicHasMultipleAckBlocksOffset = 5;
127
128// Timestamps are 4 bytes followed by 2 bytes.
129const uint8_t kQuicNumTimestampsLength = 1;
130const uint8_t kQuicFirstTimestampLength = 4;
131const uint8_t kQuicTimestampLength = 2;
132// Gaps between packet numbers are 1 byte.
133const uint8_t kQuicTimestampPacketNumberGapLength = 1;
134
135// Maximum length of encoded error strings.
136const int kMaxErrorStringLength = 256;
137
138const uint8_t kConnectionIdLengthAdjustment = 3;
139const uint8_t kDestinationConnectionIdLengthMask = 0xF0;
140const uint8_t kSourceConnectionIdLengthMask = 0x0F;
141
142// Returns the absolute value of the difference between |a| and |b|.
143uint64_t Delta(uint64_t a, uint64_t b) {
144 // Since these are unsigned numbers, we can't just return abs(a - b)
145 if (a < b) {
146 return b - a;
147 }
148 return a - b;
149}
150
151uint64_t ClosestTo(uint64_t target, uint64_t a, uint64_t b) {
152 return (Delta(target, a) < Delta(target, b)) ? a : b;
153}
154
155uint64_t PacketNumberIntervalLength(
156 const QuicInterval<QuicPacketNumber>& interval) {
157 if (interval.Empty()) {
158 return 0u;
159 }
160 return interval.max() - interval.min();
161}
162
163QuicPacketNumberLength ReadSequenceNumberLength(uint8_t flags) {
164 switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
165 case PACKET_FLAGS_8BYTE_PACKET:
166 return PACKET_6BYTE_PACKET_NUMBER;
167 case PACKET_FLAGS_4BYTE_PACKET:
168 return PACKET_4BYTE_PACKET_NUMBER;
169 case PACKET_FLAGS_2BYTE_PACKET:
170 return PACKET_2BYTE_PACKET_NUMBER;
171 case PACKET_FLAGS_1BYTE_PACKET:
172 return PACKET_1BYTE_PACKET_NUMBER;
173 default:
174 QUIC_BUG << "Unreachable case statement.";
175 return PACKET_6BYTE_PACKET_NUMBER;
176 }
177}
178
179QuicPacketNumberLength ReadAckPacketNumberLength(QuicTransportVersion version,
180 uint8_t flags) {
181 switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
182 case PACKET_FLAGS_8BYTE_PACKET:
183 return PACKET_6BYTE_PACKET_NUMBER;
184 case PACKET_FLAGS_4BYTE_PACKET:
185 return PACKET_4BYTE_PACKET_NUMBER;
186 case PACKET_FLAGS_2BYTE_PACKET:
187 return PACKET_2BYTE_PACKET_NUMBER;
188 case PACKET_FLAGS_1BYTE_PACKET:
189 return PACKET_1BYTE_PACKET_NUMBER;
190 default:
191 QUIC_BUG << "Unreachable case statement.";
192 return PACKET_6BYTE_PACKET_NUMBER;
193 }
194}
195
196uint8_t PacketNumberLengthToOnWireValue(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500197 QuicPacketNumberLength packet_number_length) {
fayang374888f2019-05-31 06:47:21 -0700198 return packet_number_length - 1;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500199}
200
fayang374888f2019-05-31 06:47:21 -0700201// TODO(fayang): Remove |version| when deprecating
202// quic_no_framer_object_in_dispatcher.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500203bool GetShortHeaderPacketNumberLength(
204 QuicTransportVersion version,
205 uint8_t type,
206 bool infer_packet_header_type_from_version,
207 QuicPacketNumberLength* packet_number_length) {
208 DCHECK(!(type & FLAGS_LONG_HEADER));
209 const bool two_bits_packet_number_length =
fayang374888f2019-05-31 06:47:21 -0700210 infer_packet_header_type_from_version ? version > 44
QUICHE teama6ef0a62019-03-07 20:34:33 -0500211 : (type & FLAGS_FIXED_BIT);
212 if (two_bits_packet_number_length) {
213 *packet_number_length =
214 static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
215 return true;
216 }
217 switch (type & 0x07) {
218 case 0:
219 *packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
220 break;
221 case 1:
222 *packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
223 break;
224 case 2:
225 *packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
226 break;
227 default:
228 *packet_number_length = PACKET_6BYTE_PACKET_NUMBER;
229 return false;
230 }
231 return true;
232}
233
fayang374888f2019-05-31 06:47:21 -0700234uint8_t LongHeaderTypeToOnWireValue(QuicLongHeaderType type) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 switch (type) {
236 case INITIAL:
fayang374888f2019-05-31 06:47:21 -0700237 return 0;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500238 case ZERO_RTT_PROTECTED:
fayang374888f2019-05-31 06:47:21 -0700239 return 1 << 4;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500240 case HANDSHAKE:
fayang374888f2019-05-31 06:47:21 -0700241 return 2 << 4;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500242 case RETRY:
fayang374888f2019-05-31 06:47:21 -0700243 return 3 << 4;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500244 case VERSION_NEGOTIATION:
245 return 0xF0; // Value does not matter
246 default:
247 QUIC_BUG << "Invalid long header type: " << type;
248 return 0xFF;
249 }
250}
251
fayang374888f2019-05-31 06:47:21 -0700252// TODO(fayang): Remove |version| when deprecating
253// quic_no_framer_object_in_dispatcher.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500254bool GetLongHeaderType(QuicTransportVersion version,
255 uint8_t type,
256 QuicLongHeaderType* long_header_type) {
257 DCHECK((type & FLAGS_LONG_HEADER) && version != QUIC_VERSION_UNSUPPORTED);
fayang374888f2019-05-31 06:47:21 -0700258 if (version > 44) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500259 switch ((type & 0x30) >> 4) {
260 case 0:
261 *long_header_type = INITIAL;
262 break;
263 case 1:
264 *long_header_type = ZERO_RTT_PROTECTED;
265 break;
266 case 2:
267 *long_header_type = HANDSHAKE;
268 break;
269 case 3:
270 *long_header_type = RETRY;
271 break;
272 default:
273 QUIC_BUG << "Unreachable statement";
dschinazi072da7c2019-05-07 17:57:42 -0700274 *long_header_type = INVALID_PACKET_TYPE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500275 return false;
276 }
277 return true;
278 }
279
280 switch (type & 0x7F) {
281 case 0x7F:
282 *long_header_type = INITIAL;
283 break;
284 case 0x7C:
285 *long_header_type = ZERO_RTT_PROTECTED;
286 break;
287 case 0x7D:
288 *long_header_type = HANDSHAKE;
289 break;
290 case 0x7E:
291 *long_header_type = RETRY;
292 break;
293 default:
294 // Invalid packet header type. Whether a packet is version negotiation is
295 // determined by the version field.
296 *long_header_type = INVALID_PACKET_TYPE;
297 return false;
298 }
299 return true;
300}
301
fayang374888f2019-05-31 06:47:21 -0700302// TODO(fayang): Remove |version| when deprecating
303// quic_no_framer_object_in_dispatcher.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500304QuicPacketNumberLength GetLongHeaderPacketNumberLength(
305 QuicTransportVersion version,
306 uint8_t type) {
fayang374888f2019-05-31 06:47:21 -0700307 if (version > 44) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 return static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
309 }
310 return PACKET_4BYTE_PACKET_NUMBER;
311}
312
QUICHE team10b22a12019-03-21 15:31:42 -0700313// Used to get packet number space before packet gets decrypted.
314PacketNumberSpace GetPacketNumberSpace(const QuicPacketHeader& header) {
315 switch (header.form) {
316 case GOOGLE_QUIC_PACKET:
317 QUIC_BUG << "Try to get packet number space of Google QUIC packet";
318 break;
319 case IETF_QUIC_SHORT_HEADER_PACKET:
320 return APPLICATION_DATA;
321 case IETF_QUIC_LONG_HEADER_PACKET:
322 switch (header.long_packet_type) {
323 case INITIAL:
324 return INITIAL_DATA;
325 case HANDSHAKE:
326 return HANDSHAKE_DATA;
327 case ZERO_RTT_PROTECTED:
328 return APPLICATION_DATA;
329 case VERSION_NEGOTIATION:
330 case RETRY:
331 case INVALID_PACKET_TYPE:
332 QUIC_BUG << "Try to get packet number space of long header type: "
333 << QuicUtils::QuicLongHeaderTypetoString(
334 header.long_packet_type);
335 break;
336 }
337 }
338
339 return NUM_PACKET_NUMBER_SPACES;
340}
341
zhongyi546cc452019-04-12 15:27:49 -0700342EncryptionLevel GetEncryptionLevel(const QuicPacketHeader& header) {
343 switch (header.form) {
344 case GOOGLE_QUIC_PACKET:
345 QUIC_BUG << "Cannot determine EncryptionLevel from Google QUIC header";
346 break;
347 case IETF_QUIC_SHORT_HEADER_PACKET:
348 return ENCRYPTION_FORWARD_SECURE;
349 case IETF_QUIC_LONG_HEADER_PACKET:
350 switch (header.long_packet_type) {
351 case INITIAL:
352 return ENCRYPTION_INITIAL;
353 case HANDSHAKE:
354 return ENCRYPTION_HANDSHAKE;
355 case ZERO_RTT_PROTECTED:
356 return ENCRYPTION_ZERO_RTT;
357 case VERSION_NEGOTIATION:
358 case RETRY:
359 case INVALID_PACKET_TYPE:
360 QUIC_BUG << "No encryption used with type "
361 << QuicUtils::QuicLongHeaderTypetoString(
362 header.long_packet_type);
363 }
364 }
365 return NUM_ENCRYPTION_LEVELS;
366}
367
QUICHE teama6ef0a62019-03-07 20:34:33 -0500368QuicStringPiece TruncateErrorString(QuicStringPiece error) {
369 if (error.length() <= kMaxErrorStringLength) {
370 return error;
371 }
372 return QuicStringPiece(error.data(), kMaxErrorStringLength);
373}
374
375size_t TruncatedErrorStringSize(const QuicStringPiece& error) {
376 if (error.length() < kMaxErrorStringLength) {
377 return error.length();
378 }
379 return kMaxErrorStringLength;
380}
381
382uint8_t GetConnectionIdLengthValue(QuicConnectionIdLength length) {
383 if (length == 0) {
384 return 0;
385 }
386 return static_cast<uint8_t>(length - kConnectionIdLengthAdjustment);
387}
388
389bool IsValidPacketNumberLength(QuicPacketNumberLength packet_number_length) {
390 size_t length = packet_number_length;
391 return length == 1 || length == 2 || length == 4 || length == 6 ||
392 length == 8;
393}
394
395bool IsValidFullPacketNumber(uint64_t full_packet_number,
396 QuicTransportVersion version) {
QUICHE team577718a2019-03-20 09:00:59 -0700397 return full_packet_number > 0 || version == QUIC_VERSION_99;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500398}
399
dschinazi1f485a12019-05-13 11:57:01 -0700400bool AppendIetfConnectionIds(bool version_flag,
401 QuicConnectionId destination_connection_id,
402 QuicConnectionId source_connection_id,
403 QuicDataWriter* writer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404 if (!version_flag) {
405 return writer->WriteConnectionId(destination_connection_id);
406 }
407
408 // Compute connection ID length byte.
409 uint8_t dcil = GetConnectionIdLengthValue(
410 static_cast<QuicConnectionIdLength>(destination_connection_id.length()));
411 uint8_t scil = GetConnectionIdLengthValue(
412 static_cast<QuicConnectionIdLength>(source_connection_id.length()));
413 uint8_t connection_id_length = dcil << 4 | scil;
414
415 return writer->WriteUInt8(connection_id_length) &&
416 writer->WriteConnectionId(destination_connection_id) &&
417 writer->WriteConnectionId(source_connection_id);
418}
419
420enum class DroppedPacketReason {
421 // General errors
422 INVALID_PUBLIC_HEADER,
423 VERSION_MISMATCH,
424 // Version negotiation packet errors
425 INVALID_VERSION_NEGOTIATION_PACKET,
426 // Public reset packet errors, pre-v44
427 INVALID_PUBLIC_RESET_PACKET,
428 // Data packet errors
429 INVALID_PACKET_NUMBER,
430 INVALID_DIVERSIFICATION_NONCE,
431 DECRYPTION_FAILURE,
432 NUM_REASONS,
433};
434
435void RecordDroppedPacketReason(DroppedPacketReason reason) {
436 QUIC_CLIENT_HISTOGRAM_ENUM("QuicDroppedPacketReason", reason,
437 DroppedPacketReason::NUM_REASONS,
438 "The reason a packet was not processed. Recorded "
439 "each time such a packet is dropped");
440}
441
fayangccbab732019-05-13 10:11:25 -0700442PacketHeaderFormat GetIetfPacketHeaderFormat(uint8_t type_byte) {
443 return type_byte & FLAGS_LONG_HEADER ? IETF_QUIC_LONG_HEADER_PACKET
444 : IETF_QUIC_SHORT_HEADER_PACKET;
445}
446
QUICHE teama6ef0a62019-03-07 20:34:33 -0500447} // namespace
448
449QuicFramer::QuicFramer(const ParsedQuicVersionVector& supported_versions,
450 QuicTime creation_time,
451 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -0700452 uint8_t expected_server_connection_id_length)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500453 : visitor_(nullptr),
454 error_(QUIC_NO_ERROR),
dschinazi7b9278c2019-05-20 07:36:21 -0700455 last_serialized_server_connection_id_(EmptyQuicConnectionId()),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500456 last_version_label_(0),
457 version_(PROTOCOL_UNSUPPORTED, QUIC_VERSION_UNSUPPORTED),
458 supported_versions_(supported_versions),
QUICHE team6987b4a2019-03-15 16:23:04 -0700459 decrypter_level_(ENCRYPTION_INITIAL),
QUICHE team76086e42019-03-25 15:12:29 -0700460 alternative_decrypter_level_(NUM_ENCRYPTION_LEVELS),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500461 alternative_decrypter_latch_(false),
462 perspective_(perspective),
463 validate_flags_(true),
464 process_timestamps_(false),
465 creation_time_(creation_time),
466 last_timestamp_(QuicTime::Delta::Zero()),
467 first_sending_packet_number_(FirstSendingPacketNumber()),
468 data_producer_(nullptr),
469 infer_packet_header_type_from_version_(perspective ==
470 Perspective::IS_CLIENT),
dschinazi8ff74822019-05-28 16:37:20 -0700471 expected_server_connection_id_length_(
472 expected_server_connection_id_length),
473 should_update_expected_server_connection_id_length_(false),
nharper55fa6132019-05-07 19:37:21 -0700474 supports_multiple_packet_number_spaces_(false),
475 last_written_packet_number_length_(0) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500476 DCHECK(!supported_versions.empty());
477 version_ = supported_versions_[0];
QUICHE team76086e42019-03-25 15:12:29 -0700478 decrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullDecrypter>(perspective);
QUICHE team6987b4a2019-03-15 16:23:04 -0700479 encrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullEncrypter>(perspective);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500480}
481
482QuicFramer::~QuicFramer() {}
483
484// static
485size_t QuicFramer::GetMinStreamFrameSize(QuicTransportVersion version,
486 QuicStreamId stream_id,
487 QuicStreamOffset offset,
488 bool last_frame_in_packet,
489 QuicPacketLength data_length) {
490 if (version == QUIC_VERSION_99) {
491 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(stream_id) +
492 (last_frame_in_packet
493 ? 0
494 : QuicDataWriter::GetVarInt62Len(data_length)) +
495 (offset != 0 ? QuicDataWriter::GetVarInt62Len(offset) : 0);
496 }
497 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
498 GetStreamOffsetSize(version, offset) +
499 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize);
500}
501
502// static
503size_t QuicFramer::GetMinCryptoFrameSize(QuicStreamOffset offset,
504 QuicPacketLength data_length) {
505 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(offset) +
506 QuicDataWriter::GetVarInt62Len(data_length);
507}
508
509// static
510size_t QuicFramer::GetMessageFrameSize(QuicTransportVersion version,
511 bool last_frame_in_packet,
512 QuicByteCount length) {
fayangd4291e42019-05-30 10:31:21 -0700513 QUIC_BUG_IF(!VersionSupportsMessageFrames(version))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500514 << "Try to serialize MESSAGE frame in " << version;
515 return kQuicFrameTypeSize +
516 (last_frame_in_packet ? 0 : QuicDataWriter::GetVarInt62Len(length)) +
517 length;
518}
519
520// static
521size_t QuicFramer::GetMinAckFrameSize(
522 QuicTransportVersion version,
523 QuicPacketNumberLength largest_observed_length) {
524 if (version == QUIC_VERSION_99) {
525 // The minimal ack frame consists of the following four fields: Largest
526 // Acknowledged, ACK Delay, ACK Block Count, and First ACK Block. Minimum
527 // size of each is 1 byte.
528 return kQuicFrameTypeSize + 4;
529 }
530 size_t min_size = kQuicFrameTypeSize + largest_observed_length +
531 kQuicDeltaTimeLargestObservedSize;
532 return min_size + kQuicNumTimestampsSize;
533}
534
535// static
536size_t QuicFramer::GetStopWaitingFrameSize(
537 QuicTransportVersion version,
538 QuicPacketNumberLength packet_number_length) {
539 size_t min_size = kQuicFrameTypeSize + packet_number_length;
540 return min_size;
541}
542
543// static
544size_t QuicFramer::GetRstStreamFrameSize(QuicTransportVersion version,
545 const QuicRstStreamFrame& frame) {
546 if (version == QUIC_VERSION_99) {
547 return QuicDataWriter::GetVarInt62Len(frame.stream_id) +
548 QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
549 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
550 }
551 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize +
552 kQuicErrorCodeSize;
553}
554
555// static
fkastenholza037b8b2019-05-07 06:00:05 -0700556size_t QuicFramer::GetConnectionCloseFrameSize(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500557 QuicTransportVersion version,
558 const QuicConnectionCloseFrame& frame) {
fkastenholza037b8b2019-05-07 06:00:05 -0700559 if (version != QUIC_VERSION_99) {
560 // Not version 99/IETF QUIC, return Google QUIC CONNECTION CLOSE frame size.
561 return kQuicFrameTypeSize + kQuicErrorCodeSize +
562 kQuicErrorDetailsLengthSize +
563 TruncatedErrorStringSize(frame.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500564 }
fkastenholza037b8b2019-05-07 06:00:05 -0700565 // TODO(fkastenholz): For complete support of IETF QUIC CONNECTION_CLOSE,
566 // check if the frame is a Transport close and if the frame's
567 // extracted_error_code is not QUIC_IETF_GQUIC_ERROR_MISSING. If so,
568 // extend the error string to include " QuicErrorCode: #"
569 const size_t truncated_error_string_size =
570 TruncatedErrorStringSize(frame.error_details);
571 const size_t frame_size =
572 truncated_error_string_size +
573 QuicDataWriter::GetVarInt62Len(truncated_error_string_size) +
574 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
575 if (frame.close_type == IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
576 return frame_size;
577 }
578 // frame includes the transport_close_frame_type, so include its length.
579 return frame_size +
580 QuicDataWriter::GetVarInt62Len(frame.transport_close_frame_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500581}
582
583// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500584size_t QuicFramer::GetMinGoAwayFrameSize() {
585 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
586 kQuicMaxStreamIdSize;
587}
588
589// static
590size_t QuicFramer::GetWindowUpdateFrameSize(
591 QuicTransportVersion version,
592 const QuicWindowUpdateFrame& frame) {
593 if (version != QUIC_VERSION_99) {
594 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
595 }
596 if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
597 // Frame would be a MAX DATA frame, which has only a Maximum Data field.
598 return kQuicFrameTypeSize +
599 QuicDataWriter::GetVarInt62Len(frame.byte_offset);
600 }
601 // Frame would be MAX STREAM DATA, has Maximum Stream Data and Stream ID
602 // fields.
603 return kQuicFrameTypeSize +
604 QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
605 QuicDataWriter::GetVarInt62Len(frame.stream_id);
606}
607
608// static
609size_t QuicFramer::GetMaxStreamsFrameSize(QuicTransportVersion version,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700610 const QuicMaxStreamsFrame& frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500611 if (version != QUIC_VERSION_99) {
612 QUIC_BUG << "In version " << version
fkastenholz3c4eabf2019-04-22 07:49:59 -0700613 << " - not 99 - and tried to serialize MaxStreams Frame.";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500614 }
fkastenholz3c4eabf2019-04-22 07:49:59 -0700615 return kQuicFrameTypeSize +
616 QuicDataWriter::GetVarInt62Len(frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500617}
618
619// static
620size_t QuicFramer::GetStreamsBlockedFrameSize(
621 QuicTransportVersion version,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700622 const QuicStreamsBlockedFrame& frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500623 if (version != QUIC_VERSION_99) {
624 QUIC_BUG << "In version " << version
fkastenholz3c4eabf2019-04-22 07:49:59 -0700625 << " - not 99 - and tried to serialize StreamsBlocked Frame.";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500626 }
627
fkastenholz3c4eabf2019-04-22 07:49:59 -0700628 return kQuicFrameTypeSize +
629 QuicDataWriter::GetVarInt62Len(frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500630}
631
632// static
633size_t QuicFramer::GetBlockedFrameSize(QuicTransportVersion version,
634 const QuicBlockedFrame& frame) {
635 if (version != QUIC_VERSION_99) {
636 return kQuicFrameTypeSize + kQuicMaxStreamIdSize;
637 }
638 if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
639 // return size of IETF QUIC Blocked frame
640 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset);
641 }
642 // return size of IETF QUIC Stream Blocked frame.
643 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset) +
644 QuicDataWriter::GetVarInt62Len(frame.stream_id);
645}
646
647// static
648size_t QuicFramer::GetStopSendingFrameSize(const QuicStopSendingFrame& frame) {
649 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.stream_id) +
650 sizeof(QuicApplicationErrorCode);
651}
652
653// static
654size_t QuicFramer::GetPathChallengeFrameSize(
655 const QuicPathChallengeFrame& frame) {
656 return kQuicFrameTypeSize + sizeof(frame.data_buffer);
657}
658
659// static
660size_t QuicFramer::GetPathResponseFrameSize(
661 const QuicPathResponseFrame& frame) {
662 return kQuicFrameTypeSize + sizeof(frame.data_buffer);
663}
664
665// static
666size_t QuicFramer::GetRetransmittableControlFrameSize(
667 QuicTransportVersion version,
668 const QuicFrame& frame) {
669 switch (frame.type) {
670 case PING_FRAME:
671 // Ping has no payload.
672 return kQuicFrameTypeSize;
673 case RST_STREAM_FRAME:
674 return GetRstStreamFrameSize(version, *frame.rst_stream_frame);
675 case CONNECTION_CLOSE_FRAME:
fkastenholza037b8b2019-05-07 06:00:05 -0700676 return GetConnectionCloseFrameSize(version,
677 *frame.connection_close_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500678 case GOAWAY_FRAME:
679 return GetMinGoAwayFrameSize() +
680 TruncatedErrorStringSize(frame.goaway_frame->reason_phrase);
681 case WINDOW_UPDATE_FRAME:
682 // For version 99, this could be either a MAX DATA or MAX STREAM DATA.
683 // GetWindowUpdateFrameSize figures this out and returns the correct
684 // length.
685 return GetWindowUpdateFrameSize(version, *frame.window_update_frame);
686 case BLOCKED_FRAME:
687 return GetBlockedFrameSize(version, *frame.blocked_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500688 case NEW_CONNECTION_ID_FRAME:
689 return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
690 case RETIRE_CONNECTION_ID_FRAME:
691 return GetRetireConnectionIdFrameSize(*frame.retire_connection_id_frame);
692 case NEW_TOKEN_FRAME:
693 return GetNewTokenFrameSize(*frame.new_token_frame);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700694 case MAX_STREAMS_FRAME:
695 return GetMaxStreamsFrameSize(version, frame.max_streams_frame);
696 case STREAMS_BLOCKED_FRAME:
697 return GetStreamsBlockedFrameSize(version, frame.streams_blocked_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500698 case PATH_RESPONSE_FRAME:
699 return GetPathResponseFrameSize(*frame.path_response_frame);
700 case PATH_CHALLENGE_FRAME:
701 return GetPathChallengeFrameSize(*frame.path_challenge_frame);
702 case STOP_SENDING_FRAME:
703 return GetStopSendingFrameSize(*frame.stop_sending_frame);
704
705 case STREAM_FRAME:
706 case ACK_FRAME:
707 case STOP_WAITING_FRAME:
708 case MTU_DISCOVERY_FRAME:
709 case PADDING_FRAME:
710 case MESSAGE_FRAME:
711 case CRYPTO_FRAME:
712 case NUM_FRAME_TYPES:
713 DCHECK(false);
714 return 0;
715 }
716
717 // Not reachable, but some Chrome compilers can't figure that out. *sigh*
718 DCHECK(false);
719 return 0;
720}
721
722// static
723size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
724 // Sizes are 1 through 4 bytes.
725 for (int i = 1; i <= 4; ++i) {
726 stream_id >>= 8;
727 if (stream_id == 0) {
728 return i;
729 }
730 }
731 QUIC_BUG << "Failed to determine StreamIDSize.";
732 return 4;
733}
734
735// static
736size_t QuicFramer::GetStreamOffsetSize(QuicTransportVersion version,
737 QuicStreamOffset offset) {
738 // 0 is a special case.
739 if (offset == 0) {
740 return 0;
741 }
742 // 2 through 8 are the remaining sizes.
743 offset >>= 8;
744 for (int i = 2; i <= 8; ++i) {
745 offset >>= 8;
746 if (offset == 0) {
747 return i;
748 }
749 }
750 QUIC_BUG << "Failed to determine StreamOffsetSize.";
751 return 8;
752}
753
754// static
755size_t QuicFramer::GetNewConnectionIdFrameSize(
756 const QuicNewConnectionIdFrame& frame) {
757 return kQuicFrameTypeSize +
758 QuicDataWriter::GetVarInt62Len(frame.sequence_number) +
759 kConnectionIdLengthSize + frame.connection_id.length() +
760 sizeof(frame.stateless_reset_token);
761}
762
763// static
764size_t QuicFramer::GetRetireConnectionIdFrameSize(
765 const QuicRetireConnectionIdFrame& frame) {
766 return kQuicFrameTypeSize +
767 QuicDataWriter::GetVarInt62Len(frame.sequence_number);
768}
769
770// static
771size_t QuicFramer::GetNewTokenFrameSize(const QuicNewTokenFrame& frame) {
772 return kQuicFrameTypeSize +
773 QuicDataWriter::GetVarInt62Len(frame.token.length()) +
774 frame.token.length();
775}
776
777// TODO(nharper): Change this method to take a ParsedQuicVersion.
778bool QuicFramer::IsSupportedTransportVersion(
779 const QuicTransportVersion version) const {
780 for (ParsedQuicVersion supported_version : supported_versions_) {
781 if (version == supported_version.transport_version) {
782 return true;
783 }
784 }
785 return false;
786}
787
788bool QuicFramer::IsSupportedVersion(const ParsedQuicVersion version) const {
789 for (const ParsedQuicVersion& supported_version : supported_versions_) {
790 if (version == supported_version) {
791 return true;
792 }
793 }
794 return false;
795}
796
797size_t QuicFramer::GetSerializedFrameLength(
798 const QuicFrame& frame,
799 size_t free_bytes,
800 bool first_frame,
801 bool last_frame,
802 QuicPacketNumberLength packet_number_length) {
803 // Prevent a rare crash reported in b/19458523.
804 if (frame.type == ACK_FRAME && frame.ack_frame == nullptr) {
805 QUIC_BUG << "Cannot compute the length of a null ack frame. free_bytes:"
806 << free_bytes << " first_frame:" << first_frame
807 << " last_frame:" << last_frame
808 << " seq num length:" << packet_number_length;
809 set_error(QUIC_INTERNAL_ERROR);
810 visitor_->OnError(this);
811 return 0;
812 }
813 if (frame.type == PADDING_FRAME) {
814 if (frame.padding_frame.num_padding_bytes == -1) {
815 // Full padding to the end of the packet.
816 return free_bytes;
817 } else {
818 // Lite padding.
819 return free_bytes <
820 static_cast<size_t>(frame.padding_frame.num_padding_bytes)
821 ? free_bytes
822 : frame.padding_frame.num_padding_bytes;
823 }
824 }
825
826 size_t frame_len =
827 ComputeFrameLength(frame, last_frame, packet_number_length);
828 if (frame_len <= free_bytes) {
829 // Frame fits within packet. Note that acks may be truncated.
830 return frame_len;
831 }
832 // Only truncate the first frame in a packet, so if subsequent ones go
833 // over, stop including more frames.
834 if (!first_frame) {
835 return 0;
836 }
837 bool can_truncate =
838 frame.type == ACK_FRAME &&
839 free_bytes >= GetMinAckFrameSize(version_.transport_version,
840 PACKET_6BYTE_PACKET_NUMBER);
841 if (can_truncate) {
dschinazi66dea072019-04-09 11:41:06 -0700842 // Truncate the frame so the packet will not exceed kMaxOutgoingPacketSize.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500843 // Note that we may not use every byte of the writer in this case.
844 QUIC_DLOG(INFO) << ENDPOINT
845 << "Truncating large frame, free bytes: " << free_bytes;
846 return free_bytes;
847 }
848 return 0;
849}
850
851QuicFramer::AckFrameInfo::AckFrameInfo()
852 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {}
853
854QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default;
855
856QuicFramer::AckFrameInfo::~AckFrameInfo() {}
857
858bool QuicFramer::WriteIetfLongHeaderLength(const QuicPacketHeader& header,
859 QuicDataWriter* writer,
860 size_t length_field_offset,
861 EncryptionLevel level) {
862 if (!QuicVersionHasLongHeaderLengths(transport_version()) ||
863 !header.version_flag || length_field_offset == 0) {
864 return true;
865 }
866 if (writer->length() < length_field_offset ||
867 writer->length() - length_field_offset <
868 kQuicDefaultLongHeaderLengthLength) {
869 set_detailed_error("Invalid length_field_offset.");
870 QUIC_BUG << "Invalid length_field_offset.";
871 return false;
872 }
873 size_t length_to_write = writer->length() - length_field_offset -
874 kQuicDefaultLongHeaderLengthLength;
875 // Add length of auth tag.
876 length_to_write = GetCiphertextSize(level, length_to_write);
877
878 QuicDataWriter length_writer(writer->length() - length_field_offset,
879 writer->data() + length_field_offset);
880 if (!length_writer.WriteVarInt62(length_to_write,
881 kQuicDefaultLongHeaderLengthLength)) {
882 set_detailed_error("Failed to overwrite long header length.");
883 QUIC_BUG << "Failed to overwrite long header length.";
884 return false;
885 }
886 return true;
887}
888
889size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
890 const QuicFrames& frames,
891 char* buffer,
892 size_t packet_length,
893 EncryptionLevel level) {
894 QuicDataWriter writer(packet_length, buffer);
895 size_t length_field_offset = 0;
896 if (!AppendPacketHeader(header, &writer, &length_field_offset)) {
897 QUIC_BUG << "AppendPacketHeader failed";
898 return 0;
899 }
900
901 if (transport_version() == QUIC_VERSION_99) {
902 if (AppendIetfFrames(frames, &writer) == 0) {
903 return 0;
904 }
905 if (!WriteIetfLongHeaderLength(header, &writer, length_field_offset,
906 level)) {
907 return 0;
908 }
909 return writer.length();
910 }
911 // TODO(dschinazi) if we enable long header lengths before v99, we need to
912 // add support for fixing up lengths in QuicFramer::BuildDataPacket.
913 DCHECK(!QuicVersionHasLongHeaderLengths(transport_version()));
914
915 size_t i = 0;
916 for (const QuicFrame& frame : frames) {
917 // Determine if we should write stream frame length in header.
918 const bool last_frame_in_packet = i == frames.size() - 1;
919 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) {
920 QUIC_BUG << "AppendTypeByte failed";
921 return 0;
922 }
923
924 switch (frame.type) {
925 case PADDING_FRAME:
926 if (!AppendPaddingFrame(frame.padding_frame, &writer)) {
927 QUIC_BUG << "AppendPaddingFrame of "
928 << frame.padding_frame.num_padding_bytes << " failed";
929 return 0;
930 }
931 break;
932 case STREAM_FRAME:
933 if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
934 &writer)) {
935 QUIC_BUG << "AppendStreamFrame failed";
936 return 0;
937 }
938 break;
939 case ACK_FRAME:
940 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) {
941 QUIC_BUG << "AppendAckFrameAndTypeByte failed: " << detailed_error_;
942 return 0;
943 }
944 break;
945 case STOP_WAITING_FRAME:
946 if (!AppendStopWaitingFrame(header, frame.stop_waiting_frame,
947 &writer)) {
948 QUIC_BUG << "AppendStopWaitingFrame failed";
949 return 0;
950 }
951 break;
952 case MTU_DISCOVERY_FRAME:
953 // MTU discovery frames are serialized as ping frames.
954 QUIC_FALLTHROUGH_INTENDED;
955 case PING_FRAME:
956 // Ping has no payload.
957 break;
958 case RST_STREAM_FRAME:
959 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
960 QUIC_BUG << "AppendRstStreamFrame failed";
961 return 0;
962 }
963 break;
964 case CONNECTION_CLOSE_FRAME:
965 if (!AppendConnectionCloseFrame(*frame.connection_close_frame,
966 &writer)) {
967 QUIC_BUG << "AppendConnectionCloseFrame failed";
968 return 0;
969 }
970 break;
971 case GOAWAY_FRAME:
972 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
973 QUIC_BUG << "AppendGoAwayFrame failed";
974 return 0;
975 }
976 break;
977 case WINDOW_UPDATE_FRAME:
978 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) {
979 QUIC_BUG << "AppendWindowUpdateFrame failed";
980 return 0;
981 }
982 break;
983 case BLOCKED_FRAME:
984 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) {
985 QUIC_BUG << "AppendBlockedFrame failed";
986 return 0;
987 }
988 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500989 case NEW_CONNECTION_ID_FRAME:
990 set_detailed_error(
991 "Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
992 return RaiseError(QUIC_INTERNAL_ERROR);
993 case RETIRE_CONNECTION_ID_FRAME:
994 set_detailed_error(
995 "Attempt to append RETIRE_CONNECTION_ID frame and not in version "
996 "99.");
997 return RaiseError(QUIC_INTERNAL_ERROR);
998 case NEW_TOKEN_FRAME:
999 set_detailed_error(
1000 "Attempt to append NEW_TOKEN_ID frame and not in version 99.");
1001 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001002 case MAX_STREAMS_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05001003 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07001004 "Attempt to append MAX_STREAMS frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001005 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001006 case STREAMS_BLOCKED_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05001007 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07001008 "Attempt to append STREAMS_BLOCKED frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001009 return RaiseError(QUIC_INTERNAL_ERROR);
1010 case PATH_RESPONSE_FRAME:
1011 set_detailed_error(
1012 "Attempt to append PATH_RESPONSE frame and not in version 99.");
1013 return RaiseError(QUIC_INTERNAL_ERROR);
1014 case PATH_CHALLENGE_FRAME:
1015 set_detailed_error(
1016 "Attempt to append PATH_CHALLENGE frame and not in version 99.");
1017 return RaiseError(QUIC_INTERNAL_ERROR);
1018 case STOP_SENDING_FRAME:
1019 set_detailed_error(
1020 "Attempt to append STOP_SENDING frame and not in version 99.");
1021 return RaiseError(QUIC_INTERNAL_ERROR);
1022 case MESSAGE_FRAME:
1023 if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1024 last_frame_in_packet, &writer)) {
1025 QUIC_BUG << "AppendMessageFrame failed";
1026 return 0;
1027 }
1028 break;
1029 case CRYPTO_FRAME:
QUICHE teamea740082019-03-11 17:58:43 -07001030 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001031 set_detailed_error(
1032 "Attempt to append CRYPTO frame in version prior to 47.");
1033 return RaiseError(QUIC_INTERNAL_ERROR);
1034 }
1035 if (!AppendCryptoFrame(*frame.crypto_frame, &writer)) {
1036 QUIC_BUG << "AppendCryptoFrame failed";
1037 return 0;
1038 }
1039 break;
1040 default:
1041 RaiseError(QUIC_INVALID_FRAME_DATA);
1042 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
1043 return 0;
1044 }
1045 ++i;
1046 }
1047
1048 return writer.length();
1049}
1050
1051size_t QuicFramer::AppendIetfFrames(const QuicFrames& frames,
1052 QuicDataWriter* writer) {
1053 size_t i = 0;
1054 for (const QuicFrame& frame : frames) {
1055 // Determine if we should write stream frame length in header.
1056 const bool last_frame_in_packet = i == frames.size() - 1;
1057 if (!AppendIetfTypeByte(frame, last_frame_in_packet, writer)) {
1058 QUIC_BUG << "AppendIetfTypeByte failed: " << detailed_error();
1059 return 0;
1060 }
1061
1062 switch (frame.type) {
1063 case PADDING_FRAME:
1064 if (!AppendPaddingFrame(frame.padding_frame, writer)) {
1065 QUIC_BUG << "AppendPaddingFrame of "
1066 << frame.padding_frame.num_padding_bytes
1067 << " failed: " << detailed_error();
1068 return 0;
1069 }
1070 break;
1071 case STREAM_FRAME:
1072 if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
1073 writer)) {
1074 QUIC_BUG << "AppendStreamFrame failed: " << detailed_error();
1075 return 0;
1076 }
1077 break;
1078 case ACK_FRAME:
1079 if (!AppendIetfAckFrameAndTypeByte(*frame.ack_frame, writer)) {
QUICHE team4fe0b942019-03-08 09:25:06 -05001080 QUIC_BUG << "AppendIetfAckFrameAndTypeByte failed: "
1081 << detailed_error();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001082 return 0;
1083 }
1084 break;
1085 case STOP_WAITING_FRAME:
1086 set_detailed_error(
1087 "Attempt to append STOP WAITING frame in version 99.");
1088 return RaiseError(QUIC_INTERNAL_ERROR);
1089 case MTU_DISCOVERY_FRAME:
1090 // MTU discovery frames are serialized as ping frames.
1091 QUIC_FALLTHROUGH_INTENDED;
1092 case PING_FRAME:
1093 // Ping has no payload.
1094 break;
1095 case RST_STREAM_FRAME:
1096 if (!AppendRstStreamFrame(*frame.rst_stream_frame, writer)) {
1097 QUIC_BUG << "AppendRstStreamFrame failed: " << detailed_error();
1098 return 0;
1099 }
1100 break;
1101 case CONNECTION_CLOSE_FRAME:
fkastenholz72f509b2019-04-10 09:17:49 -07001102 if (!AppendIetfConnectionCloseFrame(*frame.connection_close_frame,
1103 writer)) {
1104 QUIC_BUG << "AppendIetfConnectionCloseFrame failed: "
1105 << detailed_error();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001106 return 0;
1107 }
1108 break;
1109 case GOAWAY_FRAME:
1110 set_detailed_error("Attempt to append GOAWAY frame in version 99.");
1111 return RaiseError(QUIC_INTERNAL_ERROR);
1112 case WINDOW_UPDATE_FRAME:
1113 // Depending on whether there is a stream ID or not, will be either a
1114 // MAX STREAM DATA frame or a MAX DATA frame.
1115 if (frame.window_update_frame->stream_id ==
1116 QuicUtils::GetInvalidStreamId(transport_version())) {
1117 if (!AppendMaxDataFrame(*frame.window_update_frame, writer)) {
1118 QUIC_BUG << "AppendMaxDataFrame failed: " << detailed_error();
1119 return 0;
1120 }
1121 } else {
1122 if (!AppendMaxStreamDataFrame(*frame.window_update_frame, writer)) {
1123 QUIC_BUG << "AppendMaxStreamDataFrame failed: " << detailed_error();
1124 return 0;
1125 }
1126 }
1127 break;
1128 case BLOCKED_FRAME:
1129 if (!AppendBlockedFrame(*frame.blocked_frame, writer)) {
1130 QUIC_BUG << "AppendBlockedFrame failed: " << detailed_error();
1131 return 0;
1132 }
1133 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07001134 case MAX_STREAMS_FRAME:
1135 if (!AppendMaxStreamsFrame(frame.max_streams_frame, writer)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001136 QUIC_BUG << "AppendMaxStreamsFrame failed" << detailed_error();
1137 return 0;
1138 }
1139 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07001140 case STREAMS_BLOCKED_FRAME:
1141 if (!AppendStreamsBlockedFrame(frame.streams_blocked_frame, writer)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001142 QUIC_BUG << "AppendStreamsBlockedFrame failed" << detailed_error();
1143 return 0;
1144 }
1145 break;
1146 case NEW_CONNECTION_ID_FRAME:
1147 if (!AppendNewConnectionIdFrame(*frame.new_connection_id_frame,
1148 writer)) {
1149 QUIC_BUG << "AppendNewConnectionIdFrame failed: " << detailed_error();
1150 return 0;
1151 }
1152 break;
1153 case RETIRE_CONNECTION_ID_FRAME:
1154 if (!AppendRetireConnectionIdFrame(*frame.retire_connection_id_frame,
1155 writer)) {
1156 QUIC_BUG << "AppendRetireConnectionIdFrame failed: "
1157 << detailed_error();
1158 return 0;
1159 }
1160 break;
1161 case NEW_TOKEN_FRAME:
1162 if (!AppendNewTokenFrame(*frame.new_token_frame, writer)) {
1163 QUIC_BUG << "AppendNewTokenFrame failed: " << detailed_error();
1164 return 0;
1165 }
1166 break;
1167 case STOP_SENDING_FRAME:
1168 if (!AppendStopSendingFrame(*frame.stop_sending_frame, writer)) {
1169 QUIC_BUG << "AppendStopSendingFrame failed: " << detailed_error();
1170 return 0;
1171 }
1172 break;
1173 case PATH_CHALLENGE_FRAME:
1174 if (!AppendPathChallengeFrame(*frame.path_challenge_frame, writer)) {
1175 QUIC_BUG << "AppendPathChallengeFrame failed: " << detailed_error();
1176 return 0;
1177 }
1178 break;
1179 case PATH_RESPONSE_FRAME:
1180 if (!AppendPathResponseFrame(*frame.path_response_frame, writer)) {
1181 QUIC_BUG << "AppendPathResponseFrame failed: " << detailed_error();
1182 return 0;
1183 }
1184 break;
1185 case MESSAGE_FRAME:
1186 if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1187 last_frame_in_packet, writer)) {
1188 QUIC_BUG << "AppendMessageFrame failed: " << detailed_error();
1189 return 0;
1190 }
1191 break;
1192 case CRYPTO_FRAME:
1193 if (!AppendCryptoFrame(*frame.crypto_frame, writer)) {
1194 QUIC_BUG << "AppendCryptoFrame failed: " << detailed_error();
1195 return 0;
1196 }
1197 break;
1198 default:
1199 RaiseError(QUIC_INVALID_FRAME_DATA);
1200 set_detailed_error("Tried to append unknown frame type.");
1201 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
1202 return 0;
1203 }
1204 ++i;
1205 }
1206
1207 return writer->length();
1208}
1209
rch67cb9df2019-03-26 16:52:07 -07001210size_t QuicFramer::BuildConnectivityProbingPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05001211 const QuicPacketHeader& header,
1212 char* buffer,
1213 size_t packet_length,
1214 EncryptionLevel level) {
1215 QuicFrames frames;
1216
1217 // Write a PING frame, which has no data payload.
1218 QuicPingFrame ping_frame;
1219 frames.push_back(QuicFrame(ping_frame));
1220
1221 // Add padding to the rest of the packet.
1222 QuicPaddingFrame padding_frame;
1223 frames.push_back(QuicFrame(padding_frame));
1224
1225 return BuildDataPacket(header, frames, buffer, packet_length, level);
1226}
1227
QUICHE teama6ef0a62019-03-07 20:34:33 -05001228size_t QuicFramer::BuildPaddedPathChallengePacket(
1229 const QuicPacketHeader& header,
1230 char* buffer,
1231 size_t packet_length,
1232 QuicPathFrameBuffer* payload,
1233 QuicRandom* randomizer,
1234 EncryptionLevel level) {
1235 if (version_.transport_version != QUIC_VERSION_99) {
1236 QUIC_BUG << "Attempt to build a PATH_CHALLENGE Connectivity Probing "
1237 "packet and not doing IETF QUIC";
1238 return 0;
1239 }
1240 QuicFrames frames;
1241
1242 // Write a PATH_CHALLENGE frame, which has a random 8-byte payload
1243 randomizer->RandBytes(payload->data(), payload->size());
1244
1245 QuicPathChallengeFrame path_challenge_frame(0, *payload);
1246 frames.push_back(QuicFrame(&path_challenge_frame));
1247
1248 // Add padding to the rest of the packet in order to assess Path MTU
1249 // characteristics.
1250 QuicPaddingFrame padding_frame;
1251 frames.push_back(QuicFrame(padding_frame));
1252
1253 return BuildDataPacket(header, frames, buffer, packet_length, level);
1254}
1255
1256size_t QuicFramer::BuildPathResponsePacket(
1257 const QuicPacketHeader& header,
1258 char* buffer,
1259 size_t packet_length,
1260 const QuicDeque<QuicPathFrameBuffer>& payloads,
1261 const bool is_padded,
1262 EncryptionLevel level) {
1263 if (payloads.empty()) {
1264 QUIC_BUG
1265 << "Attempt to generate connectivity response with no request payloads";
1266 return 0;
1267 }
1268 if (version_.transport_version != QUIC_VERSION_99) {
1269 QUIC_BUG << "Attempt to build a PATH_RESPONSE Connectivity Probing "
1270 "packet and not doing IETF QUIC";
1271 return 0;
1272 }
1273
1274 std::vector<std::unique_ptr<QuicPathResponseFrame>> path_response_frames;
1275 for (const QuicPathFrameBuffer& payload : payloads) {
1276 // Note that the control frame ID can be 0 since this is not retransmitted.
1277 path_response_frames.push_back(
1278 QuicMakeUnique<QuicPathResponseFrame>(0, payload));
1279 }
1280
1281 QuicFrames frames;
1282 for (const std::unique_ptr<QuicPathResponseFrame>& path_response_frame :
1283 path_response_frames) {
1284 frames.push_back(QuicFrame(path_response_frame.get()));
1285 }
1286
1287 if (is_padded) {
1288 // Add padding to the rest of the packet in order to assess Path MTU
1289 // characteristics.
1290 QuicPaddingFrame padding_frame;
1291 frames.push_back(QuicFrame(padding_frame));
1292 }
1293
1294 return BuildDataPacket(header, frames, buffer, packet_length, level);
1295}
1296
1297// static
1298std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
1299 const QuicPublicResetPacket& packet) {
1300 CryptoHandshakeMessage reset;
1301 reset.set_tag(kPRST);
1302 reset.SetValue(kRNON, packet.nonce_proof);
1303 if (packet.client_address.host().address_family() !=
1304 IpAddressFamily::IP_UNSPEC) {
1305 // packet.client_address is non-empty.
1306 QuicSocketAddressCoder address_coder(packet.client_address);
vasilvvc48c8712019-03-11 13:38:16 -07001307 std::string serialized_address = address_coder.Encode();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001308 if (serialized_address.empty()) {
1309 return nullptr;
1310 }
1311 reset.SetStringPiece(kCADR, serialized_address);
1312 }
1313 if (!packet.endpoint_id.empty()) {
1314 reset.SetStringPiece(kEPID, packet.endpoint_id);
1315 }
1316 const QuicData& reset_serialized = reset.GetSerialized();
1317
1318 size_t len = kPublicFlagsSize + packet.connection_id.length() +
1319 reset_serialized.length();
1320 std::unique_ptr<char[]> buffer(new char[len]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001321 QuicDataWriter writer(len, buffer.get());
1322
1323 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
1324 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
1325 // This hack makes post-v33 public reset packet look like pre-v33 packets.
1326 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1327 if (!writer.WriteUInt8(flags)) {
1328 return nullptr;
1329 }
1330
1331 if (!writer.WriteConnectionId(packet.connection_id)) {
1332 return nullptr;
1333 }
1334
1335 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
1336 return nullptr;
1337 }
1338
1339 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1340}
1341
1342// static
1343std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildIetfStatelessResetPacket(
1344 QuicConnectionId connection_id,
1345 QuicUint128 stateless_reset_token) {
1346 QUIC_DVLOG(1) << "Building IETF stateless reset packet.";
1347 size_t len = kPacketHeaderTypeSize + kMinRandomBytesLengthInStatelessReset +
1348 sizeof(stateless_reset_token);
1349 std::unique_ptr<char[]> buffer(new char[len]);
1350 QuicDataWriter writer(len, buffer.get());
1351
1352 uint8_t type = 0;
1353 type |= FLAGS_FIXED_BIT;
1354 type |= FLAGS_SHORT_HEADER_RESERVED_1;
1355 type |= FLAGS_SHORT_HEADER_RESERVED_2;
fayang374888f2019-05-31 06:47:21 -07001356 type |= PacketNumberLengthToOnWireValue(PACKET_1BYTE_PACKET_NUMBER);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001357
1358 // Append type byte.
1359 if (!writer.WriteUInt8(type)) {
1360 return nullptr;
1361 }
1362 // Append random bytes.
1363 if (!writer.WriteRandomBytes(QuicRandom::GetInstance(),
1364 kMinRandomBytesLengthInStatelessReset)) {
1365 return nullptr;
1366 }
1367
1368 // Append stateless reset token.
1369 if (!writer.WriteBytes(&stateless_reset_token,
1370 sizeof(stateless_reset_token))) {
1371 return nullptr;
1372 }
1373 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1374}
1375
1376// static
1377std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
dschinazi8ff74822019-05-28 16:37:20 -07001378 QuicConnectionId server_connection_id,
dschinazib417d602019-05-29 13:08:45 -07001379 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001380 bool ietf_quic,
1381 const ParsedQuicVersionVector& versions) {
1382 if (ietf_quic) {
dschinazib417d602019-05-29 13:08:45 -07001383 return BuildIetfVersionNegotiationPacket(server_connection_id,
1384 client_connection_id, versions);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001385 }
dschinazib417d602019-05-29 13:08:45 -07001386
1387 // The GQUIC encoding does not support encoding client connection IDs.
1388 DCHECK(client_connection_id.IsEmpty());
1389
QUICHE teama6ef0a62019-03-07 20:34:33 -05001390 DCHECK(!versions.empty());
dschinazi8ff74822019-05-28 16:37:20 -07001391 size_t len = kPublicFlagsSize + server_connection_id.length() +
QUICHE teama6ef0a62019-03-07 20:34:33 -05001392 versions.size() * kQuicVersionSize;
1393 std::unique_ptr<char[]> buffer(new char[len]);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001394 QuicDataWriter writer(len, buffer.get());
1395
1396 uint8_t flags = static_cast<uint8_t>(
1397 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
1398 // TODO(rch): Remove this QUIC_VERSION_32 is retired.
1399 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1400 if (!writer.WriteUInt8(flags)) {
1401 return nullptr;
1402 }
1403
dschinazi8ff74822019-05-28 16:37:20 -07001404 if (!writer.WriteConnectionId(server_connection_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001405 return nullptr;
1406 }
1407
1408 for (const ParsedQuicVersion& version : versions) {
nharpereaab5ad2019-05-31 12:23:25 -07001409 if (!writer.WriteUInt32(CreateQuicVersionLabel(version))) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001410 return nullptr;
1411 }
1412 }
1413
1414 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1415}
1416
1417// static
1418std::unique_ptr<QuicEncryptedPacket>
1419QuicFramer::BuildIetfVersionNegotiationPacket(
dschinazib417d602019-05-29 13:08:45 -07001420 QuicConnectionId server_connection_id,
1421 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001422 const ParsedQuicVersionVector& versions) {
dschinazi5a354c92019-05-09 12:18:53 -07001423 QUIC_DVLOG(1) << "Building IETF version negotiation packet: "
1424 << ParsedQuicVersionVectorToString(versions);
dschinazib417d602019-05-29 13:08:45 -07001425 DCHECK(client_connection_id.IsEmpty() ||
1426 GetQuicRestartFlag(quic_do_not_override_connection_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001427 DCHECK(!versions.empty());
1428 size_t len = kPacketHeaderTypeSize + kConnectionIdLengthSize +
dschinazib417d602019-05-29 13:08:45 -07001429 client_connection_id.length() + server_connection_id.length() +
QUICHE teama6ef0a62019-03-07 20:34:33 -05001430 (versions.size() + 1) * kQuicVersionSize;
1431 std::unique_ptr<char[]> buffer(new char[len]);
1432 QuicDataWriter writer(len, buffer.get());
1433
1434 // TODO(fayang): Randomly select a value for the type.
dschinazi072da7c2019-05-07 17:57:42 -07001435 uint8_t type = static_cast<uint8_t>(FLAGS_LONG_HEADER);
dschinazi9e92fb32019-05-08 14:47:24 -07001436 if (GetQuicReloadableFlag(quic_send_version_negotiation_fixed_bit)) {
1437 QUIC_RELOADABLE_FLAG_COUNT(quic_send_version_negotiation_fixed_bit);
1438 type |= static_cast<uint8_t>(FLAGS_FIXED_BIT);
1439 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001440 if (!writer.WriteUInt8(type)) {
1441 return nullptr;
1442 }
1443
1444 if (!writer.WriteUInt32(0)) {
1445 return nullptr;
1446 }
1447
dschinazib417d602019-05-29 13:08:45 -07001448 if (!AppendIetfConnectionIds(true, client_connection_id, server_connection_id,
1449 &writer)) {
dschinazi1f485a12019-05-13 11:57:01 -07001450 return nullptr;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001451 }
1452
1453 for (const ParsedQuicVersion& version : versions) {
nharpereaab5ad2019-05-31 12:23:25 -07001454 if (!writer.WriteUInt32(CreateQuicVersionLabel(version))) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001455 return nullptr;
1456 }
1457 }
1458
1459 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1460}
1461
1462bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
1463 QuicDataReader reader(packet.data(), packet.length());
1464
1465 bool packet_has_ietf_packet_header = false;
1466 if (infer_packet_header_type_from_version_) {
1467 packet_has_ietf_packet_header =
fayangd4291e42019-05-30 10:31:21 -07001468 VersionHasIetfInvariantHeader(version_.transport_version);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001469 } else if (!reader.IsDoneReading()) {
1470 uint8_t type = reader.PeekByte();
1471 packet_has_ietf_packet_header = QuicUtils::IsIetfPacketHeader(type);
1472 }
1473 if (packet_has_ietf_packet_header) {
1474 QUIC_DVLOG(1) << ENDPOINT << "Processing IETF QUIC packet.";
1475 }
1476
1477 visitor_->OnPacket();
1478
1479 QuicPacketHeader header;
1480 if (!ProcessPublicHeader(&reader, packet_has_ietf_packet_header, &header)) {
1481 DCHECK_NE("", detailed_error_);
1482 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: "
1483 << detailed_error_;
1484 DCHECK_NE("", detailed_error_);
1485 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_HEADER);
1486 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1487 }
1488
1489 if (!visitor_->OnUnauthenticatedPublicHeader(header)) {
1490 // The visitor suppresses further processing of the packet.
1491 return true;
1492 }
1493
dschinazie0df3f72019-05-06 16:37:51 -07001494 if (IsVersionNegotiation(header, packet_has_ietf_packet_header)) {
dschinazi072da7c2019-05-07 17:57:42 -07001495 if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) {
1496 QUIC_DVLOG(1) << ENDPOINT << "Received version negotiation packet";
1497 return ProcessVersionNegotiationPacket(&reader, header);
1498 }
1499 QUIC_RESTART_FLAG_COUNT_N(quic_server_drop_version_negotiation, 1, 2);
1500 if (perspective_ == Perspective::IS_CLIENT) {
1501 QUIC_DVLOG(1) << "Client received version negotiation packet";
1502 return ProcessVersionNegotiationPacket(&reader, header);
1503 } else {
1504 QUIC_DLOG(ERROR) << "Server received version negotiation packet";
1505 set_detailed_error("Server received version negotiation packet.");
1506 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1507 }
dschinazie0df3f72019-05-06 16:37:51 -07001508 }
1509
1510 if (header.version_flag && header.version != version_) {
1511 if (perspective_ == Perspective::IS_SERVER) {
1512 if (!visitor_->OnProtocolVersionMismatch(header.version, header.form)) {
1513 RecordDroppedPacketReason(DroppedPacketReason::VERSION_MISMATCH);
1514 return true;
1515 }
1516 } else {
1517 // A client received a packet of a different version but that packet is
1518 // not a version negotiation packet. It is therefore invalid and dropped.
1519 QUIC_DLOG(ERROR) << "Client received unexpected version "
1520 << ParsedQuicVersionToString(header.version)
1521 << " instead of " << ParsedQuicVersionToString(version_);
1522 set_detailed_error("Client received unexpected version.");
1523 return RaiseError(QUIC_INVALID_VERSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001524 }
1525 }
1526
1527 bool rv;
dschinazie0df3f72019-05-06 16:37:51 -07001528 if (header.long_packet_type == RETRY) {
dschinazi244f6dc2019-05-06 15:45:16 -07001529 rv = ProcessRetryPacket(&reader, header);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001530 } else if (header.reset_flag) {
1531 rv = ProcessPublicResetPacket(&reader, header);
dschinazie8d7fa72019-04-05 14:44:40 -07001532 } else if (packet.length() <= kMaxIncomingPacketSize) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001533 // The optimized decryption algorithm implementations run faster when
1534 // operating on aligned memory.
dschinazie8d7fa72019-04-05 14:44:40 -07001535 QUIC_CACHELINE_ALIGNED char buffer[kMaxIncomingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001536 if (packet_has_ietf_packet_header) {
1537 rv = ProcessIetfDataPacket(&reader, &header, packet, buffer,
dschinazie8d7fa72019-04-05 14:44:40 -07001538 QUIC_ARRAYSIZE(buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001539 } else {
dschinazie8d7fa72019-04-05 14:44:40 -07001540 rv = ProcessDataPacket(&reader, &header, packet, buffer,
1541 QUIC_ARRAYSIZE(buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001542 }
1543 } else {
1544 std::unique_ptr<char[]> large_buffer(new char[packet.length()]);
1545 if (packet_has_ietf_packet_header) {
1546 rv = ProcessIetfDataPacket(&reader, &header, packet, large_buffer.get(),
1547 packet.length());
1548 } else {
1549 rv = ProcessDataPacket(&reader, &header, packet, large_buffer.get(),
1550 packet.length());
1551 }
1552 QUIC_BUG_IF(rv) << "QUIC should never successfully process packets larger"
dschinazie8d7fa72019-04-05 14:44:40 -07001553 << "than kMaxIncomingPacketSize. packet size:"
1554 << packet.length();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001555 }
1556 return rv;
1557}
1558
1559bool QuicFramer::ProcessVersionNegotiationPacket(
1560 QuicDataReader* reader,
1561 const QuicPacketHeader& header) {
1562 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1563
QUICHE team2252b702019-05-14 23:55:14 -04001564 QuicVersionNegotiationPacket packet(
1565 GetServerConnectionIdAsRecipient(header, perspective_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001566 // Try reading at least once to raise error if the packet is invalid.
1567 do {
1568 QuicVersionLabel version_label;
fayang40315542019-05-09 09:19:09 -07001569 if (!ProcessVersionLabel(reader, &version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001570 set_detailed_error("Unable to read supported version in negotiation.");
1571 RecordDroppedPacketReason(
1572 DroppedPacketReason::INVALID_VERSION_NEGOTIATION_PACKET);
1573 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1574 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001575 packet.versions.push_back(ParseQuicVersionLabel(version_label));
1576 } while (!reader->IsDoneReading());
1577
dschinazi5a354c92019-05-09 12:18:53 -07001578 QUIC_DLOG(INFO) << ENDPOINT << "parsed version negotiation: "
1579 << ParsedQuicVersionVectorToString(packet.versions);
1580
QUICHE teama6ef0a62019-03-07 20:34:33 -05001581 visitor_->OnVersionNegotiationPacket(packet);
1582 return true;
1583}
1584
dschinazi244f6dc2019-05-06 15:45:16 -07001585bool QuicFramer::ProcessRetryPacket(QuicDataReader* reader,
1586 const QuicPacketHeader& header) {
1587 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1588
1589 // Parse Original Destination Connection ID Length.
1590 uint8_t odcil = header.type_byte & 0xf;
1591 if (odcil != 0) {
1592 odcil += kConnectionIdLengthAdjustment;
1593 }
1594
1595 // Parse Original Destination Connection ID.
1596 QuicConnectionId original_destination_connection_id;
1597 if (!reader->ReadConnectionId(&original_destination_connection_id, odcil)) {
1598 set_detailed_error("Unable to read Original Destination ConnectionId.");
1599 return false;
1600 }
1601
1602 QuicStringPiece retry_token = reader->ReadRemainingPayload();
1603 visitor_->OnRetryPacket(original_destination_connection_id,
1604 header.source_connection_id, retry_token);
1605 return true;
1606}
1607
QUICHE teama6ef0a62019-03-07 20:34:33 -05001608bool QuicFramer::MaybeProcessIetfInitialRetryToken(
1609 QuicDataReader* encrypted_reader,
1610 QuicPacketHeader* header) {
1611 if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1612 header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1613 header->long_packet_type != INITIAL) {
1614 return true;
1615 }
1616 uint64_t retry_token_length = 0;
1617 header->retry_token_length_length = encrypted_reader->PeekVarInt62Length();
1618 if (!encrypted_reader->ReadVarInt62(&retry_token_length)) {
1619 set_detailed_error("Unable to read INITIAL retry token length.");
1620 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1621 }
1622 header->retry_token = encrypted_reader->PeekRemainingPayload();
1623 // Safety check to avoid spending ressources if malformed.
1624 // At this point header->retry_token contains the rest of the packet
1625 // so its length() is the amount of data remaining in the packet.
1626 if (retry_token_length > header->retry_token.length()) {
1627 set_detailed_error("INITIAL token length longer than packet.");
1628 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1629 }
1630 // Resize retry_token to make it only contain the retry token.
1631 header->retry_token.remove_suffix(header->retry_token.length() -
1632 retry_token_length);
1633 // Advance encrypted_reader by retry_token_length.
1634 uint8_t wasted_byte;
1635 for (uint64_t i = 0; i < retry_token_length; ++i) {
1636 if (!encrypted_reader->ReadUInt8(&wasted_byte)) {
1637 set_detailed_error("Unable to read INITIAL retry token.");
1638 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1639 }
1640 }
1641 return true;
1642}
1643
1644// Seeks the current packet to check for a coalesced packet at the end.
1645// If the IETF length field only spans part of the outer packet,
1646// then there is a coalesced packet after this one.
1647void QuicFramer::MaybeProcessCoalescedPacket(
1648 const QuicDataReader& encrypted_reader,
1649 uint64_t remaining_bytes_length,
1650 const QuicPacketHeader& header) {
1651 if (header.remaining_packet_length >= remaining_bytes_length) {
1652 // There is no coalesced packet.
1653 return;
1654 }
1655
1656 QuicStringPiece remaining_data = encrypted_reader.PeekRemainingPayload();
1657 DCHECK_EQ(remaining_data.length(), remaining_bytes_length);
1658
1659 const char* coalesced_data =
1660 remaining_data.data() + header.remaining_packet_length;
1661 uint64_t coalesced_data_length =
1662 remaining_bytes_length - header.remaining_packet_length;
1663 QuicDataReader coalesced_reader(coalesced_data, coalesced_data_length);
1664
1665 QuicPacketHeader coalesced_header;
1666 if (!ProcessIetfPacketHeader(&coalesced_reader, &coalesced_header)) {
1667 QUIC_PEER_BUG << ENDPOINT
1668 << "Failed to parse received coalesced header of length "
1669 << coalesced_data_length << ": "
1670 << QuicTextUtils::HexEncode(coalesced_data,
1671 coalesced_data_length)
1672 << " previous header was " << header;
1673 return;
1674 }
1675
1676 if (coalesced_header.destination_connection_id !=
1677 header.destination_connection_id ||
1678 (coalesced_header.form != IETF_QUIC_SHORT_HEADER_PACKET &&
1679 coalesced_header.version != header.version)) {
1680 QUIC_PEER_BUG << ENDPOINT << "Received mismatched coalesced header "
1681 << coalesced_header << " previous header was " << header;
1682 return;
1683 }
1684
1685 QuicEncryptedPacket coalesced_packet(coalesced_data, coalesced_data_length,
1686 /*owns_buffer=*/false);
1687 visitor_->OnCoalescedPacket(coalesced_packet);
1688}
1689
1690bool QuicFramer::MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
1691 QuicPacketHeader* header) {
1692 if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1693 header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1694 (header->long_packet_type != INITIAL &&
1695 header->long_packet_type != HANDSHAKE &&
1696 header->long_packet_type != ZERO_RTT_PROTECTED)) {
1697 return true;
1698 }
1699 header->length_length = encrypted_reader->PeekVarInt62Length();
1700 if (!encrypted_reader->ReadVarInt62(&header->remaining_packet_length)) {
1701 set_detailed_error("Unable to read long header payload length.");
1702 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1703 }
1704 uint64_t remaining_bytes_length = encrypted_reader->BytesRemaining();
1705 if (header->remaining_packet_length > remaining_bytes_length) {
1706 set_detailed_error("Long header payload length longer than packet.");
1707 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1708 }
1709
1710 MaybeProcessCoalescedPacket(*encrypted_reader, remaining_bytes_length,
1711 *header);
1712
1713 if (!encrypted_reader->TruncateRemaining(header->remaining_packet_length)) {
1714 set_detailed_error("Length TruncateRemaining failed.");
1715 QUIC_BUG << "Length TruncateRemaining failed.";
1716 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1717 }
1718 return true;
1719}
1720
1721bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
1722 QuicPacketHeader* header,
1723 const QuicEncryptedPacket& packet,
1724 char* decrypted_buffer,
1725 size_t buffer_length) {
1726 DCHECK_NE(GOOGLE_QUIC_PACKET, header->form);
1727 DCHECK(!header->has_possible_stateless_reset_token);
1728 header->retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
1729 header->retry_token = QuicStringPiece();
1730 header->length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
1731 header->remaining_packet_length = 0;
1732 if (header->form == IETF_QUIC_SHORT_HEADER_PACKET &&
1733 perspective_ == Perspective::IS_CLIENT) {
1734 // Peek possible stateless reset token. Will only be used on decryption
1735 // failure.
1736 QuicStringPiece remaining = encrypted_reader->PeekRemainingPayload();
1737 if (remaining.length() >= sizeof(header->possible_stateless_reset_token)) {
1738 header->has_possible_stateless_reset_token = true;
1739 memcpy(&header->possible_stateless_reset_token,
1740 &remaining.data()[remaining.length() -
1741 sizeof(header->possible_stateless_reset_token)],
1742 sizeof(header->possible_stateless_reset_token));
1743 }
1744 }
1745
1746 if (!MaybeProcessIetfInitialRetryToken(encrypted_reader, header)) {
1747 return false;
1748 }
1749
1750 if (!MaybeProcessIetfLength(encrypted_reader, header)) {
1751 return false;
1752 }
1753
nharper55fa6132019-05-07 19:37:21 -07001754 QuicStringPiece associated_data;
1755 std::vector<char> ad_storage;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001756 if (header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1757 header->long_packet_type != VERSION_NEGOTIATION) {
dschinazi072da7c2019-05-07 17:57:42 -07001758 DCHECK(header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1759 header->long_packet_type == INITIAL ||
1760 header->long_packet_type == HANDSHAKE ||
1761 header->long_packet_type == ZERO_RTT_PROTECTED);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001762 // Process packet number.
QUICHE team10b22a12019-03-21 15:31:42 -07001763 QuicPacketNumber base_packet_number;
1764 if (supports_multiple_packet_number_spaces_) {
nharper55fa6132019-05-07 19:37:21 -07001765 PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
1766 if (pn_space == NUM_PACKET_NUMBER_SPACES) {
1767 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1768 }
1769 base_packet_number = largest_decrypted_packet_numbers_[pn_space];
QUICHE team10b22a12019-03-21 15:31:42 -07001770 } else {
1771 base_packet_number = largest_packet_number_;
1772 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001773 uint64_t full_packet_number;
nharper55fa6132019-05-07 19:37:21 -07001774 bool hp_removal_failed = false;
1775 if (version_.HasHeaderProtection()) {
1776 if (!RemoveHeaderProtection(encrypted_reader, packet, header,
1777 &full_packet_number, &ad_storage)) {
1778 hp_removal_failed = true;
1779 }
1780 associated_data = QuicStringPiece(ad_storage.data(), ad_storage.size());
1781 } else if (!ProcessAndCalculatePacketNumber(
1782 encrypted_reader, header->packet_number_length,
1783 base_packet_number, &full_packet_number)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001784 set_detailed_error("Unable to read packet number.");
1785 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1786 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1787 }
1788
nharper55fa6132019-05-07 19:37:21 -07001789 if (hp_removal_failed ||
1790 !IsValidFullPacketNumber(full_packet_number, transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001791 if (IsIetfStatelessResetPacket(*header)) {
1792 // This is a stateless reset packet.
1793 QuicIetfStatelessResetPacket packet(
1794 *header, header->possible_stateless_reset_token);
1795 visitor_->OnAuthenticatedIetfStatelessResetPacket(packet);
1796 return true;
1797 }
nharper55fa6132019-05-07 19:37:21 -07001798 if (hp_removal_failed) {
1799 set_detailed_error("Unable to decrypt header protection.");
1800 return RaiseError(QUIC_DECRYPTION_FAILURE);
1801 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001802 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1803 set_detailed_error("packet numbers cannot be 0.");
1804 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1805 }
1806 header->packet_number = QuicPacketNumber(full_packet_number);
1807 }
1808
1809 // A nonce should only present in SHLO from the server to the client when
1810 // using QUIC crypto.
1811 if (header->form == IETF_QUIC_LONG_HEADER_PACKET &&
1812 header->long_packet_type == ZERO_RTT_PROTECTED &&
1813 perspective_ == Perspective::IS_CLIENT &&
1814 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
1815 if (!encrypted_reader->ReadBytes(
1816 reinterpret_cast<uint8_t*>(last_nonce_.data()),
1817 last_nonce_.size())) {
1818 set_detailed_error("Unable to read nonce.");
1819 RecordDroppedPacketReason(
1820 DroppedPacketReason::INVALID_DIVERSIFICATION_NONCE);
1821 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1822 }
1823
1824 header->nonce = &last_nonce_;
1825 } else {
1826 header->nonce = nullptr;
1827 }
1828
1829 if (!visitor_->OnUnauthenticatedHeader(*header)) {
1830 set_detailed_error(
1831 "Visitor asked to stop processing of unauthenticated header.");
1832 return false;
1833 }
1834
1835 QuicStringPiece encrypted = encrypted_reader->ReadRemainingPayload();
nharper55fa6132019-05-07 19:37:21 -07001836 if (!version_.HasHeaderProtection()) {
1837 associated_data = GetAssociatedDataFromEncryptedPacket(
1838 version_.transport_version, packet,
1839 GetIncludedDestinationConnectionIdLength(*header),
1840 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1841 header->nonce != nullptr, header->packet_number_length,
1842 header->retry_token_length_length, header->retry_token.length(),
1843 header->length_length);
1844 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001845
1846 size_t decrypted_length = 0;
QUICHE team10b22a12019-03-21 15:31:42 -07001847 EncryptionLevel decrypted_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001848 if (!DecryptPayload(encrypted, associated_data, *header, decrypted_buffer,
QUICHE team10b22a12019-03-21 15:31:42 -07001849 buffer_length, &decrypted_length, &decrypted_level)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001850 if (IsIetfStatelessResetPacket(*header)) {
1851 // This is a stateless reset packet.
1852 QuicIetfStatelessResetPacket packet(
1853 *header, header->possible_stateless_reset_token);
1854 visitor_->OnAuthenticatedIetfStatelessResetPacket(packet);
1855 return true;
1856 }
1857 set_detailed_error("Unable to decrypt payload.");
1858 RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1859 return RaiseError(QUIC_DECRYPTION_FAILURE);
1860 }
1861 QuicDataReader reader(decrypted_buffer, decrypted_length);
1862
1863 // Update the largest packet number after we have decrypted the packet
1864 // so we are confident is not attacker controlled.
QUICHE team10b22a12019-03-21 15:31:42 -07001865 if (supports_multiple_packet_number_spaces_) {
1866 largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1867 decrypted_level)]
1868 .UpdateMax(header->packet_number);
1869 } else {
1870 largest_packet_number_.UpdateMax(header->packet_number);
1871 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001872
1873 if (!visitor_->OnPacketHeader(*header)) {
1874 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1875 // The visitor suppresses further processing of the packet.
1876 return true;
1877 }
1878
dschinazie8d7fa72019-04-05 14:44:40 -07001879 if (packet.length() > kMaxIncomingPacketSize) {
1880 set_detailed_error("Packet too large.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001881 return RaiseError(QUIC_PACKET_TOO_LARGE);
1882 }
1883
1884 // Handle the payload.
1885 if (version_.transport_version == QUIC_VERSION_99) {
1886 if (!ProcessIetfFrameData(&reader, *header)) {
1887 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessIetfFrameData sets the error.
1888 DCHECK_NE("", detailed_error_);
1889 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1890 << detailed_error_;
1891 return false;
1892 }
1893 } else {
1894 if (!ProcessFrameData(&reader, *header)) {
1895 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
1896 DCHECK_NE("", detailed_error_);
1897 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1898 << detailed_error_;
1899 return false;
1900 }
1901 }
1902
1903 visitor_->OnPacketComplete();
1904 return true;
1905}
1906
1907bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader,
1908 QuicPacketHeader* header,
1909 const QuicEncryptedPacket& packet,
1910 char* decrypted_buffer,
1911 size_t buffer_length) {
1912 if (!ProcessUnauthenticatedHeader(encrypted_reader, header)) {
1913 DCHECK_NE("", detailed_error_);
1914 QUIC_DVLOG(1)
1915 << ENDPOINT
1916 << "Unable to process packet header. Stopping parsing. Error: "
1917 << detailed_error_;
1918 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1919 return false;
1920 }
1921
1922 QuicStringPiece encrypted = encrypted_reader->ReadRemainingPayload();
1923 QuicStringPiece associated_data = GetAssociatedDataFromEncryptedPacket(
1924 version_.transport_version, packet,
1925 GetIncludedDestinationConnectionIdLength(*header),
1926 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1927 header->nonce != nullptr, header->packet_number_length,
1928 header->retry_token_length_length, header->retry_token.length(),
1929 header->length_length);
1930
1931 size_t decrypted_length = 0;
QUICHE team10b22a12019-03-21 15:31:42 -07001932 EncryptionLevel decrypted_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001933 if (!DecryptPayload(encrypted, associated_data, *header, decrypted_buffer,
QUICHE team10b22a12019-03-21 15:31:42 -07001934 buffer_length, &decrypted_length, &decrypted_level)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001935 RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1936 set_detailed_error("Unable to decrypt payload.");
1937 return RaiseError(QUIC_DECRYPTION_FAILURE);
1938 }
1939
1940 QuicDataReader reader(decrypted_buffer, decrypted_length);
1941
1942 // Update the largest packet number after we have decrypted the packet
1943 // so we are confident is not attacker controlled.
QUICHE team10b22a12019-03-21 15:31:42 -07001944 if (supports_multiple_packet_number_spaces_) {
1945 largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1946 decrypted_level)]
1947 .UpdateMax(header->packet_number);
1948 } else {
1949 largest_packet_number_.UpdateMax(header->packet_number);
1950 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001951
1952 if (!visitor_->OnPacketHeader(*header)) {
1953 // The visitor suppresses further processing of the packet.
1954 return true;
1955 }
1956
dschinazie8d7fa72019-04-05 14:44:40 -07001957 if (packet.length() > kMaxIncomingPacketSize) {
1958 set_detailed_error("Packet too large.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001959 return RaiseError(QUIC_PACKET_TOO_LARGE);
1960 }
1961
1962 // Handle the payload.
1963 if (!ProcessFrameData(&reader, *header)) {
1964 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
1965 DCHECK_NE("", detailed_error_);
1966 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1967 << detailed_error_;
1968 return false;
1969 }
1970
1971 visitor_->OnPacketComplete();
1972 return true;
1973}
1974
1975bool QuicFramer::ProcessPublicResetPacket(QuicDataReader* reader,
1976 const QuicPacketHeader& header) {
QUICHE team2252b702019-05-14 23:55:14 -04001977 QuicPublicResetPacket packet(
1978 GetServerConnectionIdAsRecipient(header, perspective_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001979
1980 std::unique_ptr<CryptoHandshakeMessage> reset(
1981 CryptoFramer::ParseMessage(reader->ReadRemainingPayload()));
1982 if (!reset.get()) {
1983 set_detailed_error("Unable to read reset message.");
1984 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
1985 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
1986 }
1987 if (reset->tag() != kPRST) {
1988 set_detailed_error("Incorrect message tag.");
1989 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
1990 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
1991 }
1992
1993 if (reset->GetUint64(kRNON, &packet.nonce_proof) != QUIC_NO_ERROR) {
1994 set_detailed_error("Unable to read nonce proof.");
1995 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
1996 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
1997 }
1998 // TODO(satyamshekhar): validate nonce to protect against DoS.
1999
2000 QuicStringPiece address;
2001 if (reset->GetStringPiece(kCADR, &address)) {
2002 QuicSocketAddressCoder address_coder;
2003 if (address_coder.Decode(address.data(), address.length())) {
2004 packet.client_address =
2005 QuicSocketAddress(address_coder.ip(), address_coder.port());
2006 }
2007 }
2008
2009 QuicStringPiece endpoint_id;
2010 if (perspective_ == Perspective::IS_CLIENT &&
2011 reset->GetStringPiece(kEPID, &endpoint_id)) {
vasilvvc48c8712019-03-11 13:38:16 -07002012 packet.endpoint_id = std::string(endpoint_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002013 packet.endpoint_id += '\0';
2014 }
2015
2016 visitor_->OnPublicResetPacket(packet);
2017 return true;
2018}
2019
2020bool QuicFramer::IsIetfStatelessResetPacket(
2021 const QuicPacketHeader& header) const {
2022 QUIC_BUG_IF(header.has_possible_stateless_reset_token &&
2023 perspective_ != Perspective::IS_CLIENT)
2024 << "has_possible_stateless_reset_token can only be true at client side.";
2025 return header.form == IETF_QUIC_SHORT_HEADER_PACKET &&
2026 header.has_possible_stateless_reset_token &&
2027 visitor_->IsValidStatelessResetToken(
2028 header.possible_stateless_reset_token);
2029}
2030
2031bool QuicFramer::HasEncrypterOfEncryptionLevel(EncryptionLevel level) const {
2032 return encrypter_[level] != nullptr;
2033}
2034
2035bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
2036 QuicDataWriter* writer,
2037 size_t* length_field_offset) {
fayangd4291e42019-05-30 10:31:21 -07002038 if (VersionHasIetfInvariantHeader(transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002039 return AppendIetfPacketHeader(header, writer, length_field_offset);
2040 }
2041 QUIC_DVLOG(1) << ENDPOINT << "Appending header: " << header;
2042 uint8_t public_flags = 0;
2043 if (header.reset_flag) {
2044 public_flags |= PACKET_PUBLIC_FLAGS_RST;
2045 }
2046 if (header.version_flag) {
2047 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
2048 }
2049
2050 public_flags |= GetPacketNumberFlags(header.packet_number_length)
2051 << kPublicHeaderSequenceNumberShift;
2052
2053 if (header.nonce != nullptr) {
2054 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2055 public_flags |= PACKET_PUBLIC_FLAGS_NONCE;
2056 }
QUICHE team2252b702019-05-14 23:55:14 -04002057
dschinazi7b9278c2019-05-20 07:36:21 -07002058 QuicConnectionId server_connection_id =
QUICHE team2252b702019-05-14 23:55:14 -04002059 GetServerConnectionIdAsSender(header, perspective_);
dschinazi7b9278c2019-05-20 07:36:21 -07002060 QuicConnectionIdIncluded server_connection_id_included =
QUICHE team2252b702019-05-14 23:55:14 -04002061 GetServerConnectionIdIncludedAsSender(header, perspective_);
2062 DCHECK_EQ(CONNECTION_ID_ABSENT,
2063 GetClientConnectionIdIncludedAsSender(header, perspective_));
2064
dschinazi7b9278c2019-05-20 07:36:21 -07002065 switch (server_connection_id_included) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002066 case CONNECTION_ID_ABSENT:
2067 if (!writer->WriteUInt8(public_flags |
2068 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) {
2069 return false;
2070 }
2071 break;
2072 case CONNECTION_ID_PRESENT:
2073 QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(
dschinazi7b9278c2019-05-20 07:36:21 -07002074 server_connection_id, transport_version()))
QUICHE teama6ef0a62019-03-07 20:34:33 -05002075 << "AppendPacketHeader: attempted to use connection ID "
dschinazi7b9278c2019-05-20 07:36:21 -07002076 << server_connection_id << " which is invalid with version "
QUICHE teama6ef0a62019-03-07 20:34:33 -05002077 << QuicVersionToString(transport_version());
2078
2079 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID;
2080 if (perspective_ == Perspective::IS_CLIENT) {
2081 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD;
2082 }
2083 if (!writer->WriteUInt8(public_flags) ||
dschinazi7b9278c2019-05-20 07:36:21 -07002084 !writer->WriteConnectionId(server_connection_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002085 return false;
2086 }
2087 break;
2088 }
dschinazi7b9278c2019-05-20 07:36:21 -07002089 last_serialized_server_connection_id_ = server_connection_id;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002090
2091 if (header.version_flag) {
2092 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
2093 QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
nharpereaab5ad2019-05-31 12:23:25 -07002094 if (!writer->WriteUInt32(version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002095 return false;
2096 }
2097
2098 QUIC_DVLOG(1) << ENDPOINT << "label = '"
2099 << QuicVersionLabelToString(version_label) << "'";
2100 }
2101
2102 if (header.nonce != nullptr &&
2103 !writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2104 return false;
2105 }
2106
2107 if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2108 writer)) {
2109 return false;
2110 }
2111
2112 return true;
2113}
2114
2115bool QuicFramer::AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
2116 QuicDataWriter* writer) {
2117 uint8_t type = 0;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002118 if (header.version_flag) {
2119 type = static_cast<uint8_t>(
fayang374888f2019-05-31 06:47:21 -07002120 FLAGS_LONG_HEADER | FLAGS_FIXED_BIT |
2121 LongHeaderTypeToOnWireValue(header.long_packet_type) |
2122 PacketNumberLengthToOnWireValue(header.packet_number_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002123 } else {
fayang374888f2019-05-31 06:47:21 -07002124 type = static_cast<uint8_t>(
2125 FLAGS_FIXED_BIT |
2126 PacketNumberLengthToOnWireValue(header.packet_number_length));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002127 }
2128 return writer->WriteUInt8(type);
2129}
2130
2131bool QuicFramer::AppendIetfPacketHeader(const QuicPacketHeader& header,
2132 QuicDataWriter* writer,
2133 size_t* length_field_offset) {
2134 QUIC_DVLOG(1) << ENDPOINT << "Appending IETF header: " << header;
QUICHE team2252b702019-05-14 23:55:14 -04002135 QuicConnectionId server_connection_id =
2136 GetServerConnectionIdAsSender(header, perspective_);
2137 QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(server_connection_id,
2138 transport_version()))
QUICHE teama6ef0a62019-03-07 20:34:33 -05002139 << "AppendIetfPacketHeader: attempted to use connection ID "
QUICHE team2252b702019-05-14 23:55:14 -04002140 << server_connection_id << " which is invalid with version "
QUICHE teama6ef0a62019-03-07 20:34:33 -05002141 << QuicVersionToString(transport_version());
2142 if (!AppendIetfHeaderTypeByte(header, writer)) {
2143 return false;
2144 }
2145
2146 if (header.version_flag) {
2147 // Append version for long header.
2148 QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
nharpereaab5ad2019-05-31 12:23:25 -07002149 if (!writer->WriteUInt32(version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002150 return false;
2151 }
2152 }
2153
2154 // Append connection ID.
dschinazi1f485a12019-05-13 11:57:01 -07002155 if (!AppendIetfConnectionIds(
2156 header.version_flag,
2157 header.destination_connection_id_included != CONNECTION_ID_ABSENT
2158 ? header.destination_connection_id
2159 : EmptyQuicConnectionId(),
2160 header.source_connection_id_included != CONNECTION_ID_ABSENT
2161 ? header.source_connection_id
2162 : EmptyQuicConnectionId(),
2163 writer)) {
2164 return false;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002165 }
dschinazi1f485a12019-05-13 11:57:01 -07002166
dschinazi7b9278c2019-05-20 07:36:21 -07002167 last_serialized_server_connection_id_ = server_connection_id;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002168
2169 if (QuicVersionHasLongHeaderLengths(transport_version()) &&
2170 header.version_flag) {
2171 if (header.long_packet_type == INITIAL) {
2172 // Write retry token length.
2173 if (!writer->WriteVarInt62(header.retry_token.length(),
2174 header.retry_token_length_length)) {
2175 return false;
2176 }
2177 // Write retry token.
2178 if (!header.retry_token.empty() &&
2179 !writer->WriteStringPiece(header.retry_token)) {
2180 return false;
2181 }
2182 }
2183 if (length_field_offset != nullptr) {
2184 *length_field_offset = writer->length();
2185 }
2186 // Add fake length to reserve two bytes to add length in later.
2187 writer->WriteVarInt62(256);
2188 } else if (length_field_offset != nullptr) {
2189 *length_field_offset = 0;
2190 }
2191
2192 // Append packet number.
2193 if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2194 writer)) {
2195 return false;
2196 }
nharper55fa6132019-05-07 19:37:21 -07002197 last_written_packet_number_length_ = header.packet_number_length;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002198
2199 if (!header.version_flag) {
2200 return true;
2201 }
2202
2203 if (header.nonce != nullptr) {
2204 DCHECK(header.version_flag);
2205 DCHECK_EQ(ZERO_RTT_PROTECTED, header.long_packet_type);
2206 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2207 if (!writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2208 return false;
2209 }
2210 }
2211
2212 return true;
2213}
2214
2215const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
2216 uint32_t time_delta_us) {
2217 // The new time_delta might have wrapped to the next epoch, or it
2218 // might have reverse wrapped to the previous epoch, or it might
2219 // remain in the same epoch. Select the time closest to the previous
2220 // time.
2221 //
2222 // epoch_delta is the delta between epochs. A delta is 4 bytes of
2223 // microseconds.
2224 const uint64_t epoch_delta = UINT64_C(1) << 32;
2225 uint64_t epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1);
2226 // Wrapping is safe here because a wrapped value will not be ClosestTo below.
2227 uint64_t prev_epoch = epoch - epoch_delta;
2228 uint64_t next_epoch = epoch + epoch_delta;
2229
2230 uint64_t time = ClosestTo(
2231 last_timestamp_.ToMicroseconds(), epoch + time_delta_us,
2232 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us,
2233 next_epoch + time_delta_us));
2234
2235 return QuicTime::Delta::FromMicroseconds(time);
2236}
2237
2238uint64_t QuicFramer::CalculatePacketNumberFromWire(
2239 QuicPacketNumberLength packet_number_length,
2240 QuicPacketNumber base_packet_number,
2241 uint64_t packet_number) const {
2242 // The new packet number might have wrapped to the next epoch, or
2243 // it might have reverse wrapped to the previous epoch, or it might
2244 // remain in the same epoch. Select the packet number closest to the
2245 // next expected packet number, the previous packet number plus 1.
2246
2247 // epoch_delta is the delta between epochs the packet number was serialized
2248 // with, so the correct value is likely the same epoch as the last sequence
2249 // number or an adjacent epoch.
2250 if (!base_packet_number.IsInitialized()) {
2251 return packet_number;
2252 }
2253 const uint64_t epoch_delta = UINT64_C(1) << (8 * packet_number_length);
2254 uint64_t next_packet_number = base_packet_number.ToUint64() + 1;
2255 uint64_t epoch = base_packet_number.ToUint64() & ~(epoch_delta - 1);
2256 uint64_t prev_epoch = epoch - epoch_delta;
2257 uint64_t next_epoch = epoch + epoch_delta;
2258
2259 return ClosestTo(next_packet_number, epoch + packet_number,
2260 ClosestTo(next_packet_number, prev_epoch + packet_number,
2261 next_epoch + packet_number));
2262}
2263
2264bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader,
2265 bool packet_has_ietf_packet_header,
2266 QuicPacketHeader* header) {
2267 if (packet_has_ietf_packet_header) {
2268 return ProcessIetfPacketHeader(reader, header);
2269 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002270 uint8_t public_flags;
2271 if (!reader->ReadBytes(&public_flags, 1)) {
2272 set_detailed_error("Unable to read public flags.");
2273 return false;
2274 }
2275
2276 header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
2277 header->version_flag = (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
2278
2279 if (validate_flags_ && !header->version_flag &&
2280 public_flags > PACKET_PUBLIC_FLAGS_MAX) {
2281 set_detailed_error("Illegal public flags value.");
2282 return false;
2283 }
2284
2285 if (header->reset_flag && header->version_flag) {
2286 set_detailed_error("Got version flag in reset packet");
2287 return false;
2288 }
2289
QUICHE team2252b702019-05-14 23:55:14 -04002290 QuicConnectionId* header_connection_id = &header->destination_connection_id;
2291 QuicConnectionIdIncluded* header_connection_id_included =
2292 &header->destination_connection_id_included;
2293 if (perspective_ == Perspective::IS_CLIENT &&
2294 GetQuicRestartFlag(quic_do_not_override_connection_id)) {
2295 header_connection_id = &header->source_connection_id;
2296 header_connection_id_included = &header->source_connection_id_included;
2297 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002298 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) {
2299 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID:
QUICHE team2252b702019-05-14 23:55:14 -04002300 if (!reader->ReadConnectionId(header_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002301 kQuicDefaultConnectionIdLength)) {
2302 set_detailed_error("Unable to read ConnectionId.");
2303 return false;
2304 }
QUICHE team2252b702019-05-14 23:55:14 -04002305 *header_connection_id_included = CONNECTION_ID_PRESENT;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002306 break;
2307 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID:
QUICHE team2252b702019-05-14 23:55:14 -04002308 *header_connection_id_included = CONNECTION_ID_ABSENT;
dschinazi7b9278c2019-05-20 07:36:21 -07002309 *header_connection_id = last_serialized_server_connection_id_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002310 break;
2311 }
2312
2313 header->packet_number_length = ReadSequenceNumberLength(
2314 public_flags >> kPublicHeaderSequenceNumberShift);
2315
2316 // Read the version only if the packet is from the client.
2317 // version flag from the server means version negotiation packet.
2318 if (header->version_flag && perspective_ == Perspective::IS_SERVER) {
2319 QuicVersionLabel version_label;
fayang40315542019-05-09 09:19:09 -07002320 if (!ProcessVersionLabel(reader, &version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002321 set_detailed_error("Unable to read protocol version.");
2322 return false;
2323 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002324 // If the version from the new packet is the same as the version of this
2325 // framer, then the public flags should be set to something we understand.
2326 // If not, this raises an error.
2327 last_version_label_ = version_label;
2328 ParsedQuicVersion version = ParseQuicVersionLabel(version_label);
2329 if (version == version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
2330 set_detailed_error("Illegal public flags value.");
2331 return false;
2332 }
2333 header->version = version;
2334 }
2335
2336 // A nonce should only be present in packets from the server to the client,
2337 // which are neither version negotiation nor public reset packets.
2338 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE &&
2339 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) &&
2340 !(public_flags & PACKET_PUBLIC_FLAGS_RST) &&
2341 // The nonce flag from a client is ignored and is assumed to be an older
2342 // client indicating an eight-byte connection ID.
2343 perspective_ == Perspective::IS_CLIENT) {
2344 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()),
2345 last_nonce_.size())) {
2346 set_detailed_error("Unable to read nonce.");
2347 return false;
2348 }
2349 header->nonce = &last_nonce_;
2350 } else {
2351 header->nonce = nullptr;
2352 }
2353
2354 return true;
2355}
2356
2357// static
2358QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength(
2359 QuicTransportVersion version,
2360 QuicPacketNumber packet_number) {
2361 DCHECK(packet_number.IsInitialized());
2362 if (packet_number < QuicPacketNumber(1 << (PACKET_1BYTE_PACKET_NUMBER * 8))) {
2363 return PACKET_1BYTE_PACKET_NUMBER;
2364 } else if (packet_number <
2365 QuicPacketNumber(1 << (PACKET_2BYTE_PACKET_NUMBER * 8))) {
2366 return PACKET_2BYTE_PACKET_NUMBER;
2367 } else if (packet_number <
2368 QuicPacketNumber(UINT64_C(1)
2369 << (PACKET_4BYTE_PACKET_NUMBER * 8))) {
2370 return PACKET_4BYTE_PACKET_NUMBER;
2371 } else {
2372 return PACKET_6BYTE_PACKET_NUMBER;
2373 }
2374}
2375
2376// static
2377uint8_t QuicFramer::GetPacketNumberFlags(
2378 QuicPacketNumberLength packet_number_length) {
2379 switch (packet_number_length) {
2380 case PACKET_1BYTE_PACKET_NUMBER:
2381 return PACKET_FLAGS_1BYTE_PACKET;
2382 case PACKET_2BYTE_PACKET_NUMBER:
2383 return PACKET_FLAGS_2BYTE_PACKET;
2384 case PACKET_4BYTE_PACKET_NUMBER:
2385 return PACKET_FLAGS_4BYTE_PACKET;
2386 case PACKET_6BYTE_PACKET_NUMBER:
2387 case PACKET_8BYTE_PACKET_NUMBER:
2388 return PACKET_FLAGS_8BYTE_PACKET;
2389 default:
2390 QUIC_BUG << "Unreachable case statement.";
2391 return PACKET_FLAGS_8BYTE_PACKET;
2392 }
2393}
2394
2395// static
2396QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo(
2397 const QuicAckFrame& frame) {
2398 AckFrameInfo new_ack_info;
2399 if (frame.packets.Empty()) {
2400 return new_ack_info;
2401 }
2402 // The first block is the last interval. It isn't encoded with the gap-length
2403 // encoding, so skip it.
2404 new_ack_info.first_block_length = frame.packets.LastIntervalLength();
2405 auto itr = frame.packets.rbegin();
2406 QuicPacketNumber previous_start = itr->min();
2407 new_ack_info.max_block_length = PacketNumberIntervalLength(*itr);
2408 ++itr;
2409
2410 // Don't do any more work after getting information for 256 ACK blocks; any
2411 // more can't be encoded anyway.
2412 for (; itr != frame.packets.rend() &&
2413 new_ack_info.num_ack_blocks < std::numeric_limits<uint8_t>::max();
2414 previous_start = itr->min(), ++itr) {
2415 const auto& interval = *itr;
2416 const QuicPacketCount total_gap = previous_start - interval.max();
2417 new_ack_info.num_ack_blocks +=
2418 (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
2419 std::numeric_limits<uint8_t>::max();
2420 new_ack_info.max_block_length = std::max(
2421 new_ack_info.max_block_length, PacketNumberIntervalLength(interval));
2422 }
2423 return new_ack_info;
2424}
2425
2426bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
2427 QuicPacketHeader* header) {
QUICHE team10b22a12019-03-21 15:31:42 -07002428 QuicPacketNumber base_packet_number;
2429 if (supports_multiple_packet_number_spaces_) {
nharper55fa6132019-05-07 19:37:21 -07002430 PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
2431 if (pn_space == NUM_PACKET_NUMBER_SPACES) {
2432 set_detailed_error("Unable to determine packet number space.");
2433 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2434 }
2435 base_packet_number = largest_decrypted_packet_numbers_[pn_space];
QUICHE team10b22a12019-03-21 15:31:42 -07002436 } else {
2437 base_packet_number = largest_packet_number_;
2438 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002439 uint64_t full_packet_number;
2440 if (!ProcessAndCalculatePacketNumber(
2441 encrypted_reader, header->packet_number_length, base_packet_number,
2442 &full_packet_number)) {
2443 set_detailed_error("Unable to read packet number.");
2444 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2445 }
2446
2447 if (!IsValidFullPacketNumber(full_packet_number, transport_version())) {
2448 set_detailed_error("packet numbers cannot be 0.");
2449 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2450 }
2451 header->packet_number = QuicPacketNumber(full_packet_number);
2452
2453 if (!visitor_->OnUnauthenticatedHeader(*header)) {
2454 set_detailed_error(
2455 "Visitor asked to stop processing of unauthenticated header.");
2456 return false;
2457 }
nharper3f283562019-05-02 16:37:12 -07002458 // The function we are in is called because the framer believes that it is
2459 // processing a packet that uses the non-IETF (i.e. Google QUIC) packet header
2460 // type. Usually, the framer makes that decision based on the framer's
2461 // version, but when the framer is used with Perspective::IS_SERVER, then
2462 // before version negotiation is complete (specifically, before
2463 // InferPacketHeaderTypeFromVersion is called), this decision is made based on
2464 // the type byte of the packet.
2465 //
2466 // If the framer's version KnowsWhichDecrypterToUse, then that version expects
2467 // to use the IETF packet header type. If that's the case and we're in this
2468 // function, then the packet received is invalid: the framer was expecting an
2469 // IETF packet header and didn't get one.
2470 if (version().KnowsWhichDecrypterToUse()) {
nharpera745e392019-04-19 12:05:15 -07002471 set_detailed_error("Invalid public header type for expected version.");
2472 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2473 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002474 return true;
2475}
2476
2477bool QuicFramer::ProcessIetfHeaderTypeByte(QuicDataReader* reader,
2478 QuicPacketHeader* header) {
2479 uint8_t type;
2480 if (!reader->ReadBytes(&type, 1)) {
2481 set_detailed_error("Unable to read type.");
2482 return false;
2483 }
dschinazi244f6dc2019-05-06 15:45:16 -07002484 header->type_byte = type;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002485 // Determine whether this is a long or short header.
fayangccbab732019-05-13 10:11:25 -07002486 header->form = GetIetfPacketHeaderFormat(type);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002487 if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
2488 // Version is always present in long headers.
2489 header->version_flag = true;
2490 // Long header packets received by client must include 8-byte source
2491 // connection ID, and those received by server must include 8-byte
2492 // destination connection ID.
2493 header->destination_connection_id_included =
2494 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_ABSENT
2495 : CONNECTION_ID_PRESENT;
2496 header->source_connection_id_included =
2497 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_PRESENT
2498 : CONNECTION_ID_ABSENT;
2499 // Read version tag.
2500 QuicVersionLabel version_label;
fayang40315542019-05-09 09:19:09 -07002501 if (!ProcessVersionLabel(reader, &version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002502 set_detailed_error("Unable to read protocol version.");
2503 return false;
2504 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002505 if (!version_label) {
2506 // Version label is 0 indicating this is a version negotiation packet.
2507 header->long_packet_type = VERSION_NEGOTIATION;
2508 } else {
2509 header->version = ParseQuicVersionLabel(version_label);
2510 if (header->version.transport_version != QUIC_VERSION_UNSUPPORTED) {
fayang374888f2019-05-31 06:47:21 -07002511 // TODO(fayang): remove version check when deprecating
2512 // quic_no_framer_object_in_dispatcher.
2513 if (header->version.transport_version > 44 &&
QUICHE teama6ef0a62019-03-07 20:34:33 -05002514 !(type & FLAGS_FIXED_BIT)) {
2515 set_detailed_error("Fixed bit is 0 in long header.");
2516 return false;
2517 }
2518 if (!GetLongHeaderType(header->version.transport_version, type,
2519 &header->long_packet_type)) {
2520 set_detailed_error("Illegal long header type value.");
2521 return false;
2522 }
dschinazi244f6dc2019-05-06 15:45:16 -07002523 if (header->long_packet_type == RETRY) {
2524 if (!version().SupportsRetry()) {
2525 set_detailed_error("RETRY not supported in this version.");
2526 return false;
2527 }
2528 if (perspective_ == Perspective::IS_SERVER) {
2529 set_detailed_error("Client-initiated RETRY is invalid.");
2530 return false;
2531 }
nharper55fa6132019-05-07 19:37:21 -07002532 } else if (!header->version.HasHeaderProtection()) {
dschinazi244f6dc2019-05-06 15:45:16 -07002533 header->packet_number_length = GetLongHeaderPacketNumberLength(
2534 header->version.transport_version, type);
nharper2ceb97c2019-04-19 11:38:59 -07002535 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002536 }
2537 }
2538 if (header->long_packet_type != VERSION_NEGOTIATION) {
2539 // Do not save version of version negotiation packet.
2540 last_version_label_ = version_label;
2541 }
2542
2543 QUIC_DVLOG(1) << ENDPOINT << "Received IETF long header: "
2544 << QuicUtils::QuicLongHeaderTypetoString(
2545 header->long_packet_type);
2546 return true;
2547 }
2548
2549 QUIC_DVLOG(1) << ENDPOINT << "Received IETF short header";
2550 // Version is not present in short headers.
2551 header->version_flag = false;
2552 // Connection ID length depends on the perspective. Client does not expect
2553 // destination connection ID, and server expects destination connection ID.
2554 header->destination_connection_id_included =
2555 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_ABSENT
2556 : CONNECTION_ID_PRESENT;
2557 header->source_connection_id_included = CONNECTION_ID_ABSENT;
fayang374888f2019-05-31 06:47:21 -07002558 // TODO(fayang): remove version check when deprecating
2559 // quic_no_framer_object_in_dispatcher.
2560 if (infer_packet_header_type_from_version_ && transport_version() > 44 &&
2561 !(type & FLAGS_FIXED_BIT)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002562 set_detailed_error("Fixed bit is 0 in short header.");
2563 return false;
2564 }
nharper55fa6132019-05-07 19:37:21 -07002565 if (!header->version.HasHeaderProtection() &&
2566 !GetShortHeaderPacketNumberLength(transport_version(), type,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002567 infer_packet_header_type_from_version_,
2568 &header->packet_number_length)) {
2569 set_detailed_error("Illegal short header type value.");
2570 return false;
2571 }
2572 QUIC_DVLOG(1) << "packet_number_length = " << header->packet_number_length;
2573 return true;
2574}
2575
fayang40315542019-05-09 09:19:09 -07002576// static
2577bool QuicFramer::ProcessVersionLabel(QuicDataReader* reader,
2578 QuicVersionLabel* version_label) {
nharpereaab5ad2019-05-31 12:23:25 -07002579 if (!reader->ReadUInt32(version_label)) {
fayang40315542019-05-09 09:19:09 -07002580 return false;
2581 }
fayang40315542019-05-09 09:19:09 -07002582 return true;
2583}
2584
2585// static
fayangccbab732019-05-13 10:11:25 -07002586bool QuicFramer::ProcessAndValidateIetfConnectionIdLength(
2587 QuicDataReader* reader,
fayang40315542019-05-09 09:19:09 -07002588 ParsedQuicVersion version,
dschinazi334f0232019-05-29 16:08:53 -07002589 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -07002590 bool should_update_expected_server_connection_id_length,
2591 uint8_t* expected_server_connection_id_length,
fayang40315542019-05-09 09:19:09 -07002592 uint8_t* destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -07002593 uint8_t* source_connection_id_length,
2594 std::string* detailed_error) {
2595 uint8_t connection_id_lengths_byte;
2596 if (!reader->ReadBytes(&connection_id_lengths_byte, 1)) {
2597 *detailed_error = "Unable to read ConnectionId length.";
2598 return false;
2599 }
fayang40315542019-05-09 09:19:09 -07002600 uint8_t dcil =
2601 (connection_id_lengths_byte & kDestinationConnectionIdLengthMask) >> 4;
2602 if (dcil != 0) {
2603 dcil += kConnectionIdLengthAdjustment;
2604 }
fayang40315542019-05-09 09:19:09 -07002605 uint8_t scil = connection_id_lengths_byte & kSourceConnectionIdLengthMask;
2606 if (scil != 0) {
2607 scil += kConnectionIdLengthAdjustment;
2608 }
dschinazi334f0232019-05-29 16:08:53 -07002609 if (should_update_expected_server_connection_id_length) {
2610 uint8_t server_connection_id_length =
2611 perspective == Perspective::IS_SERVER ? dcil : scil;
2612 if (*expected_server_connection_id_length != server_connection_id_length) {
2613 QUIC_DVLOG(1) << "Updating expected_server_connection_id_length: "
2614 << static_cast<int>(*expected_server_connection_id_length)
2615 << " -> " << static_cast<int>(server_connection_id_length);
2616 *expected_server_connection_id_length = server_connection_id_length;
2617 }
2618 }
dschinazi8ff74822019-05-28 16:37:20 -07002619 if (!should_update_expected_server_connection_id_length &&
fayangde8a2222019-05-16 10:52:39 -07002620 (dcil != *destination_connection_id_length ||
fayang40315542019-05-09 09:19:09 -07002621 scil != *source_connection_id_length) &&
fayang40315542019-05-09 09:19:09 -07002622 !QuicUtils::VariableLengthConnectionIdAllowedForVersion(
2623 version.transport_version)) {
2624 // TODO(dschinazi): use the framer's version once the
2625 // OnProtocolVersionMismatch call is moved to before this is run.
2626 QUIC_DVLOG(1) << "dcil: " << static_cast<uint32_t>(dcil)
2627 << ", scil: " << static_cast<uint32_t>(scil);
fayangccbab732019-05-13 10:11:25 -07002628 *detailed_error = "Invalid ConnectionId length.";
fayang40315542019-05-09 09:19:09 -07002629 return false;
2630 }
2631 *destination_connection_id_length = dcil;
2632 *source_connection_id_length = scil;
2633 return true;
2634}
2635
QUICHE teama6ef0a62019-03-07 20:34:33 -05002636bool QuicFramer::ProcessIetfPacketHeader(QuicDataReader* reader,
2637 QuicPacketHeader* header) {
2638 if (!ProcessIetfHeaderTypeByte(reader, header)) {
2639 return false;
2640 }
2641
2642 uint8_t destination_connection_id_length =
2643 header->destination_connection_id_included == CONNECTION_ID_PRESENT
dschinazi8ff74822019-05-28 16:37:20 -07002644 ? expected_server_connection_id_length_
QUICHE teama6ef0a62019-03-07 20:34:33 -05002645 : 0;
2646 uint8_t source_connection_id_length =
2647 header->source_connection_id_included == CONNECTION_ID_PRESENT
dschinazi8ff74822019-05-28 16:37:20 -07002648 ? expected_server_connection_id_length_
QUICHE teama6ef0a62019-03-07 20:34:33 -05002649 : 0;
2650 if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
fayangccbab732019-05-13 10:11:25 -07002651 if (!ProcessAndValidateIetfConnectionIdLength(
dschinazi334f0232019-05-29 16:08:53 -07002652 reader, header->version, perspective_,
dschinazi8ff74822019-05-28 16:37:20 -07002653 should_update_expected_server_connection_id_length_,
2654 &expected_server_connection_id_length_,
2655 &destination_connection_id_length, &source_connection_id_length,
2656 &detailed_error_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002657 return false;
2658 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002659 }
2660
QUICHE team0131a5b2019-03-20 15:23:27 -07002661 DCHECK_LE(destination_connection_id_length, kQuicMaxConnectionIdLength);
2662 DCHECK_LE(source_connection_id_length, kQuicMaxConnectionIdLength);
2663
QUICHE teama6ef0a62019-03-07 20:34:33 -05002664 // Read connection ID.
2665 if (!reader->ReadConnectionId(&header->destination_connection_id,
2666 destination_connection_id_length)) {
2667 set_detailed_error("Unable to read Destination ConnectionId.");
2668 return false;
2669 }
2670
2671 if (!reader->ReadConnectionId(&header->source_connection_id,
2672 source_connection_id_length)) {
2673 set_detailed_error("Unable to read Source ConnectionId.");
2674 return false;
2675 }
2676
QUICHE team2252b702019-05-14 23:55:14 -04002677 if (!GetQuicRestartFlag(quic_do_not_override_connection_id)) {
2678 if (header->source_connection_id_included == CONNECTION_ID_PRESENT) {
dschinazi7d066ca2019-05-15 17:59:49 -07002679 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
2680 DCHECK_EQ(IETF_QUIC_LONG_HEADER_PACKET, header->form);
2681 if (!header->destination_connection_id.IsEmpty()) {
2682 set_detailed_error("Client connection ID not supported yet.");
2683 return false;
2684 }
QUICHE team2252b702019-05-14 23:55:14 -04002685 // Set destination connection ID to source connection ID.
QUICHE team2252b702019-05-14 23:55:14 -04002686 header->destination_connection_id = header->source_connection_id;
2687 } else if (header->destination_connection_id_included ==
2688 CONNECTION_ID_ABSENT) {
dschinazi7b9278c2019-05-20 07:36:21 -07002689 header->destination_connection_id = last_serialized_server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -04002690 }
2691 } else {
2692 QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 5, 5);
2693 if (header->source_connection_id_included == CONNECTION_ID_ABSENT) {
2694 DCHECK_EQ(EmptyQuicConnectionId(), header->source_connection_id);
dschinazi7b9278c2019-05-20 07:36:21 -07002695 header->source_connection_id = last_serialized_server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -04002696 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002697 }
2698
2699 return true;
2700}
2701
2702bool QuicFramer::ProcessAndCalculatePacketNumber(
2703 QuicDataReader* reader,
2704 QuicPacketNumberLength packet_number_length,
2705 QuicPacketNumber base_packet_number,
2706 uint64_t* packet_number) {
2707 uint64_t wire_packet_number;
2708 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) {
2709 return false;
2710 }
2711
2712 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers
2713 // in case the first guess is incorrect.
2714 *packet_number = CalculatePacketNumberFromWire(
2715 packet_number_length, base_packet_number, wire_packet_number);
2716 return true;
2717}
2718
2719bool QuicFramer::ProcessFrameData(QuicDataReader* reader,
2720 const QuicPacketHeader& header) {
2721 DCHECK_NE(QUIC_VERSION_99, version_.transport_version)
2722 << "Version 99 negotiated, but not processing frames as version 99.";
2723 if (reader->IsDoneReading()) {
2724 set_detailed_error("Packet has no frames.");
2725 return RaiseError(QUIC_MISSING_PAYLOAD);
2726 }
2727 while (!reader->IsDoneReading()) {
2728 uint8_t frame_type;
2729 if (!reader->ReadBytes(&frame_type, 1)) {
2730 set_detailed_error("Unable to read frame type.");
2731 return RaiseError(QUIC_INVALID_FRAME_DATA);
2732 }
fayang374888f2019-05-31 06:47:21 -07002733 const uint8_t special_mask = transport_version() <= QUIC_VERSION_43
QUICHE teama6ef0a62019-03-07 20:34:33 -05002734 ? kQuicFrameTypeBrokenMask
2735 : kQuicFrameTypeSpecialMask;
2736 if (frame_type & special_mask) {
2737 // Stream Frame
2738 if (frame_type & kQuicFrameTypeStreamMask) {
2739 QuicStreamFrame frame;
2740 if (!ProcessStreamFrame(reader, frame_type, &frame)) {
2741 return RaiseError(QUIC_INVALID_STREAM_DATA);
2742 }
2743 if (!visitor_->OnStreamFrame(frame)) {
2744 QUIC_DVLOG(1) << ENDPOINT
2745 << "Visitor asked to stop further processing.";
2746 // Returning true since there was no parsing error.
2747 return true;
2748 }
2749 continue;
2750 }
2751
2752 // Ack Frame
2753 if (frame_type & kQuicFrameTypeAckMask) {
2754 if (!ProcessAckFrame(reader, frame_type)) {
2755 return RaiseError(QUIC_INVALID_ACK_DATA);
2756 }
2757 continue;
2758 }
2759
2760 // This was a special frame type that did not match any
2761 // of the known ones. Error.
2762 set_detailed_error("Illegal frame type.");
2763 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2764 << static_cast<int>(frame_type);
2765 return RaiseError(QUIC_INVALID_FRAME_DATA);
2766 }
2767
2768 switch (frame_type) {
2769 case PADDING_FRAME: {
2770 QuicPaddingFrame frame;
2771 ProcessPaddingFrame(reader, &frame);
2772 if (!visitor_->OnPaddingFrame(frame)) {
2773 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2774 // Returning true since there was no parsing error.
2775 return true;
2776 }
2777 continue;
2778 }
2779
2780 case RST_STREAM_FRAME: {
2781 QuicRstStreamFrame frame;
2782 if (!ProcessRstStreamFrame(reader, &frame)) {
2783 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2784 }
2785 if (!visitor_->OnRstStreamFrame(frame)) {
2786 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2787 // Returning true since there was no parsing error.
2788 return true;
2789 }
2790 continue;
2791 }
2792
2793 case CONNECTION_CLOSE_FRAME: {
2794 QuicConnectionCloseFrame frame;
2795 if (!ProcessConnectionCloseFrame(reader, &frame)) {
2796 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2797 }
2798
2799 if (!visitor_->OnConnectionCloseFrame(frame)) {
2800 QUIC_DVLOG(1) << ENDPOINT
2801 << "Visitor asked to stop further processing.";
2802 // Returning true since there was no parsing error.
2803 return true;
2804 }
2805 continue;
2806 }
2807
2808 case GOAWAY_FRAME: {
2809 QuicGoAwayFrame goaway_frame;
2810 if (!ProcessGoAwayFrame(reader, &goaway_frame)) {
2811 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
2812 }
2813 if (!visitor_->OnGoAwayFrame(goaway_frame)) {
2814 QUIC_DVLOG(1) << ENDPOINT
2815 << "Visitor asked to stop further processing.";
2816 // Returning true since there was no parsing error.
2817 return true;
2818 }
2819 continue;
2820 }
2821
2822 case WINDOW_UPDATE_FRAME: {
2823 QuicWindowUpdateFrame window_update_frame;
2824 if (!ProcessWindowUpdateFrame(reader, &window_update_frame)) {
2825 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
2826 }
2827 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
2828 QUIC_DVLOG(1) << ENDPOINT
2829 << "Visitor asked to stop further processing.";
2830 // Returning true since there was no parsing error.
2831 return true;
2832 }
2833 continue;
2834 }
2835
2836 case BLOCKED_FRAME: {
2837 QuicBlockedFrame blocked_frame;
2838 if (!ProcessBlockedFrame(reader, &blocked_frame)) {
2839 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
2840 }
2841 if (!visitor_->OnBlockedFrame(blocked_frame)) {
2842 QUIC_DVLOG(1) << ENDPOINT
2843 << "Visitor asked to stop further processing.";
2844 // Returning true since there was no parsing error.
2845 return true;
2846 }
2847 continue;
2848 }
2849
2850 case STOP_WAITING_FRAME: {
ianswett97b690b2019-05-02 15:12:43 -07002851 if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
fayang374888f2019-05-31 06:47:21 -07002852 version_.transport_version > QUIC_VERSION_43) {
ianswett97b690b2019-05-02 15:12:43 -07002853 QUIC_RELOADABLE_FLAG_COUNT(quic_do_not_accept_stop_waiting);
2854 set_detailed_error("STOP WAITING not supported in version 44+.");
2855 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
2856 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002857 QuicStopWaitingFrame stop_waiting_frame;
2858 if (!ProcessStopWaitingFrame(reader, header, &stop_waiting_frame)) {
2859 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
2860 }
2861 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) {
2862 QUIC_DVLOG(1) << ENDPOINT
2863 << "Visitor asked to stop further processing.";
2864 // Returning true since there was no parsing error.
2865 return true;
2866 }
2867 continue;
2868 }
2869 case PING_FRAME: {
2870 // Ping has no payload.
2871 QuicPingFrame ping_frame;
2872 if (!visitor_->OnPingFrame(ping_frame)) {
2873 QUIC_DVLOG(1) << ENDPOINT
2874 << "Visitor asked to stop further processing.";
2875 // Returning true since there was no parsing error.
2876 return true;
2877 }
2878 continue;
2879 }
2880 case IETF_EXTENSION_MESSAGE_NO_LENGTH:
2881 QUIC_FALLTHROUGH_INTENDED;
2882 case IETF_EXTENSION_MESSAGE: {
2883 QuicMessageFrame message_frame;
2884 if (!ProcessMessageFrame(reader,
2885 frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
2886 &message_frame)) {
2887 return RaiseError(QUIC_INVALID_MESSAGE_DATA);
2888 }
2889 if (!visitor_->OnMessageFrame(message_frame)) {
2890 QUIC_DVLOG(1) << ENDPOINT
2891 << "Visitor asked to stop further processing.";
2892 // Returning true since there was no parsing error.
2893 return true;
2894 }
2895 break;
2896 }
2897 case CRYPTO_FRAME: {
QUICHE teamea740082019-03-11 17:58:43 -07002898 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002899 set_detailed_error("Illegal frame type.");
2900 return RaiseError(QUIC_INVALID_FRAME_DATA);
2901 }
2902 QuicCryptoFrame frame;
2903 if (!ProcessCryptoFrame(reader, &frame)) {
2904 return RaiseError(QUIC_INVALID_FRAME_DATA);
2905 }
2906 if (!visitor_->OnCryptoFrame(frame)) {
2907 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2908 // Returning true since there was no parsing error.
2909 return true;
2910 }
2911 break;
2912 }
2913
2914 default:
2915 set_detailed_error("Illegal frame type.");
2916 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2917 << static_cast<int>(frame_type);
2918 return RaiseError(QUIC_INVALID_FRAME_DATA);
2919 }
2920 }
2921
2922 return true;
2923}
2924
2925bool QuicFramer::ProcessIetfFrameData(QuicDataReader* reader,
2926 const QuicPacketHeader& header) {
2927 DCHECK_EQ(QUIC_VERSION_99, version_.transport_version)
2928 << "Attempt to process frames as IETF frames but version is "
2929 << version_.transport_version << ", not 99.";
2930 if (reader->IsDoneReading()) {
2931 set_detailed_error("Packet has no frames.");
2932 return RaiseError(QUIC_MISSING_PAYLOAD);
2933 }
2934 while (!reader->IsDoneReading()) {
2935 uint64_t frame_type;
2936 // Will be the number of bytes into which frame_type was encoded.
2937 size_t encoded_bytes = reader->BytesRemaining();
2938 if (!reader->ReadVarInt62(&frame_type)) {
2939 set_detailed_error("Unable to read frame type.");
2940 return RaiseError(QUIC_INVALID_FRAME_DATA);
2941 }
2942
2943 // Is now the number of bytes into which the frame type was encoded.
2944 encoded_bytes -= reader->BytesRemaining();
2945
2946 // Check that the frame type is minimally encoded.
2947 if (encoded_bytes !=
2948 static_cast<size_t>(QuicDataWriter::GetVarInt62Len(frame_type))) {
2949 // The frame type was not minimally encoded.
2950 set_detailed_error("Frame type not minimally encoded.");
2951 return RaiseError(IETF_QUIC_PROTOCOL_VIOLATION);
2952 }
2953
2954 if (IS_IETF_STREAM_FRAME(frame_type)) {
2955 QuicStreamFrame frame;
2956 if (!ProcessIetfStreamFrame(reader, frame_type, &frame)) {
2957 return RaiseError(QUIC_INVALID_STREAM_DATA);
2958 }
2959 if (!visitor_->OnStreamFrame(frame)) {
2960 QUIC_DVLOG(1) << ENDPOINT
2961 << "Visitor asked to stop further processing.";
2962 // Returning true since there was no parsing error.
2963 return true;
2964 }
2965 } else {
2966 switch (frame_type) {
2967 case IETF_PADDING: {
2968 QuicPaddingFrame frame;
2969 ProcessPaddingFrame(reader, &frame);
2970 if (!visitor_->OnPaddingFrame(frame)) {
2971 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2972 // Returning true since there was no parsing error.
2973 return true;
2974 }
2975 break;
2976 }
2977 case IETF_RST_STREAM: {
2978 QuicRstStreamFrame frame;
2979 if (!ProcessIetfResetStreamFrame(reader, &frame)) {
2980 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2981 }
2982 if (!visitor_->OnRstStreamFrame(frame)) {
2983 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2984 // Returning true since there was no parsing error.
2985 return true;
2986 }
2987 break;
2988 }
fkastenholz04bd4f32019-04-16 12:24:38 -07002989 case IETF_APPLICATION_CLOSE:
QUICHE teama6ef0a62019-03-07 20:34:33 -05002990 case IETF_CONNECTION_CLOSE: {
2991 QuicConnectionCloseFrame frame;
fkastenholze9d71a82019-04-09 05:12:13 -07002992 if (!ProcessIetfConnectionCloseFrame(
fkastenholz04bd4f32019-04-16 12:24:38 -07002993 reader,
2994 (frame_type == IETF_CONNECTION_CLOSE)
2995 ? IETF_QUIC_TRANSPORT_CONNECTION_CLOSE
2996 : IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
2997 &frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002998 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2999 }
3000 if (!visitor_->OnConnectionCloseFrame(frame)) {
3001 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3002 // Returning true since there was no parsing error.
3003 return true;
3004 }
3005 break;
3006 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05003007 case IETF_MAX_DATA: {
3008 QuicWindowUpdateFrame frame;
3009 if (!ProcessMaxDataFrame(reader, &frame)) {
3010 return RaiseError(QUIC_INVALID_MAX_DATA_FRAME_DATA);
3011 }
3012 // TODO(fkastenholz): Or should we create a new visitor function,
3013 // OnMaxDataFrame()?
3014 if (!visitor_->OnWindowUpdateFrame(frame)) {
3015 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3016 // Returning true since there was no parsing error.
3017 return true;
3018 }
3019 break;
3020 }
3021 case IETF_MAX_STREAM_DATA: {
3022 QuicWindowUpdateFrame frame;
3023 if (!ProcessMaxStreamDataFrame(reader, &frame)) {
3024 return RaiseError(QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
3025 }
3026 // TODO(fkastenholz): Or should we create a new visitor function,
3027 // OnMaxStreamDataFrame()?
3028 if (!visitor_->OnWindowUpdateFrame(frame)) {
3029 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3030 // Returning true since there was no parsing error.
3031 return true;
3032 }
3033 break;
3034 }
3035 case IETF_MAX_STREAMS_BIDIRECTIONAL:
3036 case IETF_MAX_STREAMS_UNIDIRECTIONAL: {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003037 QuicMaxStreamsFrame frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003038 if (!ProcessMaxStreamsFrame(reader, &frame, frame_type)) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003039 return RaiseError(QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003040 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07003041 QUIC_CODE_COUNT_N(quic_max_streams_received, 1, 2);
3042 if (!visitor_->OnMaxStreamsFrame(frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003043 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3044 // Returning true since there was no parsing error.
3045 return true;
3046 }
3047 break;
3048 }
3049 case IETF_PING: {
3050 // Ping has no payload.
3051 QuicPingFrame ping_frame;
3052 if (!visitor_->OnPingFrame(ping_frame)) {
3053 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3054 // Returning true since there was no parsing error.
3055 return true;
3056 }
3057 break;
3058 }
3059 case IETF_BLOCKED: {
3060 QuicBlockedFrame frame;
3061 if (!ProcessIetfBlockedFrame(reader, &frame)) {
3062 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
3063 }
3064 if (!visitor_->OnBlockedFrame(frame)) {
3065 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3066 // Returning true since there was no parsing error.
3067 return true;
3068 }
3069 break;
3070 }
3071 case IETF_STREAM_BLOCKED: {
3072 QuicBlockedFrame frame;
3073 if (!ProcessStreamBlockedFrame(reader, &frame)) {
3074 return RaiseError(QUIC_INVALID_STREAM_BLOCKED_DATA);
3075 }
3076 if (!visitor_->OnBlockedFrame(frame)) {
3077 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3078 // Returning true since there was no parsing error.
3079 return true;
3080 }
3081 break;
3082 }
3083 case IETF_STREAMS_BLOCKED_UNIDIRECTIONAL:
3084 case IETF_STREAMS_BLOCKED_BIDIRECTIONAL: {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003085 QuicStreamsBlockedFrame frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003086 if (!ProcessStreamsBlockedFrame(reader, &frame, frame_type)) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003087 return RaiseError(QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003088 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07003089 QUIC_CODE_COUNT_N(quic_streams_blocked_received, 1, 2);
3090 if (!visitor_->OnStreamsBlockedFrame(frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003091 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3092 // Returning true since there was no parsing error.
3093 return true;
3094 }
3095 break;
3096 }
3097 case IETF_NEW_CONNECTION_ID: {
3098 QuicNewConnectionIdFrame frame;
3099 if (!ProcessNewConnectionIdFrame(reader, &frame)) {
3100 return RaiseError(QUIC_INVALID_NEW_CONNECTION_ID_DATA);
3101 }
3102 if (!visitor_->OnNewConnectionIdFrame(frame)) {
3103 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3104 // Returning true since there was no parsing error.
3105 return true;
3106 }
3107 break;
3108 }
3109 case IETF_RETIRE_CONNECTION_ID: {
3110 QuicRetireConnectionIdFrame frame;
3111 if (!ProcessRetireConnectionIdFrame(reader, &frame)) {
3112 return RaiseError(QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
3113 }
3114 if (!visitor_->OnRetireConnectionIdFrame(frame)) {
3115 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3116 // Returning true since there was no parsing error.
3117 return true;
3118 }
3119 break;
3120 }
3121 case IETF_NEW_TOKEN: {
3122 QuicNewTokenFrame frame;
3123 if (!ProcessNewTokenFrame(reader, &frame)) {
3124 return RaiseError(QUIC_INVALID_NEW_TOKEN);
3125 }
3126 if (!visitor_->OnNewTokenFrame(frame)) {
3127 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3128 // Returning true since there was no parsing error.
3129 return true;
3130 }
3131 break;
3132 }
3133 case IETF_STOP_SENDING: {
3134 QuicStopSendingFrame frame;
3135 if (!ProcessStopSendingFrame(reader, &frame)) {
3136 return RaiseError(QUIC_INVALID_STOP_SENDING_FRAME_DATA);
3137 }
3138 if (!visitor_->OnStopSendingFrame(frame)) {
3139 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3140 // Returning true since there was no parsing error.
3141 return true;
3142 }
3143 break;
3144 }
3145 case IETF_ACK_ECN:
3146 case IETF_ACK: {
3147 QuicAckFrame frame;
3148 if (!ProcessIetfAckFrame(reader, frame_type, &frame)) {
3149 return RaiseError(QUIC_INVALID_ACK_DATA);
3150 }
3151 break;
3152 }
3153 case IETF_PATH_CHALLENGE: {
3154 QuicPathChallengeFrame frame;
3155 if (!ProcessPathChallengeFrame(reader, &frame)) {
3156 return RaiseError(QUIC_INVALID_PATH_CHALLENGE_DATA);
3157 }
3158 if (!visitor_->OnPathChallengeFrame(frame)) {
3159 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3160 // Returning true since there was no parsing error.
3161 return true;
3162 }
3163 break;
3164 }
3165 case IETF_PATH_RESPONSE: {
3166 QuicPathResponseFrame frame;
3167 if (!ProcessPathResponseFrame(reader, &frame)) {
3168 return RaiseError(QUIC_INVALID_PATH_RESPONSE_DATA);
3169 }
3170 if (!visitor_->OnPathResponseFrame(frame)) {
3171 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3172 // Returning true since there was no parsing error.
3173 return true;
3174 }
3175 break;
3176 }
3177 case IETF_EXTENSION_MESSAGE_NO_LENGTH:
3178 QUIC_FALLTHROUGH_INTENDED;
3179 case IETF_EXTENSION_MESSAGE: {
3180 QuicMessageFrame message_frame;
3181 if (!ProcessMessageFrame(
3182 reader, frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
3183 &message_frame)) {
3184 return RaiseError(QUIC_INVALID_MESSAGE_DATA);
3185 }
3186 if (!visitor_->OnMessageFrame(message_frame)) {
3187 QUIC_DVLOG(1) << ENDPOINT
3188 << "Visitor asked to stop further processing.";
3189 // Returning true since there was no parsing error.
3190 return true;
3191 }
3192 break;
3193 }
3194 case IETF_CRYPTO: {
3195 QuicCryptoFrame frame;
3196 if (!ProcessCryptoFrame(reader, &frame)) {
3197 return RaiseError(QUIC_INVALID_FRAME_DATA);
3198 }
3199 if (!visitor_->OnCryptoFrame(frame)) {
3200 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3201 // Returning true since there was no parsing error.
3202 return true;
3203 }
3204 break;
3205 }
3206
3207 default:
3208 set_detailed_error("Illegal frame type.");
3209 QUIC_DLOG(WARNING)
3210 << ENDPOINT
3211 << "Illegal frame type: " << static_cast<int>(frame_type);
3212 return RaiseError(QUIC_INVALID_FRAME_DATA);
3213 }
3214 }
3215 }
3216 return true;
3217}
3218
3219namespace {
3220// Create a mask that sets the last |num_bits| to 1 and the rest to 0.
3221inline uint8_t GetMaskFromNumBits(uint8_t num_bits) {
3222 return (1u << num_bits) - 1;
3223}
3224
3225// Extract |num_bits| from |flags| offset by |offset|.
3226uint8_t ExtractBits(uint8_t flags, uint8_t num_bits, uint8_t offset) {
3227 return (flags >> offset) & GetMaskFromNumBits(num_bits);
3228}
3229
3230// Extract the bit at position |offset| from |flags| as a bool.
3231bool ExtractBit(uint8_t flags, uint8_t offset) {
3232 return ((flags >> offset) & GetMaskFromNumBits(1)) != 0;
3233}
3234
3235// Set |num_bits|, offset by |offset| to |val| in |flags|.
3236void SetBits(uint8_t* flags, uint8_t val, uint8_t num_bits, uint8_t offset) {
3237 DCHECK_LE(val, GetMaskFromNumBits(num_bits));
3238 *flags |= val << offset;
3239}
3240
3241// Set the bit at position |offset| to |val| in |flags|.
3242void SetBit(uint8_t* flags, bool val, uint8_t offset) {
3243 SetBits(flags, val ? 1 : 0, 1, offset);
3244}
3245} // namespace
3246
3247bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader,
3248 uint8_t frame_type,
3249 QuicStreamFrame* frame) {
3250 uint8_t stream_flags = frame_type;
3251
3252 uint8_t stream_id_length = 0;
3253 uint8_t offset_length = 4;
3254 bool has_data_length = true;
3255 stream_flags &= ~kQuicFrameTypeStreamMask;
3256
3257 // Read from right to left: StreamID, Offset, Data Length, Fin.
3258 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1;
3259 stream_flags >>= kQuicStreamIdShift;
3260
3261 offset_length = (stream_flags & kQuicStreamOffsetMask);
3262 // There is no encoding for 1 byte, only 0 and 2 through 8.
3263 if (offset_length > 0) {
3264 offset_length += 1;
3265 }
3266 stream_flags >>= kQuicStreamShift;
3267
3268 has_data_length =
3269 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask;
3270 stream_flags >>= kQuicStreamDataLengthShift;
3271
3272 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
3273
3274 uint64_t stream_id;
3275 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) {
3276 set_detailed_error("Unable to read stream_id.");
3277 return false;
3278 }
3279 frame->stream_id = static_cast<QuicStreamId>(stream_id);
3280
3281 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) {
3282 set_detailed_error("Unable to read offset.");
3283 return false;
3284 }
3285
3286 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3287 QuicStringPiece data;
3288 if (has_data_length) {
3289 if (!reader->ReadStringPiece16(&data)) {
3290 set_detailed_error("Unable to read frame data.");
3291 return false;
3292 }
3293 } else {
3294 if (!reader->ReadStringPiece(&data, reader->BytesRemaining())) {
3295 set_detailed_error("Unable to read frame data.");
3296 return false;
3297 }
3298 }
3299 frame->data_buffer = data.data();
3300 frame->data_length = static_cast<uint16_t>(data.length());
3301
3302 return true;
3303}
3304
3305bool QuicFramer::ProcessIetfStreamFrame(QuicDataReader* reader,
3306 uint8_t frame_type,
3307 QuicStreamFrame* frame) {
3308 // Read stream id from the frame. It's always present.
fkastenholz3c4eabf2019-04-22 07:49:59 -07003309 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003310 set_detailed_error("Unable to read stream_id.");
3311 return false;
3312 }
3313
3314 // If we have a data offset, read it. If not, set to 0.
3315 if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
3316 if (!reader->ReadVarInt62(&frame->offset)) {
3317 set_detailed_error("Unable to read stream data offset.");
3318 return false;
3319 }
3320 } else {
3321 // no offset in the frame, ensure it's 0 in the Frame.
3322 frame->offset = 0;
3323 }
3324
3325 // If we have a data length, read it. If not, set to 0.
3326 if (frame_type & IETF_STREAM_FRAME_LEN_BIT) {
3327 QuicIetfStreamDataLength length;
3328 if (!reader->ReadVarInt62(&length)) {
3329 set_detailed_error("Unable to read stream data length.");
3330 return false;
3331 }
3332 if (length > 0xffff) {
3333 set_detailed_error("Stream data length is too large.");
3334 return false;
3335 }
3336 frame->data_length = length;
3337 } else {
3338 // no length in the frame, it is the number of bytes remaining in the
3339 // packet.
3340 frame->data_length = reader->BytesRemaining();
3341 }
3342
3343 if (frame_type & IETF_STREAM_FRAME_FIN_BIT) {
3344 frame->fin = true;
3345 } else {
3346 frame->fin = false;
3347 }
3348
3349 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3350 QuicStringPiece data;
3351 if (!reader->ReadStringPiece(&data, frame->data_length)) {
3352 set_detailed_error("Unable to read frame data.");
3353 return false;
3354 }
3355 frame->data_buffer = data.data();
3356 frame->data_length = static_cast<QuicIetfStreamDataLength>(data.length());
3357
3358 return true;
3359}
3360
3361bool QuicFramer::ProcessCryptoFrame(QuicDataReader* reader,
3362 QuicCryptoFrame* frame) {
3363 if (!reader->ReadVarInt62(&frame->offset)) {
3364 set_detailed_error("Unable to read crypto data offset.");
3365 return false;
3366 }
3367 uint64_t len;
3368 if (!reader->ReadVarInt62(&len) ||
3369 len > std::numeric_limits<QuicPacketLength>::max()) {
3370 set_detailed_error("Invalid data length.");
3371 return false;
3372 }
3373 frame->data_length = len;
3374
3375 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3376 QuicStringPiece data;
3377 if (!reader->ReadStringPiece(&data, frame->data_length)) {
3378 set_detailed_error("Unable to read frame data.");
3379 return false;
3380 }
3381 frame->data_buffer = data.data();
3382 return true;
3383}
3384
3385bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type) {
3386 const bool has_ack_blocks =
3387 ExtractBit(frame_type, kQuicHasMultipleAckBlocksOffset);
3388 uint8_t num_ack_blocks = 0;
3389 uint8_t num_received_packets = 0;
3390
3391 // Determine the two lengths from the frame type: largest acked length,
3392 // ack block length.
3393 const QuicPacketNumberLength ack_block_length = ReadAckPacketNumberLength(
3394 version_.transport_version,
3395 ExtractBits(frame_type, kQuicSequenceNumberLengthNumBits,
3396 kActBlockLengthOffset));
3397 const QuicPacketNumberLength largest_acked_length = ReadAckPacketNumberLength(
3398 version_.transport_version,
3399 ExtractBits(frame_type, kQuicSequenceNumberLengthNumBits,
3400 kLargestAckedOffset));
3401
3402 uint64_t largest_acked;
3403 if (!reader->ReadBytesToUInt64(largest_acked_length, &largest_acked)) {
3404 set_detailed_error("Unable to read largest acked.");
3405 return false;
3406 }
3407
3408 if (largest_acked < first_sending_packet_number_.ToUint64()) {
3409 // Connection always sends packet starting from kFirstSendingPacketNumber >
3410 // 0, peer has observed an unsent packet.
3411 set_detailed_error("Largest acked is 0.");
3412 return false;
3413 }
3414
3415 uint64_t ack_delay_time_us;
3416 if (!reader->ReadUFloat16(&ack_delay_time_us)) {
3417 set_detailed_error("Unable to read ack delay time.");
3418 return false;
3419 }
3420
3421 if (!visitor_->OnAckFrameStart(
3422 QuicPacketNumber(largest_acked),
3423 ack_delay_time_us == kUFloat16MaxValue
3424 ? QuicTime::Delta::Infinite()
3425 : QuicTime::Delta::FromMicroseconds(ack_delay_time_us))) {
3426 // The visitor suppresses further processing of the packet. Although this is
3427 // not a parsing error, returns false as this is in middle of processing an
3428 // ack frame,
3429 set_detailed_error("Visitor suppresses further processing of ack frame.");
3430 return false;
3431 }
3432
3433 if (has_ack_blocks && !reader->ReadUInt8(&num_ack_blocks)) {
3434 set_detailed_error("Unable to read num of ack blocks.");
3435 return false;
3436 }
3437
3438 uint64_t first_block_length;
3439 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) {
3440 set_detailed_error("Unable to read first ack block length.");
3441 return false;
3442 }
3443
3444 if (first_block_length == 0) {
3445 set_detailed_error("First block length is zero.");
3446 return false;
3447 }
3448 bool first_ack_block_underflow = first_block_length > largest_acked + 1;
3449 if (first_block_length + first_sending_packet_number_.ToUint64() >
3450 largest_acked + 1) {
3451 first_ack_block_underflow = true;
3452 }
3453 if (first_ack_block_underflow) {
3454 set_detailed_error(QuicStrCat("Underflow with first ack block length ",
3455 first_block_length, " largest acked is ",
3456 largest_acked, ".")
3457 .c_str());
3458 return false;
3459 }
3460
3461 uint64_t first_received = largest_acked + 1 - first_block_length;
3462 if (!visitor_->OnAckRange(QuicPacketNumber(first_received),
3463 QuicPacketNumber(largest_acked + 1))) {
3464 // The visitor suppresses further processing of the packet. Although
3465 // this is not a parsing error, returns false as this is in middle
3466 // of processing an ack frame,
3467 set_detailed_error("Visitor suppresses further processing of ack frame.");
3468 return false;
3469 }
3470
3471 if (num_ack_blocks > 0) {
3472 for (size_t i = 0; i < num_ack_blocks; ++i) {
3473 uint8_t gap = 0;
3474 if (!reader->ReadUInt8(&gap)) {
3475 set_detailed_error("Unable to read gap to next ack block.");
3476 return false;
3477 }
3478 uint64_t current_block_length;
3479 if (!reader->ReadBytesToUInt64(ack_block_length, &current_block_length)) {
3480 set_detailed_error("Unable to ack block length.");
3481 return false;
3482 }
3483 bool ack_block_underflow = first_received < gap + current_block_length;
3484 if (first_received < gap + current_block_length +
3485 first_sending_packet_number_.ToUint64()) {
3486 ack_block_underflow = true;
3487 }
3488 if (ack_block_underflow) {
3489 set_detailed_error(
3490 QuicStrCat("Underflow with ack block length ", current_block_length,
3491 ", end of block is ", first_received - gap, ".")
3492 .c_str());
3493 return false;
3494 }
3495
3496 first_received -= (gap + current_block_length);
3497 if (current_block_length > 0) {
3498 if (!visitor_->OnAckRange(
3499 QuicPacketNumber(first_received),
3500 QuicPacketNumber(first_received) + current_block_length)) {
3501 // The visitor suppresses further processing of the packet. Although
3502 // this is not a parsing error, returns false as this is in middle
3503 // of processing an ack frame,
3504 set_detailed_error(
3505 "Visitor suppresses further processing of ack frame.");
3506 return false;
3507 }
3508 }
3509 }
3510 }
3511
3512 if (!reader->ReadUInt8(&num_received_packets)) {
3513 set_detailed_error("Unable to read num received packets.");
3514 return false;
3515 }
3516
3517 if (!ProcessTimestampsInAckFrame(num_received_packets,
3518 QuicPacketNumber(largest_acked), reader)) {
3519 return false;
3520 }
3521
3522 // Done processing the ACK frame.
3523 return visitor_->OnAckFrameEnd(QuicPacketNumber(first_received));
3524}
3525
3526bool QuicFramer::ProcessTimestampsInAckFrame(uint8_t num_received_packets,
3527 QuicPacketNumber largest_acked,
3528 QuicDataReader* reader) {
3529 if (num_received_packets == 0) {
3530 return true;
3531 }
3532 uint8_t delta_from_largest_observed;
3533 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3534 set_detailed_error("Unable to read sequence delta in received packets.");
3535 return false;
3536 }
3537
3538 if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3539 set_detailed_error(QuicStrCat("delta_from_largest_observed too high: ",
3540 delta_from_largest_observed,
3541 ", largest_acked: ", largest_acked.ToUint64())
3542 .c_str());
3543 return false;
3544 }
3545
3546 // Time delta from the framer creation.
3547 uint32_t time_delta_us;
3548 if (!reader->ReadUInt32(&time_delta_us)) {
3549 set_detailed_error("Unable to read time delta in received packets.");
3550 return false;
3551 }
3552
3553 QuicPacketNumber seq_num = largest_acked - delta_from_largest_observed;
3554 if (process_timestamps_) {
3555 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
3556
3557 visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3558 }
3559
3560 for (uint8_t i = 1; i < num_received_packets; ++i) {
3561 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3562 set_detailed_error("Unable to read sequence delta in received packets.");
3563 return false;
3564 }
3565 if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3566 set_detailed_error(
3567 QuicStrCat("delta_from_largest_observed too high: ",
3568 delta_from_largest_observed,
3569 ", largest_acked: ", largest_acked.ToUint64())
3570 .c_str());
3571 return false;
3572 }
3573 seq_num = largest_acked - delta_from_largest_observed;
3574
3575 // Time delta from the previous timestamp.
3576 uint64_t incremental_time_delta_us;
3577 if (!reader->ReadUFloat16(&incremental_time_delta_us)) {
3578 set_detailed_error(
3579 "Unable to read incremental time delta in received packets.");
3580 return false;
3581 }
3582
3583 if (process_timestamps_) {
3584 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds(
3585 incremental_time_delta_us);
3586 visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3587 }
3588 }
3589 return true;
3590}
3591
3592bool QuicFramer::ProcessIetfAckFrame(QuicDataReader* reader,
3593 uint64_t frame_type,
3594 QuicAckFrame* ack_frame) {
3595 uint64_t largest_acked;
3596 if (!reader->ReadVarInt62(&largest_acked)) {
3597 set_detailed_error("Unable to read largest acked.");
3598 return false;
3599 }
3600 if (largest_acked < first_sending_packet_number_.ToUint64()) {
3601 // Connection always sends packet starting from kFirstSendingPacketNumber >
3602 // 0, peer has observed an unsent packet.
3603 set_detailed_error("Largest acked is 0.");
3604 return false;
3605 }
3606 ack_frame->largest_acked = static_cast<QuicPacketNumber>(largest_acked);
3607 uint64_t ack_delay_time_in_us;
3608 if (!reader->ReadVarInt62(&ack_delay_time_in_us)) {
3609 set_detailed_error("Unable to read ack delay time.");
3610 return false;
3611 }
3612
3613 // TODO(fkastenholz) when we get real IETF QUIC, need to get
3614 // the currect shift from the transport parameters.
3615 if (ack_delay_time_in_us == kVarInt62MaxValue) {
3616 ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
3617 } else {
3618 ack_delay_time_in_us = (ack_delay_time_in_us << kIetfAckTimestampShift);
3619 ack_frame->ack_delay_time =
3620 QuicTime::Delta::FromMicroseconds(ack_delay_time_in_us);
3621 }
3622 if (frame_type == IETF_ACK_ECN) {
3623 ack_frame->ecn_counters_populated = true;
3624 if (!reader->ReadVarInt62(&ack_frame->ect_0_count)) {
3625 set_detailed_error("Unable to read ack ect_0_count.");
3626 return false;
3627 }
3628 if (!reader->ReadVarInt62(&ack_frame->ect_1_count)) {
3629 set_detailed_error("Unable to read ack ect_1_count.");
3630 return false;
3631 }
3632 if (!reader->ReadVarInt62(&ack_frame->ecn_ce_count)) {
3633 set_detailed_error("Unable to read ack ecn_ce_count.");
3634 return false;
3635 }
3636 } else {
3637 ack_frame->ecn_counters_populated = false;
3638 ack_frame->ect_0_count = 0;
3639 ack_frame->ect_1_count = 0;
3640 ack_frame->ecn_ce_count = 0;
3641 }
3642 if (!visitor_->OnAckFrameStart(QuicPacketNumber(largest_acked),
3643 ack_frame->ack_delay_time)) {
3644 // The visitor suppresses further processing of the packet. Although this is
3645 // not a parsing error, returns false as this is in middle of processing an
3646 // ACK frame.
3647 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3648 return false;
3649 }
3650
3651 // Get number of ACK blocks from the packet.
3652 uint64_t ack_block_count;
3653 if (!reader->ReadVarInt62(&ack_block_count)) {
3654 set_detailed_error("Unable to read ack block count.");
3655 return false;
3656 }
3657 // There always is a first ACK block, which is the (number of packets being
3658 // acked)-1, up to and including the packet at largest_acked. Therefore if the
3659 // value is 0, then only largest is acked. If it is 1, then largest-1,
3660 // largest] are acked, etc
3661 uint64_t ack_block_value;
3662 if (!reader->ReadVarInt62(&ack_block_value)) {
3663 set_detailed_error("Unable to read first ack block length.");
3664 return false;
3665 }
3666 // Calculate the packets being acked in the first block.
3667 // +1 because AddRange implementation requires [low,high)
3668 uint64_t block_high = largest_acked + 1;
3669 uint64_t block_low = largest_acked - ack_block_value;
3670
3671 // ack_block_value is the number of packets preceding the
3672 // largest_acked packet which are in the block being acked. Thus,
3673 // its maximum value is largest_acked-1. Test this, reporting an
3674 // error if the value is wrong.
3675 if (ack_block_value + first_sending_packet_number_.ToUint64() >
3676 largest_acked) {
3677 set_detailed_error(QuicStrCat("Underflow with first ack block length ",
3678 ack_block_value + 1, " largest acked is ",
3679 largest_acked, ".")
3680 .c_str());
3681 return false;
3682 }
3683
3684 if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3685 QuicPacketNumber(block_high))) {
3686 // The visitor suppresses further processing of the packet. Although
3687 // this is not a parsing error, returns false as this is in middle
3688 // of processing an ACK frame.
3689 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3690 return false;
3691 }
3692
3693 while (ack_block_count != 0) {
3694 uint64_t gap_block_value;
3695 // Get the sizes of the gap and ack blocks,
3696 if (!reader->ReadVarInt62(&gap_block_value)) {
3697 set_detailed_error("Unable to read gap block value.");
3698 return false;
3699 }
3700 // It's an error if the gap is larger than the space from packet
3701 // number 0 to the start of the block that's just been acked, PLUS
3702 // there must be space for at least 1 packet to be acked. For
3703 // example, if block_low is 10 and gap_block_value is 9, it means
3704 // the gap block is 10 packets long, leaving no room for a packet
3705 // to be acked. Thus, gap_block_value+2 can not be larger than
3706 // block_low.
3707 // The test is written this way to detect wrap-arounds.
3708 if ((gap_block_value + 2) > block_low) {
3709 set_detailed_error(
3710 QuicStrCat("Underflow with gap block length ", gap_block_value + 1,
3711 " previous ack block start is ", block_low, ".")
3712 .c_str());
3713 return false;
3714 }
3715
3716 // Adjust block_high to be the top of the next ack block.
3717 // There is a gap of |gap_block_value| packets between the bottom
3718 // of ack block N and top of block N+1. Note that gap_block_value
3719 // is he size of the gap minus 1 (per the QUIC protocol), and
3720 // block_high is the packet number of the first packet of the gap
3721 // (per the implementation of OnAckRange/AddAckRange, below).
3722 block_high = block_low - 1 - gap_block_value;
3723
3724 if (!reader->ReadVarInt62(&ack_block_value)) {
3725 set_detailed_error("Unable to read ack block value.");
3726 return false;
3727 }
3728 if (ack_block_value + first_sending_packet_number_.ToUint64() >
3729 (block_high - 1)) {
3730 set_detailed_error(
3731 QuicStrCat("Underflow with ack block length ", ack_block_value + 1,
3732 " latest ack block end is ", block_high - 1, ".")
3733 .c_str());
3734 return false;
3735 }
3736 // Calculate the low end of the new nth ack block. The +1 is
3737 // because the encoded value is the blocksize-1.
3738 block_low = block_high - 1 - ack_block_value;
3739 if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3740 QuicPacketNumber(block_high))) {
3741 // The visitor suppresses further processing of the packet. Although
3742 // this is not a parsing error, returns false as this is in middle
3743 // of processing an ACK frame.
3744 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3745 return false;
3746 }
3747
3748 // Another one done.
3749 ack_block_count--;
3750 }
3751
3752 return visitor_->OnAckFrameEnd(QuicPacketNumber(block_low));
3753}
3754
3755bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
3756 const QuicPacketHeader& header,
3757 QuicStopWaitingFrame* stop_waiting) {
3758 uint64_t least_unacked_delta;
3759 if (!reader->ReadBytesToUInt64(header.packet_number_length,
3760 &least_unacked_delta)) {
3761 set_detailed_error("Unable to read least unacked delta.");
3762 return false;
3763 }
3764 if (header.packet_number.ToUint64() <= least_unacked_delta) {
3765 set_detailed_error("Invalid unacked delta.");
3766 return false;
3767 }
3768 stop_waiting->least_unacked = header.packet_number - least_unacked_delta;
3769
3770 return true;
3771}
3772
3773bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader,
3774 QuicRstStreamFrame* frame) {
3775 if (!reader->ReadUInt32(&frame->stream_id)) {
3776 set_detailed_error("Unable to read stream_id.");
3777 return false;
3778 }
3779
3780 if (!reader->ReadUInt64(&frame->byte_offset)) {
3781 set_detailed_error("Unable to read rst stream sent byte offset.");
3782 return false;
3783 }
3784
3785 uint32_t error_code;
3786 if (!reader->ReadUInt32(&error_code)) {
3787 set_detailed_error("Unable to read rst stream error code.");
3788 return false;
3789 }
3790
3791 if (error_code >= QUIC_STREAM_LAST_ERROR) {
3792 // Ignore invalid stream error code if any.
3793 error_code = QUIC_STREAM_LAST_ERROR;
3794 }
3795
3796 frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
3797
3798 return true;
3799}
3800
3801bool QuicFramer::ProcessConnectionCloseFrame(QuicDataReader* reader,
3802 QuicConnectionCloseFrame* frame) {
3803 uint32_t error_code;
fkastenholze9d71a82019-04-09 05:12:13 -07003804 frame->close_type = GOOGLE_QUIC_CONNECTION_CLOSE;
3805
QUICHE teama6ef0a62019-03-07 20:34:33 -05003806 if (!reader->ReadUInt32(&error_code)) {
3807 set_detailed_error("Unable to read connection close error code.");
3808 return false;
3809 }
3810
3811 if (error_code >= QUIC_LAST_ERROR) {
3812 // Ignore invalid QUIC error code if any.
3813 error_code = QUIC_LAST_ERROR;
3814 }
3815
fkastenholze9d71a82019-04-09 05:12:13 -07003816 frame->quic_error_code = static_cast<QuicErrorCode>(error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003817
3818 QuicStringPiece error_details;
3819 if (!reader->ReadStringPiece16(&error_details)) {
3820 set_detailed_error("Unable to read connection close error details.");
3821 return false;
3822 }
vasilvvc48c8712019-03-11 13:38:16 -07003823 frame->error_details = std::string(error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003824
3825 return true;
3826}
3827
3828bool QuicFramer::ProcessGoAwayFrame(QuicDataReader* reader,
3829 QuicGoAwayFrame* frame) {
3830 uint32_t error_code;
3831 if (!reader->ReadUInt32(&error_code)) {
3832 set_detailed_error("Unable to read go away error code.");
3833 return false;
3834 }
3835
3836 if (error_code >= QUIC_LAST_ERROR) {
3837 // Ignore invalid QUIC error code if any.
3838 error_code = QUIC_LAST_ERROR;
3839 }
3840 frame->error_code = static_cast<QuicErrorCode>(error_code);
3841
3842 uint32_t stream_id;
3843 if (!reader->ReadUInt32(&stream_id)) {
3844 set_detailed_error("Unable to read last good stream id.");
3845 return false;
3846 }
3847 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
3848
3849 QuicStringPiece reason_phrase;
3850 if (!reader->ReadStringPiece16(&reason_phrase)) {
3851 set_detailed_error("Unable to read goaway reason.");
3852 return false;
3853 }
vasilvvc48c8712019-03-11 13:38:16 -07003854 frame->reason_phrase = std::string(reason_phrase);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003855
3856 return true;
3857}
3858
3859bool QuicFramer::ProcessWindowUpdateFrame(QuicDataReader* reader,
3860 QuicWindowUpdateFrame* frame) {
3861 if (!reader->ReadUInt32(&frame->stream_id)) {
3862 set_detailed_error("Unable to read stream_id.");
3863 return false;
3864 }
3865
3866 if (!reader->ReadUInt64(&frame->byte_offset)) {
3867 set_detailed_error("Unable to read window byte_offset.");
3868 return false;
3869 }
3870
3871 return true;
3872}
3873
3874bool QuicFramer::ProcessBlockedFrame(QuicDataReader* reader,
3875 QuicBlockedFrame* frame) {
3876 DCHECK_NE(QUIC_VERSION_99, version_.transport_version)
3877 << "Attempt to process non-IETF frames but version is 99";
3878
3879 if (!reader->ReadUInt32(&frame->stream_id)) {
3880 set_detailed_error("Unable to read stream_id.");
3881 return false;
3882 }
3883
3884 return true;
3885}
3886
3887void QuicFramer::ProcessPaddingFrame(QuicDataReader* reader,
3888 QuicPaddingFrame* frame) {
3889 // Type byte has been read.
3890 frame->num_padding_bytes = 1;
3891 uint8_t next_byte;
3892 while (!reader->IsDoneReading() && reader->PeekByte() == 0x00) {
3893 reader->ReadBytes(&next_byte, 1);
3894 DCHECK_EQ(0x00, next_byte);
3895 ++frame->num_padding_bytes;
3896 }
3897}
3898
3899bool QuicFramer::ProcessMessageFrame(QuicDataReader* reader,
3900 bool no_message_length,
3901 QuicMessageFrame* frame) {
3902 if (no_message_length) {
3903 QuicStringPiece remaining(reader->ReadRemainingPayload());
3904 frame->data = remaining.data();
3905 frame->message_length = remaining.length();
3906 return true;
3907 }
3908
3909 uint64_t message_length;
3910 if (!reader->ReadVarInt62(&message_length)) {
3911 set_detailed_error("Unable to read message length");
3912 return false;
3913 }
3914
3915 QuicStringPiece message_piece;
3916 if (!reader->ReadStringPiece(&message_piece, message_length)) {
3917 set_detailed_error("Unable to read message data");
3918 return false;
3919 }
3920
3921 frame->data = message_piece.data();
3922 frame->message_length = message_length;
3923
3924 return true;
3925}
3926
3927// static
3928QuicStringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
3929 QuicTransportVersion version,
3930 const QuicEncryptedPacket& encrypted,
3931 QuicConnectionIdLength destination_connection_id_length,
3932 QuicConnectionIdLength source_connection_id_length,
3933 bool includes_version,
3934 bool includes_diversification_nonce,
3935 QuicPacketNumberLength packet_number_length,
3936 QuicVariableLengthIntegerLength retry_token_length_length,
3937 uint64_t retry_token_length,
3938 QuicVariableLengthIntegerLength length_length) {
3939 // TODO(ianswett): This is identical to QuicData::AssociatedData.
3940 return QuicStringPiece(
3941 encrypted.data(),
3942 GetStartOfEncryptedData(version, destination_connection_id_length,
3943 source_connection_id_length, includes_version,
3944 includes_diversification_nonce,
3945 packet_number_length, retry_token_length_length,
3946 retry_token_length, length_length));
3947}
3948
3949void QuicFramer::SetDecrypter(EncryptionLevel level,
3950 std::unique_ptr<QuicDecrypter> decrypter) {
QUICHE team76086e42019-03-25 15:12:29 -07003951 DCHECK_EQ(alternative_decrypter_level_, NUM_ENCRYPTION_LEVELS);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003952 DCHECK_GE(level, decrypter_level_);
zhongyi546cc452019-04-12 15:27:49 -07003953 DCHECK(!version_.KnowsWhichDecrypterToUse());
QUICHE team76086e42019-03-25 15:12:29 -07003954 decrypter_[decrypter_level_] = nullptr;
3955 decrypter_[level] = std::move(decrypter);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003956 decrypter_level_ = level;
3957}
3958
3959void QuicFramer::SetAlternativeDecrypter(
3960 EncryptionLevel level,
3961 std::unique_ptr<QuicDecrypter> decrypter,
3962 bool latch_once_used) {
QUICHE team76086e42019-03-25 15:12:29 -07003963 DCHECK_NE(level, decrypter_level_);
zhongyi546cc452019-04-12 15:27:49 -07003964 DCHECK(!version_.KnowsWhichDecrypterToUse());
QUICHE team76086e42019-03-25 15:12:29 -07003965 if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
3966 decrypter_[alternative_decrypter_level_] = nullptr;
3967 }
3968 decrypter_[level] = std::move(decrypter);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003969 alternative_decrypter_level_ = level;
3970 alternative_decrypter_latch_ = latch_once_used;
3971}
3972
zhongyi546cc452019-04-12 15:27:49 -07003973void QuicFramer::InstallDecrypter(EncryptionLevel level,
3974 std::unique_ptr<QuicDecrypter> decrypter) {
3975 DCHECK(version_.KnowsWhichDecrypterToUse());
3976 decrypter_[level] = std::move(decrypter);
3977}
3978
3979void QuicFramer::RemoveDecrypter(EncryptionLevel level) {
3980 DCHECK(version_.KnowsWhichDecrypterToUse());
3981 decrypter_[level] = nullptr;
3982}
3983
3984const QuicDecrypter* QuicFramer::GetDecrypter(EncryptionLevel level) const {
3985 DCHECK(version_.KnowsWhichDecrypterToUse());
3986 return decrypter_[level].get();
3987}
3988
QUICHE teama6ef0a62019-03-07 20:34:33 -05003989const QuicDecrypter* QuicFramer::decrypter() const {
QUICHE team76086e42019-03-25 15:12:29 -07003990 return decrypter_[decrypter_level_].get();
QUICHE teama6ef0a62019-03-07 20:34:33 -05003991}
3992
3993const QuicDecrypter* QuicFramer::alternative_decrypter() const {
QUICHE team76086e42019-03-25 15:12:29 -07003994 if (alternative_decrypter_level_ == NUM_ENCRYPTION_LEVELS) {
3995 return nullptr;
3996 }
3997 return decrypter_[alternative_decrypter_level_].get();
QUICHE teama6ef0a62019-03-07 20:34:33 -05003998}
3999
4000void QuicFramer::SetEncrypter(EncryptionLevel level,
4001 std::unique_ptr<QuicEncrypter> encrypter) {
4002 DCHECK_GE(level, 0);
4003 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
4004 encrypter_[level] = std::move(encrypter);
4005}
4006
4007size_t QuicFramer::EncryptInPlace(EncryptionLevel level,
4008 QuicPacketNumber packet_number,
4009 size_t ad_len,
4010 size_t total_len,
4011 size_t buffer_len,
4012 char* buffer) {
4013 DCHECK(packet_number.IsInitialized());
dschinazi2c5386e2019-04-16 16:37:37 -07004014 if (encrypter_[level] == nullptr) {
4015 QUIC_BUG << ENDPOINT
4016 << "Attempted to encrypt in place without encrypter at level "
4017 << QuicUtils::EncryptionLevelToString(level);
4018 RaiseError(QUIC_ENCRYPTION_FAILURE);
4019 return 0;
4020 }
4021
QUICHE teama6ef0a62019-03-07 20:34:33 -05004022 size_t output_length = 0;
4023 if (!encrypter_[level]->EncryptPacket(
4024 packet_number.ToUint64(),
4025 QuicStringPiece(buffer, ad_len), // Associated data
4026 QuicStringPiece(buffer + ad_len, total_len - ad_len), // Plaintext
4027 buffer + ad_len, // Destination buffer
4028 &output_length, buffer_len - ad_len)) {
4029 RaiseError(QUIC_ENCRYPTION_FAILURE);
4030 return 0;
4031 }
nharper55fa6132019-05-07 19:37:21 -07004032 if (version_.HasHeaderProtection() &&
4033 !ApplyHeaderProtection(level, buffer, ad_len + output_length, ad_len)) {
4034 QUIC_DLOG(ERROR) << "Applying header protection failed.";
4035 RaiseError(QUIC_ENCRYPTION_FAILURE);
4036 return 0;
4037 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004038
4039 return ad_len + output_length;
4040}
4041
nharper55fa6132019-05-07 19:37:21 -07004042namespace {
4043
4044const size_t kHPSampleLen = 16;
4045
4046constexpr bool IsLongHeader(uint8_t type_byte) {
4047 return (type_byte & FLAGS_LONG_HEADER) != 0;
4048}
4049
4050} // namespace
4051
4052bool QuicFramer::ApplyHeaderProtection(EncryptionLevel level,
4053 char* buffer,
4054 size_t buffer_len,
4055 size_t ad_len) {
4056 QuicDataReader buffer_reader(buffer, buffer_len);
4057 QuicDataWriter buffer_writer(buffer_len, buffer);
4058 // The sample starts 4 bytes after the start of the packet number.
4059 if (ad_len < last_written_packet_number_length_) {
4060 return false;
4061 }
4062 size_t pn_offset = ad_len - last_written_packet_number_length_;
4063 // Sample the ciphertext and generate the mask to use for header protection.
4064 size_t sample_offset = pn_offset + 4;
4065 QuicDataReader sample_reader(buffer, buffer_len);
4066 QuicStringPiece sample;
4067 if (!sample_reader.Seek(sample_offset) ||
4068 !sample_reader.ReadStringPiece(&sample, kHPSampleLen)) {
4069 QUIC_BUG << "Not enough bytes to sample: sample_offset " << sample_offset
4070 << ", sample len: " << kHPSampleLen
4071 << ", buffer len: " << buffer_len;
4072 return false;
4073 }
4074
4075 std::string mask = encrypter_[level]->GenerateHeaderProtectionMask(sample);
4076 if (mask.empty()) {
4077 QUIC_BUG << "Unable to generate header protection mask.";
4078 return false;
4079 }
4080 QuicDataReader mask_reader(mask.data(), mask.size());
4081
4082 // Apply the mask to the 4 or 5 least significant bits of the first byte.
4083 uint8_t bitmask = 0x1f;
4084 uint8_t type_byte;
4085 if (!buffer_reader.ReadUInt8(&type_byte)) {
4086 return false;
4087 }
4088 QuicLongHeaderType header_type;
4089 if (IsLongHeader(type_byte)) {
4090 bitmask = 0x0f;
4091 if (!GetLongHeaderType(version_.transport_version, type_byte,
4092 &header_type)) {
4093 return false;
4094 }
4095 }
4096 uint8_t mask_byte;
4097 if (!mask_reader.ReadUInt8(&mask_byte) ||
4098 !buffer_writer.WriteUInt8(type_byte ^ (mask_byte & bitmask))) {
4099 return false;
4100 }
4101
4102 // Adjust |pn_offset| to account for the diversification nonce.
4103 if (IsLongHeader(type_byte) && header_type == ZERO_RTT_PROTECTED &&
4104 perspective_ == Perspective::IS_SERVER &&
4105 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
4106 if (pn_offset <= kDiversificationNonceSize) {
4107 QUIC_BUG << "Expected diversification nonce, but not enough bytes";
4108 return false;
4109 }
4110 pn_offset -= kDiversificationNonceSize;
4111 }
4112 // Advance the reader and writer to the packet number. Both the reader and
4113 // writer have each read/written one byte.
4114 if (!buffer_writer.Seek(pn_offset - 1) ||
4115 !buffer_reader.Seek(pn_offset - 1)) {
4116 return false;
4117 }
4118 // Apply the rest of the mask to the packet number.
4119 for (size_t i = 0; i < last_written_packet_number_length_; ++i) {
4120 uint8_t buffer_byte;
4121 uint8_t mask_byte;
4122 if (!mask_reader.ReadUInt8(&mask_byte) ||
4123 !buffer_reader.ReadUInt8(&buffer_byte) ||
4124 !buffer_writer.WriteUInt8(buffer_byte ^ mask_byte)) {
4125 return false;
4126 }
4127 }
4128 return true;
4129}
4130
4131bool QuicFramer::RemoveHeaderProtection(QuicDataReader* reader,
4132 const QuicEncryptedPacket& packet,
4133 QuicPacketHeader* header,
4134 uint64_t* full_packet_number,
4135 std::vector<char>* associated_data) {
4136 EncryptionLevel expected_decryption_level = GetEncryptionLevel(*header);
4137 QuicDecrypter* decrypter = decrypter_[expected_decryption_level].get();
4138 if (decrypter == nullptr) {
4139 QUIC_DVLOG(1)
4140 << "No decrypter available for removing header protection at level "
4141 << expected_decryption_level;
4142 return false;
4143 }
4144
4145 bool has_diversification_nonce =
4146 header->form == IETF_QUIC_LONG_HEADER_PACKET &&
4147 header->long_packet_type == ZERO_RTT_PROTECTED &&
4148 perspective_ == Perspective::IS_CLIENT &&
4149 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO;
4150
4151 // Read a sample from the ciphertext and compute the mask to use for header
4152 // protection.
4153 QuicStringPiece remaining_packet = reader->PeekRemainingPayload();
4154 QuicDataReader sample_reader(remaining_packet);
4155
4156 // The sample starts 4 bytes after the start of the packet number.
4157 QuicStringPiece pn;
4158 if (!sample_reader.ReadStringPiece(&pn, 4)) {
4159 QUIC_DVLOG(1) << "Not enough data to sample";
4160 return false;
4161 }
4162 if (has_diversification_nonce) {
4163 // In Google QUIC, the diversification nonce comes between the packet number
4164 // and the sample.
4165 if (!sample_reader.Seek(kDiversificationNonceSize)) {
4166 QUIC_DVLOG(1) << "No diversification nonce to skip over";
4167 return false;
4168 }
4169 }
4170 std::string mask = decrypter->GenerateHeaderProtectionMask(&sample_reader);
4171 QuicDataReader mask_reader(mask.data(), mask.size());
4172 if (mask.empty()) {
4173 QUIC_DVLOG(1) << "Failed to compute mask";
4174 return false;
4175 }
4176
4177 // Unmask the rest of the type byte.
4178 uint8_t bitmask = 0x1f;
4179 if (IsLongHeader(header->type_byte)) {
4180 bitmask = 0x0f;
4181 }
4182 uint8_t mask_byte;
4183 if (!mask_reader.ReadUInt8(&mask_byte)) {
4184 QUIC_DVLOG(1) << "No first byte to read from mask";
4185 return false;
4186 }
4187 header->type_byte ^= (mask_byte & bitmask);
4188
4189 // Compute the packet number length.
4190 header->packet_number_length =
4191 static_cast<QuicPacketNumberLength>((header->type_byte & 0x03) + 1);
4192
4193 char pn_buffer[IETF_MAX_PACKET_NUMBER_LENGTH] = {};
4194 QuicDataWriter pn_writer(QUIC_ARRAYSIZE(pn_buffer), pn_buffer);
4195
4196 // Read the (protected) packet number from the reader and unmask the packet
4197 // number.
4198 for (size_t i = 0; i < header->packet_number_length; ++i) {
4199 uint8_t protected_pn_byte, mask_byte;
4200 if (!mask_reader.ReadUInt8(&mask_byte) ||
4201 !reader->ReadUInt8(&protected_pn_byte) ||
4202 !pn_writer.WriteUInt8(protected_pn_byte ^ mask_byte)) {
4203 QUIC_DVLOG(1) << "Failed to unmask packet number";
4204 return false;
4205 }
4206 }
4207 QuicDataReader packet_number_reader(pn_writer.data(), pn_writer.length());
4208 QuicPacketNumber base_packet_number;
4209 if (supports_multiple_packet_number_spaces_) {
4210 PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
4211 if (pn_space == NUM_PACKET_NUMBER_SPACES) {
4212 return false;
4213 }
4214 base_packet_number = largest_decrypted_packet_numbers_[pn_space];
4215 } else {
4216 base_packet_number = largest_packet_number_;
4217 }
4218 if (!ProcessAndCalculatePacketNumber(
4219 &packet_number_reader, header->packet_number_length,
4220 base_packet_number, full_packet_number)) {
4221 return false;
4222 }
4223
4224 // Get the associated data, and apply the same unmasking operations to it.
4225 QuicStringPiece ad = GetAssociatedDataFromEncryptedPacket(
4226 version_.transport_version, packet,
4227 GetIncludedDestinationConnectionIdLength(*header),
4228 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
4229 has_diversification_nonce, header->packet_number_length,
4230 header->retry_token_length_length, header->retry_token.length(),
4231 header->length_length);
4232 *associated_data = std::vector<char>(ad.begin(), ad.end());
4233 QuicDataWriter ad_writer(associated_data->size(), associated_data->data());
4234
4235 // Apply the unmasked type byte and packet number to |associated_data|.
4236 if (!ad_writer.WriteUInt8(header->type_byte)) {
4237 return false;
4238 }
4239 // Put the packet number at the end of the AD, or if there's a diversification
4240 // nonce, before that (which is at the end of the AD).
4241 size_t seek_len = ad_writer.remaining() - header->packet_number_length;
4242 if (has_diversification_nonce) {
4243 seek_len -= kDiversificationNonceSize;
4244 }
4245 if (!ad_writer.Seek(seek_len) ||
4246 !ad_writer.WriteBytes(pn_writer.data(), pn_writer.length())) {
4247 QUIC_DVLOG(1) << "Failed to apply unmasking operations to AD";
4248 return false;
4249 }
4250
4251 return true;
4252}
4253
QUICHE teama6ef0a62019-03-07 20:34:33 -05004254size_t QuicFramer::EncryptPayload(EncryptionLevel level,
4255 QuicPacketNumber packet_number,
4256 const QuicPacket& packet,
4257 char* buffer,
4258 size_t buffer_len) {
4259 DCHECK(packet_number.IsInitialized());
dschinazi2c5386e2019-04-16 16:37:37 -07004260 if (encrypter_[level] == nullptr) {
4261 QUIC_BUG << ENDPOINT << "Attempted to encrypt without encrypter at level "
4262 << QuicUtils::EncryptionLevelToString(level);
4263 RaiseError(QUIC_ENCRYPTION_FAILURE);
4264 return 0;
4265 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004266
4267 QuicStringPiece associated_data =
4268 packet.AssociatedData(version_.transport_version);
4269 // Copy in the header, because the encrypter only populates the encrypted
4270 // plaintext content.
4271 const size_t ad_len = associated_data.length();
4272 memmove(buffer, associated_data.data(), ad_len);
4273 // Encrypt the plaintext into the buffer.
4274 size_t output_length = 0;
4275 if (!encrypter_[level]->EncryptPacket(
4276 packet_number.ToUint64(), associated_data,
4277 packet.Plaintext(version_.transport_version), buffer + ad_len,
4278 &output_length, buffer_len - ad_len)) {
4279 RaiseError(QUIC_ENCRYPTION_FAILURE);
4280 return 0;
4281 }
nharper55fa6132019-05-07 19:37:21 -07004282 if (version_.HasHeaderProtection() &&
4283 !ApplyHeaderProtection(level, buffer, ad_len + output_length, ad_len)) {
4284 QUIC_DLOG(ERROR) << "Applying header protection failed.";
4285 RaiseError(QUIC_ENCRYPTION_FAILURE);
4286 return 0;
4287 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004288
4289 return ad_len + output_length;
4290}
4291
4292size_t QuicFramer::GetCiphertextSize(EncryptionLevel level,
4293 size_t plaintext_size) const {
4294 return encrypter_[level]->GetCiphertextSize(plaintext_size);
4295}
4296
4297size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
4298 // In order to keep the code simple, we don't have the current encryption
4299 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
4300 size_t min_plaintext_size = ciphertext_size;
4301
QUICHE team6987b4a2019-03-15 16:23:04 -07004302 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; i++) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004303 if (encrypter_[i] != nullptr) {
4304 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
4305 if (size < min_plaintext_size) {
4306 min_plaintext_size = size;
4307 }
4308 }
4309 }
4310
4311 return min_plaintext_size;
4312}
4313
4314bool QuicFramer::DecryptPayload(QuicStringPiece encrypted,
4315 QuicStringPiece associated_data,
4316 const QuicPacketHeader& header,
4317 char* decrypted_buffer,
4318 size_t buffer_length,
QUICHE team10b22a12019-03-21 15:31:42 -07004319 size_t* decrypted_length,
4320 EncryptionLevel* decrypted_level) {
nharper855d2172019-05-02 16:17:46 -07004321 if (!EncryptionLevelIsValid(decrypter_level_)) {
4322 QUIC_BUG << "Attempted to decrypt with bad decrypter_level_";
4323 return false;
4324 }
zhongyi546cc452019-04-12 15:27:49 -07004325 EncryptionLevel level = decrypter_level_;
4326 QuicDecrypter* decrypter = decrypter_[level].get();
QUICHE team76086e42019-03-25 15:12:29 -07004327 QuicDecrypter* alternative_decrypter = nullptr;
zhongyi546cc452019-04-12 15:27:49 -07004328 if (version().KnowsWhichDecrypterToUse()) {
nharper855d2172019-05-02 16:17:46 -07004329 if (header.form == GOOGLE_QUIC_PACKET) {
4330 QUIC_BUG << "Attempted to decrypt GOOGLE_QUIC_PACKET with a version that "
4331 "knows which decrypter to use";
4332 return false;
4333 }
zhongyi546cc452019-04-12 15:27:49 -07004334 level = GetEncryptionLevel(header);
nharper855d2172019-05-02 16:17:46 -07004335 if (!EncryptionLevelIsValid(level)) {
4336 QUIC_BUG << "Attempted to decrypt with bad level";
4337 return false;
4338 }
zhongyi546cc452019-04-12 15:27:49 -07004339 decrypter = decrypter_[level].get();
4340 if (decrypter == nullptr) {
4341 return false;
4342 }
4343 if (level == ENCRYPTION_ZERO_RTT &&
4344 perspective_ == Perspective::IS_CLIENT && header.nonce != nullptr) {
4345 decrypter->SetDiversificationNonce(*header.nonce);
4346 }
4347 } else if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
nharper855d2172019-05-02 16:17:46 -07004348 if (!EncryptionLevelIsValid(alternative_decrypter_level_)) {
4349 QUIC_BUG << "Attempted to decrypt with bad alternative_decrypter_level_";
4350 return false;
4351 }
QUICHE team76086e42019-03-25 15:12:29 -07004352 alternative_decrypter = decrypter_[alternative_decrypter_level_].get();
4353 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004354
nharper855d2172019-05-02 16:17:46 -07004355 if (decrypter == nullptr) {
ianswettf919fb22019-05-13 06:42:11 -07004356 QUIC_BUG << "Attempting to decrypt without decrypter, encryption level:"
4357 << level << " version:" << version();
nharper855d2172019-05-02 16:17:46 -07004358 return false;
4359 }
zhongyi546cc452019-04-12 15:27:49 -07004360
4361 bool success = decrypter->DecryptPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05004362 header.packet_number.ToUint64(), associated_data, encrypted,
4363 decrypted_buffer, decrypted_length, buffer_length);
4364 if (success) {
zhongyi546cc452019-04-12 15:27:49 -07004365 visitor_->OnDecryptedPacket(level);
4366 *decrypted_level = level;
QUICHE team76086e42019-03-25 15:12:29 -07004367 } else if (alternative_decrypter != nullptr) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004368 if (header.nonce != nullptr) {
4369 DCHECK_EQ(perspective_, Perspective::IS_CLIENT);
QUICHE team76086e42019-03-25 15:12:29 -07004370 alternative_decrypter->SetDiversificationNonce(*header.nonce);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004371 }
4372 bool try_alternative_decryption = true;
4373 if (alternative_decrypter_level_ == ENCRYPTION_ZERO_RTT) {
4374 if (perspective_ == Perspective::IS_CLIENT) {
4375 if (header.nonce == nullptr) {
4376 // Can not use INITIAL decryption without a diversification nonce.
4377 try_alternative_decryption = false;
4378 }
4379 } else {
4380 DCHECK(header.nonce == nullptr);
4381 }
4382 }
4383
4384 if (try_alternative_decryption) {
QUICHE team76086e42019-03-25 15:12:29 -07004385 success = alternative_decrypter->DecryptPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05004386 header.packet_number.ToUint64(), associated_data, encrypted,
4387 decrypted_buffer, decrypted_length, buffer_length);
4388 }
4389 if (success) {
4390 visitor_->OnDecryptedPacket(alternative_decrypter_level_);
QUICHE team10b22a12019-03-21 15:31:42 -07004391 *decrypted_level = decrypter_level_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004392 if (alternative_decrypter_latch_) {
nharper855d2172019-05-02 16:17:46 -07004393 if (!EncryptionLevelIsValid(alternative_decrypter_level_)) {
4394 QUIC_BUG << "Attempted to latch alternate decrypter with bad "
4395 "alternative_decrypter_level_";
4396 return false;
4397 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004398 // Switch to the alternative decrypter and latch so that we cannot
4399 // switch back.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004400 decrypter_level_ = alternative_decrypter_level_;
QUICHE team76086e42019-03-25 15:12:29 -07004401 alternative_decrypter_level_ = NUM_ENCRYPTION_LEVELS;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004402 } else {
4403 // Switch the alternative decrypter so that we use it first next time.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004404 EncryptionLevel level = alternative_decrypter_level_;
4405 alternative_decrypter_level_ = decrypter_level_;
4406 decrypter_level_ = level;
4407 }
4408 }
4409 }
4410
4411 if (!success) {
dschinazi965ce092019-05-23 06:29:01 -07004412 QUIC_DVLOG(1) << ENDPOINT << "DecryptPacket failed for: " << header;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004413 return false;
4414 }
4415
4416 return true;
4417}
4418
4419size_t QuicFramer::GetIetfAckFrameSize(const QuicAckFrame& frame) {
4420 // Type byte, largest_acked, and delay_time are straight-forward.
4421 size_t ack_frame_size = kQuicFrameTypeSize;
4422 QuicPacketNumber largest_acked = LargestAcked(frame);
4423 ack_frame_size += QuicDataWriter::GetVarInt62Len(largest_acked.ToUint64());
4424 uint64_t ack_delay_time_us;
4425 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
4426 ack_delay_time_us = ack_delay_time_us >> kIetfAckTimestampShift;
4427 ack_frame_size += QuicDataWriter::GetVarInt62Len(ack_delay_time_us);
4428
4429 // If |ecn_counters_populated| is true and any of the ecn counters is non-0
4430 // then the ecn counters are included...
4431 if (frame.ecn_counters_populated &&
4432 (frame.ect_0_count || frame.ect_1_count || frame.ecn_ce_count)) {
4433 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ect_0_count);
4434 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ect_1_count);
4435 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ecn_ce_count);
4436 }
4437
4438 // The rest (ack_block_count, first_ack_block, and additional ack
4439 // blocks, if any) depends:
4440 uint64_t ack_block_count = frame.packets.NumIntervals();
4441 if (ack_block_count == 0) {
4442 // If the QuicAckFrame has no Intervals, then it is interpreted
4443 // as an ack of a single packet at QuicAckFrame.largest_acked.
4444 // The resulting ack will consist of only the frame's
4445 // largest_ack & first_ack_block fields. The first ack block will be 0
4446 // (indicating a single packet) and the ack block_count will be 0.
4447 // Each 0 takes 1 byte when VarInt62 encoded.
4448 ack_frame_size += 2;
4449 return ack_frame_size;
4450 }
4451
4452 auto itr = frame.packets.rbegin();
4453 QuicPacketNumber ack_block_largest = largest_acked;
4454 QuicPacketNumber ack_block_smallest;
4455 if ((itr->max() - 1) == largest_acked) {
4456 // If largest_acked + 1 is equal to the Max() of the first Interval
4457 // in the QuicAckFrame then the first Interval is the first ack block of the
4458 // frame; remaining Intervals are additional ack blocks. The QuicAckFrame's
4459 // first Interval is encoded in the frame's largest_acked/first_ack_block,
4460 // the remaining Intervals are encoded in additional ack blocks in the
4461 // frame, and the packet's ack_block_count is the number of QuicAckFrame
4462 // Intervals - 1.
4463 ack_block_smallest = itr->min();
4464 itr++;
4465 ack_block_count--;
4466 } else {
4467 // If QuicAckFrame.largest_acked is NOT equal to the Max() of
4468 // the first Interval then it is interpreted as acking a single
4469 // packet at QuicAckFrame.largest_acked, with additional
4470 // Intervals indicating additional ack blocks. The encoding is
4471 // a) The packet's largest_acked is the QuicAckFrame's largest
4472 // acked,
4473 // b) the first ack block size is 0,
4474 // c) The packet's ack_block_count is the number of QuicAckFrame
4475 // Intervals, and
4476 // d) The QuicAckFrame Intervals are encoded in additional ack
4477 // blocks in the packet.
4478 ack_block_smallest = largest_acked;
4479 }
4480 size_t ack_block_count_size = QuicDataWriter::GetVarInt62Len(ack_block_count);
4481 ack_frame_size += ack_block_count_size;
4482
4483 uint64_t first_ack_block = ack_block_largest - ack_block_smallest;
4484 size_t first_ack_block_size = QuicDataWriter::GetVarInt62Len(first_ack_block);
4485 ack_frame_size += first_ack_block_size;
4486
4487 // Account for the remaining Intervals, if any.
4488 while (ack_block_count != 0) {
4489 uint64_t gap_size = ack_block_smallest - itr->max();
4490 // Decrement per the protocol specification
4491 size_t size_of_gap_size = QuicDataWriter::GetVarInt62Len(gap_size - 1);
4492 ack_frame_size += size_of_gap_size;
4493
4494 uint64_t block_size = itr->max() - itr->min();
4495 // Decrement per the protocol specification
4496 size_t size_of_block_size = QuicDataWriter::GetVarInt62Len(block_size - 1);
4497 ack_frame_size += size_of_block_size;
4498
4499 ack_block_smallest = itr->min();
4500 itr++;
4501 ack_block_count--;
4502 }
4503
4504 return ack_frame_size;
4505}
4506
4507size_t QuicFramer::GetAckFrameSize(
4508 const QuicAckFrame& ack,
4509 QuicPacketNumberLength packet_number_length) {
4510 DCHECK(!ack.packets.Empty());
4511 size_t ack_size = 0;
4512
4513 if (version_.transport_version == QUIC_VERSION_99) {
4514 return GetIetfAckFrameSize(ack);
4515 }
4516 AckFrameInfo ack_info = GetAckFrameInfo(ack);
4517 QuicPacketNumberLength largest_acked_length =
4518 GetMinPacketNumberLength(version_.transport_version, LargestAcked(ack));
4519 QuicPacketNumberLength ack_block_length = GetMinPacketNumberLength(
4520 version_.transport_version, QuicPacketNumber(ack_info.max_block_length));
4521
4522 ack_size =
4523 GetMinAckFrameSize(version_.transport_version, largest_acked_length);
4524 // First ack block length.
4525 ack_size += ack_block_length;
4526 if (ack_info.num_ack_blocks != 0) {
4527 ack_size += kNumberOfAckBlocksSize;
4528 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) *
4529 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
4530 }
4531
4532 // Include timestamps.
4533 if (process_timestamps_) {
4534 ack_size += GetAckFrameTimeStampSize(ack);
4535 }
4536
4537 return ack_size;
4538}
4539
4540size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) {
4541 if (ack.received_packet_times.empty()) {
4542 return 0;
4543 }
4544
4545 return kQuicNumTimestampsLength + kQuicFirstTimestampLength +
4546 (kQuicTimestampLength + kQuicTimestampPacketNumberGapLength) *
4547 (ack.received_packet_times.size() - 1);
4548}
4549
4550size_t QuicFramer::ComputeFrameLength(
4551 const QuicFrame& frame,
4552 bool last_frame_in_packet,
4553 QuicPacketNumberLength packet_number_length) {
4554 switch (frame.type) {
4555 case STREAM_FRAME:
4556 return GetMinStreamFrameSize(
4557 version_.transport_version, frame.stream_frame.stream_id,
4558 frame.stream_frame.offset, last_frame_in_packet,
4559 frame.stream_frame.data_length) +
4560 frame.stream_frame.data_length;
4561 case CRYPTO_FRAME:
4562 return GetMinCryptoFrameSize(frame.crypto_frame->offset,
4563 frame.crypto_frame->data_length) +
4564 frame.crypto_frame->data_length;
4565 case ACK_FRAME: {
4566 return GetAckFrameSize(*frame.ack_frame, packet_number_length);
4567 }
4568 case STOP_WAITING_FRAME:
4569 return GetStopWaitingFrameSize(version_.transport_version,
4570 packet_number_length);
4571 case MTU_DISCOVERY_FRAME:
4572 // MTU discovery frames are serialized as ping frames.
4573 return kQuicFrameTypeSize;
4574 case MESSAGE_FRAME:
4575 return GetMessageFrameSize(version_.transport_version,
4576 last_frame_in_packet,
4577 frame.message_frame->message_length);
4578 case PADDING_FRAME:
4579 DCHECK(false);
4580 return 0;
4581 default:
4582 return GetRetransmittableControlFrameSize(version_.transport_version,
4583 frame);
4584 }
4585}
4586
4587bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
4588 bool last_frame_in_packet,
4589 QuicDataWriter* writer) {
4590 if (version_.transport_version == QUIC_VERSION_99) {
4591 return AppendIetfTypeByte(frame, last_frame_in_packet, writer);
4592 }
4593 uint8_t type_byte = 0;
4594 switch (frame.type) {
4595 case STREAM_FRAME:
4596 type_byte =
4597 GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4598 break;
4599 case ACK_FRAME:
4600 return true;
4601 case MTU_DISCOVERY_FRAME:
4602 type_byte = static_cast<uint8_t>(PING_FRAME);
4603 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004604 case NEW_CONNECTION_ID_FRAME:
4605 set_detailed_error(
4606 "Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
4607 return RaiseError(QUIC_INTERNAL_ERROR);
4608 case RETIRE_CONNECTION_ID_FRAME:
4609 set_detailed_error(
4610 "Attempt to append RETIRE_CONNECTION_ID frame and not in version "
4611 "99.");
4612 return RaiseError(QUIC_INTERNAL_ERROR);
4613 case NEW_TOKEN_FRAME:
4614 set_detailed_error(
4615 "Attempt to append NEW_TOKEN frame and not in version 99.");
4616 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07004617 case MAX_STREAMS_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05004618 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07004619 "Attempt to append MAX_STREAMS frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05004620 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07004621 case STREAMS_BLOCKED_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05004622 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07004623 "Attempt to append STREAMS_BLOCKED frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05004624 return RaiseError(QUIC_INTERNAL_ERROR);
4625 case PATH_RESPONSE_FRAME:
4626 set_detailed_error(
4627 "Attempt to append PATH_RESPONSE frame and not in version 99.");
4628 return RaiseError(QUIC_INTERNAL_ERROR);
4629 case PATH_CHALLENGE_FRAME:
4630 set_detailed_error(
4631 "Attempt to append PATH_CHALLENGE frame and not in version 99.");
4632 return RaiseError(QUIC_INTERNAL_ERROR);
4633 case STOP_SENDING_FRAME:
4634 set_detailed_error(
4635 "Attempt to append STOP_SENDING frame and not in version 99.");
4636 return RaiseError(QUIC_INTERNAL_ERROR);
4637 case MESSAGE_FRAME:
4638 return true;
4639
4640 default:
4641 type_byte = static_cast<uint8_t>(frame.type);
4642 break;
4643 }
4644
4645 return writer->WriteUInt8(type_byte);
4646}
4647
4648bool QuicFramer::AppendIetfTypeByte(const QuicFrame& frame,
4649 bool last_frame_in_packet,
4650 QuicDataWriter* writer) {
4651 uint8_t type_byte = 0;
4652 switch (frame.type) {
4653 case PADDING_FRAME:
4654 type_byte = IETF_PADDING;
4655 break;
4656 case RST_STREAM_FRAME:
4657 type_byte = IETF_RST_STREAM;
4658 break;
4659 case CONNECTION_CLOSE_FRAME:
fkastenholz72f509b2019-04-10 09:17:49 -07004660 switch (frame.connection_close_frame->close_type) {
4661 case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
4662 type_byte = IETF_APPLICATION_CLOSE;
4663 break;
4664 case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
4665 type_byte = IETF_CONNECTION_CLOSE;
4666 break;
4667 default:
4668 set_detailed_error("Invalid QuicConnectionCloseFrame type.");
4669 return RaiseError(QUIC_INTERNAL_ERROR);
4670 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004671 break;
4672 case GOAWAY_FRAME:
4673 set_detailed_error(
4674 "Attempt to create non-version-99 GOAWAY frame in version 99.");
4675 return RaiseError(QUIC_INTERNAL_ERROR);
4676 case WINDOW_UPDATE_FRAME:
4677 // Depending on whether there is a stream ID or not, will be either a
4678 // MAX_STREAM_DATA frame or a MAX_DATA frame.
4679 if (frame.window_update_frame->stream_id ==
4680 QuicUtils::GetInvalidStreamId(transport_version())) {
4681 type_byte = IETF_MAX_DATA;
4682 } else {
4683 type_byte = IETF_MAX_STREAM_DATA;
4684 }
4685 break;
4686 case BLOCKED_FRAME:
4687 if (frame.blocked_frame->stream_id ==
4688 QuicUtils::GetInvalidStreamId(transport_version())) {
4689 type_byte = IETF_BLOCKED;
4690 } else {
4691 type_byte = IETF_STREAM_BLOCKED;
4692 }
4693 break;
4694 case STOP_WAITING_FRAME:
4695 set_detailed_error(
4696 "Attempt to append type byte of STOP WAITING frame in version 99.");
4697 return RaiseError(QUIC_INTERNAL_ERROR);
4698 case PING_FRAME:
4699 type_byte = IETF_PING;
4700 break;
4701 case STREAM_FRAME:
4702 type_byte =
4703 GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4704 break;
4705 case ACK_FRAME:
4706 // Do nothing here, AppendIetfAckFrameAndTypeByte() will put the type byte
4707 // in the buffer.
4708 return true;
4709 case MTU_DISCOVERY_FRAME:
4710 // The path MTU discovery frame is encoded as a PING frame on the wire.
4711 type_byte = IETF_PING;
4712 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004713 case NEW_CONNECTION_ID_FRAME:
4714 type_byte = IETF_NEW_CONNECTION_ID;
4715 break;
4716 case RETIRE_CONNECTION_ID_FRAME:
4717 type_byte = IETF_RETIRE_CONNECTION_ID;
4718 break;
4719 case NEW_TOKEN_FRAME:
4720 type_byte = IETF_NEW_TOKEN;
4721 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004722 case MAX_STREAMS_FRAME:
4723 if (frame.max_streams_frame.unidirectional) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004724 type_byte = IETF_MAX_STREAMS_UNIDIRECTIONAL;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004725 } else {
4726 type_byte = IETF_MAX_STREAMS_BIDIRECTIONAL;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004727 }
4728 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004729 case STREAMS_BLOCKED_FRAME:
4730 if (frame.streams_blocked_frame.unidirectional) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004731 type_byte = IETF_STREAMS_BLOCKED_UNIDIRECTIONAL;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004732 } else {
4733 type_byte = IETF_STREAMS_BLOCKED_BIDIRECTIONAL;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004734 }
4735 break;
4736 case PATH_RESPONSE_FRAME:
4737 type_byte = IETF_PATH_RESPONSE;
4738 break;
4739 case PATH_CHALLENGE_FRAME:
4740 type_byte = IETF_PATH_CHALLENGE;
4741 break;
4742 case STOP_SENDING_FRAME:
4743 type_byte = IETF_STOP_SENDING;
4744 break;
4745 case MESSAGE_FRAME:
4746 return true;
4747 case CRYPTO_FRAME:
4748 type_byte = IETF_CRYPTO;
4749 break;
4750 default:
4751 QUIC_BUG << "Attempt to generate a frame type for an unsupported value: "
4752 << frame.type;
4753 return false;
4754 }
4755 return writer->WriteUInt8(type_byte);
4756}
4757
4758// static
4759bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length,
4760 QuicPacketNumber packet_number,
4761 QuicDataWriter* writer) {
4762 DCHECK(packet_number.IsInitialized());
4763 if (!IsValidPacketNumberLength(packet_number_length)) {
4764 QUIC_BUG << "Invalid packet_number_length: " << packet_number_length;
4765 return false;
4766 }
4767 return writer->WriteBytesToUInt64(packet_number_length,
4768 packet_number.ToUint64());
4769}
4770
4771// static
4772bool QuicFramer::AppendStreamId(size_t stream_id_length,
4773 QuicStreamId stream_id,
4774 QuicDataWriter* writer) {
4775 if (stream_id_length == 0 || stream_id_length > 4) {
4776 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length;
4777 return false;
4778 }
4779 return writer->WriteBytesToUInt64(stream_id_length, stream_id);
4780}
4781
4782// static
4783bool QuicFramer::AppendStreamOffset(size_t offset_length,
4784 QuicStreamOffset offset,
4785 QuicDataWriter* writer) {
4786 if (offset_length == 1 || offset_length > 8) {
4787 QUIC_BUG << "Invalid stream_offset_length: " << offset_length;
4788 return false;
4789 }
4790
4791 return writer->WriteBytesToUInt64(offset_length, offset);
4792}
4793
4794// static
4795bool QuicFramer::AppendAckBlock(uint8_t gap,
4796 QuicPacketNumberLength length_length,
4797 uint64_t length,
4798 QuicDataWriter* writer) {
4799 if (length == 0) {
4800 if (!IsValidPacketNumberLength(length_length)) {
4801 QUIC_BUG << "Invalid packet_number_length: " << length_length;
4802 return false;
4803 }
4804 return writer->WriteUInt8(gap) &&
4805 writer->WriteBytesToUInt64(length_length, length);
4806 }
4807 return writer->WriteUInt8(gap) &&
4808 AppendPacketNumber(length_length, QuicPacketNumber(length), writer);
4809}
4810
4811bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
4812 bool no_stream_frame_length,
4813 QuicDataWriter* writer) {
4814 if (version_.transport_version == QUIC_VERSION_99) {
4815 return AppendIetfStreamFrame(frame, no_stream_frame_length, writer);
4816 }
4817 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
4818 writer)) {
4819 QUIC_BUG << "Writing stream id size failed.";
4820 return false;
4821 }
4822 if (!AppendStreamOffset(
4823 GetStreamOffsetSize(version_.transport_version, frame.offset),
4824 frame.offset, writer)) {
4825 QUIC_BUG << "Writing offset size failed.";
4826 return false;
4827 }
4828 if (!no_stream_frame_length) {
4829 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) ||
4830 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) {
4831 QUIC_BUG << "Writing stream frame length failed";
4832 return false;
4833 }
4834 }
4835
4836 if (data_producer_ != nullptr) {
4837 DCHECK_EQ(nullptr, frame.data_buffer);
4838 if (frame.data_length == 0) {
4839 return true;
4840 }
4841 if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
4842 frame.data_length,
4843 writer) != WRITE_SUCCESS) {
4844 QUIC_BUG << "Writing frame data failed.";
4845 return false;
4846 }
4847 return true;
4848 }
4849
4850 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4851 QUIC_BUG << "Writing frame data failed.";
4852 return false;
4853 }
4854 return true;
4855}
4856
QUICHE teama6ef0a62019-03-07 20:34:33 -05004857bool QuicFramer::AppendNewTokenFrame(const QuicNewTokenFrame& frame,
4858 QuicDataWriter* writer) {
4859 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.token.length()))) {
4860 set_detailed_error("Writing token length failed.");
4861 return false;
4862 }
4863 if (!writer->WriteBytes(frame.token.data(), frame.token.length())) {
4864 set_detailed_error("Writing token buffer failed.");
4865 return false;
4866 }
4867 return true;
4868}
4869
4870bool QuicFramer::ProcessNewTokenFrame(QuicDataReader* reader,
4871 QuicNewTokenFrame* frame) {
4872 uint64_t length;
4873 if (!reader->ReadVarInt62(&length)) {
4874 set_detailed_error("Unable to read new token length.");
4875 return false;
4876 }
4877 if (length > kMaxNewTokenTokenLength) {
4878 set_detailed_error("Token length larger than maximum.");
4879 return false;
4880 }
4881
4882 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
4883 QuicStringPiece data;
4884 if (!reader->ReadStringPiece(&data, length)) {
4885 set_detailed_error("Unable to read new token data.");
4886 return false;
4887 }
vasilvvc48c8712019-03-11 13:38:16 -07004888 frame->token = std::string(data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004889 return true;
4890}
4891
4892// Add a new ietf-format stream frame.
4893// Bits controlling whether there is a frame-length and frame-offset
4894// are in the QuicStreamFrame.
4895bool QuicFramer::AppendIetfStreamFrame(const QuicStreamFrame& frame,
4896 bool last_frame_in_packet,
4897 QuicDataWriter* writer) {
4898 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
4899 set_detailed_error("Writing stream id failed.");
4900 return false;
4901 }
4902
4903 if (frame.offset != 0) {
4904 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
4905 set_detailed_error("Writing data offset failed.");
4906 return false;
4907 }
4908 }
4909
4910 if (!last_frame_in_packet) {
4911 if (!writer->WriteVarInt62(frame.data_length)) {
4912 set_detailed_error("Writing data length failed.");
4913 return false;
4914 }
4915 }
4916
4917 if (frame.data_length == 0) {
4918 return true;
4919 }
4920 if (data_producer_ == nullptr) {
4921 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4922 set_detailed_error("Writing frame data failed.");
4923 return false;
4924 }
4925 } else {
4926 DCHECK_EQ(nullptr, frame.data_buffer);
4927
4928 if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
4929 frame.data_length,
4930 writer) != WRITE_SUCCESS) {
4931 set_detailed_error("Writing frame data failed.");
4932 return false;
4933 }
4934 }
4935 return true;
4936}
4937
4938bool QuicFramer::AppendCryptoFrame(const QuicCryptoFrame& frame,
4939 QuicDataWriter* writer) {
4940 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
4941 set_detailed_error("Writing data offset failed.");
4942 return false;
4943 }
4944 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.data_length))) {
4945 set_detailed_error("Writing data length failed.");
4946 return false;
4947 }
4948 if (data_producer_ == nullptr) {
4949 if (frame.data_buffer == nullptr ||
4950 !writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4951 set_detailed_error("Writing frame data failed.");
4952 return false;
4953 }
4954 } else {
4955 DCHECK_EQ(nullptr, frame.data_buffer);
4956 if (!data_producer_->WriteCryptoData(frame.level, frame.offset,
4957 frame.data_length, writer)) {
4958 return false;
4959 }
4960 }
4961 return true;
4962}
4963
4964void QuicFramer::set_version(const ParsedQuicVersion version) {
4965 DCHECK(IsSupportedVersion(version)) << ParsedQuicVersionToString(version);
4966 version_ = version;
4967}
4968
4969bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
4970 QuicDataWriter* writer) {
4971 if (transport_version() == QUIC_VERSION_99) {
4972 return AppendIetfAckFrameAndTypeByte(frame, writer);
4973 }
4974
4975 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame);
4976 QuicPacketNumber largest_acked = LargestAcked(frame);
4977 QuicPacketNumberLength largest_acked_length =
4978 GetMinPacketNumberLength(version_.transport_version, largest_acked);
4979 QuicPacketNumberLength ack_block_length =
4980 GetMinPacketNumberLength(version_.transport_version,
4981 QuicPacketNumber(new_ack_info.max_block_length));
4982 // Calculate available bytes for timestamps and ack blocks.
4983 int32_t available_timestamp_and_ack_block_bytes =
4984 writer->capacity() - writer->length() - ack_block_length -
4985 GetMinAckFrameSize(version_.transport_version, largest_acked_length) -
4986 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0);
4987 DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
4988
4989 // Write out the type byte by setting the low order bits and doing shifts
4990 // to make room for the next bit flags to be set.
4991 // Whether there are multiple ack blocks.
4992 uint8_t type_byte = 0;
4993 SetBit(&type_byte, new_ack_info.num_ack_blocks != 0,
4994 kQuicHasMultipleAckBlocksOffset);
4995
4996 SetBits(&type_byte, GetPacketNumberFlags(largest_acked_length),
4997 kQuicSequenceNumberLengthNumBits, kLargestAckedOffset);
4998
4999 SetBits(&type_byte, GetPacketNumberFlags(ack_block_length),
5000 kQuicSequenceNumberLengthNumBits, kActBlockLengthOffset);
5001
5002 type_byte |= kQuicFrameTypeAckMask;
5003
5004 if (!writer->WriteUInt8(type_byte)) {
5005 return false;
5006 }
5007
5008 size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes /
5009 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
5010
5011 // Number of ack blocks.
5012 size_t num_ack_blocks =
5013 std::min(new_ack_info.num_ack_blocks, max_num_ack_blocks);
5014 if (num_ack_blocks > std::numeric_limits<uint8_t>::max()) {
5015 num_ack_blocks = std::numeric_limits<uint8_t>::max();
5016 }
5017
5018 // Largest acked.
5019 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) {
5020 return false;
5021 }
5022
5023 // Largest acked delta time.
5024 uint64_t ack_delay_time_us = kUFloat16MaxValue;
5025 if (!frame.ack_delay_time.IsInfinite()) {
5026 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
5027 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
5028 }
5029 if (!writer->WriteUFloat16(ack_delay_time_us)) {
5030 return false;
5031 }
5032
5033 if (num_ack_blocks > 0) {
5034 if (!writer->WriteBytes(&num_ack_blocks, 1)) {
5035 return false;
5036 }
5037 }
5038
5039 // First ack block length.
5040 if (!AppendPacketNumber(ack_block_length,
5041 QuicPacketNumber(new_ack_info.first_block_length),
5042 writer)) {
5043 return false;
5044 }
5045
5046 // Ack blocks.
5047 if (num_ack_blocks > 0) {
5048 size_t num_ack_blocks_written = 0;
5049 // Append, in descending order from the largest ACKed packet, a series of
5050 // ACK blocks that represents the successfully acknoweldged packets. Each
5051 // appended gap/block length represents a descending delta from the previous
5052 // block. i.e.:
5053 // |--- length ---|--- gap ---|--- length ---|--- gap ---|--- largest ---|
5054 // For gaps larger than can be represented by a single encoded gap, a 0
5055 // length gap of the maximum is used, i.e.:
5056 // |--- length ---|--- gap ---|- 0 -|--- gap ---|--- largest ---|
5057 auto itr = frame.packets.rbegin();
5058 QuicPacketNumber previous_start = itr->min();
5059 ++itr;
5060
5061 for (;
5062 itr != frame.packets.rend() && num_ack_blocks_written < num_ack_blocks;
5063 previous_start = itr->min(), ++itr) {
5064 const auto& interval = *itr;
5065 const uint64_t total_gap = previous_start - interval.max();
5066 const size_t num_encoded_gaps =
5067 (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
5068 std::numeric_limits<uint8_t>::max();
5069 DCHECK_LE(0u, num_encoded_gaps);
5070
5071 // Append empty ACK blocks because the gap is longer than a single gap.
5072 for (size_t i = 1;
5073 i < num_encoded_gaps && num_ack_blocks_written < num_ack_blocks;
5074 ++i) {
5075 if (!AppendAckBlock(std::numeric_limits<uint8_t>::max(),
5076 ack_block_length, 0, writer)) {
5077 return false;
5078 }
5079 ++num_ack_blocks_written;
5080 }
5081 if (num_ack_blocks_written >= num_ack_blocks) {
5082 if (QUIC_PREDICT_FALSE(num_ack_blocks_written != num_ack_blocks)) {
5083 QUIC_BUG << "Wrote " << num_ack_blocks_written
5084 << ", expected to write " << num_ack_blocks;
5085 }
5086 break;
5087 }
5088
5089 const uint8_t last_gap =
5090 total_gap -
5091 (num_encoded_gaps - 1) * std::numeric_limits<uint8_t>::max();
5092 // Append the final ACK block with a non-empty size.
5093 if (!AppendAckBlock(last_gap, ack_block_length,
5094 PacketNumberIntervalLength(interval), writer)) {
5095 return false;
5096 }
5097 ++num_ack_blocks_written;
5098 }
5099 DCHECK_EQ(num_ack_blocks, num_ack_blocks_written);
5100 }
5101 // Timestamps.
5102 // If we don't process timestamps or if we don't have enough available space
5103 // to append all the timestamps, don't append any of them.
5104 if (process_timestamps_ && writer->capacity() - writer->length() >=
5105 GetAckFrameTimeStampSize(frame)) {
5106 if (!AppendTimestampsToAckFrame(frame, writer)) {
5107 return false;
5108 }
5109 } else {
5110 uint8_t num_received_packets = 0;
5111 if (!writer->WriteBytes(&num_received_packets, 1)) {
5112 return false;
5113 }
5114 }
5115
5116 return true;
5117}
5118
5119bool QuicFramer::AppendTimestampsToAckFrame(const QuicAckFrame& frame,
5120 QuicDataWriter* writer) {
5121 DCHECK_GE(std::numeric_limits<uint8_t>::max(),
5122 frame.received_packet_times.size());
5123 // num_received_packets is only 1 byte.
5124 if (frame.received_packet_times.size() >
5125 std::numeric_limits<uint8_t>::max()) {
5126 return false;
5127 }
5128
5129 uint8_t num_received_packets = frame.received_packet_times.size();
5130 if (!writer->WriteBytes(&num_received_packets, 1)) {
5131 return false;
5132 }
5133 if (num_received_packets == 0) {
5134 return true;
5135 }
5136
5137 auto it = frame.received_packet_times.begin();
5138 QuicPacketNumber packet_number = it->first;
5139 uint64_t delta_from_largest_observed = LargestAcked(frame) - packet_number;
5140
5141 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed);
5142 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
5143 return false;
5144 }
5145
5146 if (!writer->WriteUInt8(delta_from_largest_observed)) {
5147 return false;
5148 }
5149
5150 // Use the lowest 4 bytes of the time delta from the creation_time_.
5151 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32;
5152 uint32_t time_delta_us =
5153 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() &
5154 (time_epoch_delta_us - 1));
5155 if (!writer->WriteUInt32(time_delta_us)) {
5156 return false;
5157 }
5158
5159 QuicTime prev_time = it->second;
5160
5161 for (++it; it != frame.received_packet_times.end(); ++it) {
5162 packet_number = it->first;
5163 delta_from_largest_observed = LargestAcked(frame) - packet_number;
5164
5165 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
5166 return false;
5167 }
5168
5169 if (!writer->WriteUInt8(delta_from_largest_observed)) {
5170 return false;
5171 }
5172
5173 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds();
5174 prev_time = it->second;
5175 if (!writer->WriteUFloat16(frame_time_delta_us)) {
5176 return false;
5177 }
5178 }
5179 return true;
5180}
5181
5182bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header,
5183 const QuicStopWaitingFrame& frame,
5184 QuicDataWriter* writer) {
fayangd4291e42019-05-30 10:31:21 -07005185 DCHECK(!VersionHasIetfInvariantHeader(version_.transport_version));
QUICHE teama6ef0a62019-03-07 20:34:33 -05005186 DCHECK(frame.least_unacked.IsInitialized() &&
5187 header.packet_number >= frame.least_unacked);
5188 const uint64_t least_unacked_delta =
5189 header.packet_number - frame.least_unacked;
5190 const uint64_t length_shift = header.packet_number_length * 8;
5191
5192 if (least_unacked_delta >> length_shift > 0) {
5193 QUIC_BUG << "packet_number_length " << header.packet_number_length
5194 << " is too small for least_unacked_delta: " << least_unacked_delta
5195 << " packet_number:" << header.packet_number
5196 << " least_unacked:" << frame.least_unacked
5197 << " version:" << version_.transport_version;
5198 return false;
5199 }
5200 if (least_unacked_delta == 0) {
5201 return writer->WriteBytesToUInt64(header.packet_number_length,
5202 least_unacked_delta);
5203 }
5204 if (!AppendPacketNumber(header.packet_number_length,
5205 QuicPacketNumber(least_unacked_delta), writer)) {
5206 QUIC_BUG << " seq failed: " << header.packet_number_length;
5207 return false;
5208 }
5209
5210 return true;
5211}
5212
5213int QuicFramer::CalculateIetfAckBlockCount(const QuicAckFrame& frame,
5214 QuicDataWriter* writer,
5215 size_t available_space) {
5216 // Number of blocks requested in the frame
5217 uint64_t ack_block_count = frame.packets.NumIntervals();
5218
5219 auto itr = frame.packets.rbegin();
5220
5221 int actual_block_count = 1;
5222 uint64_t block_length = itr->max() - itr->min();
5223 size_t encoded_size = QuicDataWriter::GetVarInt62Len(block_length);
5224 if (encoded_size > available_space) {
5225 return 0;
5226 }
5227 available_space -= encoded_size;
5228 QuicPacketNumber previous_ack_end = itr->min();
5229 ack_block_count--;
5230
5231 while (ack_block_count) {
5232 // Each block is a gap followed by another ACK. Calculate each value,
5233 // determine the encoded lengths, and check against the available space.
5234 itr++;
5235 size_t gap = previous_ack_end - itr->max() - 1;
5236 encoded_size = QuicDataWriter::GetVarInt62Len(gap);
5237
5238 // Add the ACK block.
5239 block_length = itr->max() - itr->min();
5240 encoded_size += QuicDataWriter::GetVarInt62Len(block_length);
5241
5242 if (encoded_size > available_space) {
5243 // No room for this block, so what we've
5244 // done up to now is all that can be done.
5245 return actual_block_count;
5246 }
5247 available_space -= encoded_size;
5248 actual_block_count++;
5249 previous_ack_end = itr->min();
5250 ack_block_count--;
5251 }
5252 // Ran through the whole thing! We can do all blocks.
5253 return actual_block_count;
5254}
5255
5256bool QuicFramer::AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
5257 QuicDataWriter* writer) {
5258 // Assume frame is an IETF_ACK frame. If |ecn_counters_populated| is true and
5259 // any of the ECN counters is non-0 then turn it into an IETF_ACK+ECN frame.
5260 uint8_t type = IETF_ACK;
5261 if (frame.ecn_counters_populated &&
5262 (frame.ect_0_count || frame.ect_1_count || frame.ecn_ce_count)) {
5263 type = IETF_ACK_ECN;
5264 }
5265
5266 if (!writer->WriteUInt8(type)) {
5267 set_detailed_error("No room for frame-type");
5268 return false;
5269 }
5270
5271 QuicPacketNumber largest_acked = LargestAcked(frame);
5272 if (!writer->WriteVarInt62(largest_acked.ToUint64())) {
5273 set_detailed_error("No room for largest-acked in ack frame");
5274 return false;
5275 }
5276
5277 uint64_t ack_delay_time_us = kVarInt62MaxValue;
5278 if (!frame.ack_delay_time.IsInfinite()) {
5279 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
5280 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
5281 // TODO(fkastenholz): Use the shift from TLS transport parameters.
5282 ack_delay_time_us = ack_delay_time_us >> kIetfAckTimestampShift;
5283 }
5284
5285 if (!writer->WriteVarInt62(ack_delay_time_us)) {
5286 set_detailed_error("No room for ack-delay in ack frame");
5287 return false;
5288 }
5289 if (type == IETF_ACK_ECN) {
5290 // Encode the ACK ECN fields
5291 if (!writer->WriteVarInt62(frame.ect_0_count)) {
5292 set_detailed_error("No room for ect_0_count in ack frame");
5293 return false;
5294 }
5295 if (!writer->WriteVarInt62(frame.ect_1_count)) {
5296 set_detailed_error("No room for ect_1_count in ack frame");
5297 return false;
5298 }
5299 if (!writer->WriteVarInt62(frame.ecn_ce_count)) {
5300 set_detailed_error("No room for ecn_ce_count in ack frame");
5301 return false;
5302 }
5303 }
5304
5305 uint64_t ack_block_count = frame.packets.NumIntervals();
5306 if (ack_block_count == 0) {
5307 // If the QuicAckFrame has no Intervals, then it is interpreted
5308 // as an ack of a single packet at QuicAckFrame.largest_acked.
5309 // The resulting ack will consist of only the frame's
5310 // largest_ack & first_ack_block fields. The first ack block will be 0
5311 // (indicating a single packet) and the ack block_count will be 0.
5312 if (!writer->WriteVarInt62(0)) {
5313 set_detailed_error("No room for ack block count in ack frame");
5314 return false;
5315 }
5316 // size of the first block is 1 packet
5317 if (!writer->WriteVarInt62(0)) {
5318 set_detailed_error("No room for first ack block in ack frame");
5319 return false;
5320 }
5321 return true;
5322 }
5323 // Case 2 or 3
5324 auto itr = frame.packets.rbegin();
5325
5326 QuicPacketNumber ack_block_largest(largest_acked);
5327 QuicPacketNumber ack_block_smallest;
5328 if ((itr->max() - 1) == QuicPacketNumber(largest_acked)) {
5329 // If largest_acked + 1 is equal to the Max() of the first Interval
5330 // in the QuicAckFrame then the first Interval is the first ack block of the
5331 // frame; remaining Intervals are additional ack blocks. The QuicAckFrame's
5332 // first Interval is encoded in the frame's largest_acked/first_ack_block,
5333 // the remaining Intervals are encoded in additional ack blocks in the
5334 // frame, and the packet's ack_block_count is the number of QuicAckFrame
5335 // Intervals - 1.
5336 ack_block_smallest = itr->min();
5337 itr++;
5338 ack_block_count--;
5339 } else {
5340 // If QuicAckFrame.largest_acked is NOT equal to the Max() of
5341 // the first Interval then it is interpreted as acking a single
5342 // packet at QuicAckFrame.largest_acked, with additional
5343 // Intervals indicating additional ack blocks. The encoding is
5344 // a) The packet's largest_acked is the QuicAckFrame's largest
5345 // acked,
5346 // b) the first ack block size is 0,
5347 // c) The packet's ack_block_count is the number of QuicAckFrame
5348 // Intervals, and
5349 // d) The QuicAckFrame Intervals are encoded in additional ack
5350 // blocks in the packet.
5351 ack_block_smallest = largest_acked;
5352 }
5353
5354 if (!writer->WriteVarInt62(ack_block_count)) {
5355 set_detailed_error("No room for ack block count in ack frame");
5356 return false;
5357 }
5358
5359 uint64_t first_ack_block = ack_block_largest - ack_block_smallest;
5360 if (!writer->WriteVarInt62(first_ack_block)) {
5361 set_detailed_error("No room for first ack block in ack frame");
5362 return false;
5363 }
5364
5365 // For the remaining QuicAckFrame Intervals, if any
5366 while (ack_block_count != 0) {
5367 uint64_t gap_size = ack_block_smallest - itr->max();
5368 if (!writer->WriteVarInt62(gap_size - 1)) {
5369 set_detailed_error("No room for gap block in ack frame");
5370 return false;
5371 }
5372
5373 uint64_t block_size = itr->max() - itr->min();
5374 if (!writer->WriteVarInt62(block_size - 1)) {
5375 set_detailed_error("No room for nth ack block in ack frame");
5376 return false;
5377 }
5378
5379 ack_block_smallest = itr->min();
5380 itr++;
5381 ack_block_count--;
5382 }
5383 return true;
5384}
5385
5386bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame,
5387 QuicDataWriter* writer) {
5388 if (version_.transport_version == QUIC_VERSION_99) {
5389 return AppendIetfResetStreamFrame(frame, writer);
5390 }
5391 if (!writer->WriteUInt32(frame.stream_id)) {
5392 return false;
5393 }
5394
5395 if (!writer->WriteUInt64(frame.byte_offset)) {
5396 return false;
5397 }
5398
5399 uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5400 if (!writer->WriteUInt32(error_code)) {
5401 return false;
5402 }
5403
5404 return true;
5405}
5406
5407bool QuicFramer::AppendConnectionCloseFrame(
5408 const QuicConnectionCloseFrame& frame,
5409 QuicDataWriter* writer) {
5410 if (version_.transport_version == QUIC_VERSION_99) {
5411 return AppendIetfConnectionCloseFrame(frame, writer);
5412 }
fkastenholze9d71a82019-04-09 05:12:13 -07005413 uint32_t error_code = static_cast<uint32_t>(frame.quic_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005414 if (!writer->WriteUInt32(error_code)) {
5415 return false;
5416 }
5417 if (!writer->WriteStringPiece16(TruncateErrorString(frame.error_details))) {
5418 return false;
5419 }
5420 return true;
5421}
5422
5423bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame,
5424 QuicDataWriter* writer) {
5425 uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5426 if (!writer->WriteUInt32(error_code)) {
5427 return false;
5428 }
5429 uint32_t stream_id = static_cast<uint32_t>(frame.last_good_stream_id);
5430 if (!writer->WriteUInt32(stream_id)) {
5431 return false;
5432 }
5433 if (!writer->WriteStringPiece16(TruncateErrorString(frame.reason_phrase))) {
5434 return false;
5435 }
5436 return true;
5437}
5438
5439bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
5440 QuicDataWriter* writer) {
5441 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5442 if (!writer->WriteUInt32(stream_id)) {
5443 return false;
5444 }
5445 if (!writer->WriteUInt64(frame.byte_offset)) {
5446 return false;
5447 }
5448 return true;
5449}
5450
5451bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame,
5452 QuicDataWriter* writer) {
5453 if (version_.transport_version == QUIC_VERSION_99) {
5454 if (frame.stream_id == QuicUtils::GetInvalidStreamId(transport_version())) {
5455 return AppendIetfBlockedFrame(frame, writer);
5456 }
5457 return AppendStreamBlockedFrame(frame, writer);
5458 }
5459 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5460 if (!writer->WriteUInt32(stream_id)) {
5461 return false;
5462 }
5463 return true;
5464}
5465
5466bool QuicFramer::AppendPaddingFrame(const QuicPaddingFrame& frame,
5467 QuicDataWriter* writer) {
5468 if (frame.num_padding_bytes == 0) {
5469 return false;
5470 }
5471 if (frame.num_padding_bytes < 0) {
5472 QUIC_BUG_IF(frame.num_padding_bytes != -1);
5473 writer->WritePadding();
5474 return true;
5475 }
5476 // Please note, num_padding_bytes includes type byte which has been written.
5477 return writer->WritePaddingBytes(frame.num_padding_bytes - 1);
5478}
5479
5480bool QuicFramer::AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
5481 bool last_frame_in_packet,
5482 QuicDataWriter* writer) {
5483 uint8_t type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH
5484 : IETF_EXTENSION_MESSAGE;
5485 if (!writer->WriteUInt8(type_byte)) {
5486 return false;
5487 }
5488 if (!last_frame_in_packet && !writer->WriteVarInt62(frame.message_length)) {
5489 return false;
5490 }
5491 for (const auto& slice : frame.message_data) {
5492 if (!writer->WriteBytes(slice.data(), slice.length())) {
5493 return false;
5494 }
5495 }
5496 return true;
5497}
5498
5499bool QuicFramer::RaiseError(QuicErrorCode error) {
5500 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error)
5501 << " detail: " << detailed_error_;
5502 set_error(error);
nharper55fa6132019-05-07 19:37:21 -07005503 if (visitor_) {
5504 visitor_->OnError(this);
5505 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005506 return false;
5507}
5508
5509bool QuicFramer::IsVersionNegotiation(
5510 const QuicPacketHeader& header,
5511 bool packet_has_ietf_packet_header) const {
5512 if (perspective_ == Perspective::IS_SERVER) {
dschinazi072da7c2019-05-07 17:57:42 -07005513 if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) {
5514 return false;
5515 }
5516 QUIC_RESTART_FLAG_COUNT_N(quic_server_drop_version_negotiation, 2, 2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005517 }
dschinazi072da7c2019-05-07 17:57:42 -07005518 if (!packet_has_ietf_packet_header &&
5519 perspective_ == Perspective::IS_CLIENT) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005520 return header.version_flag;
5521 }
5522 if (header.form == IETF_QUIC_SHORT_HEADER_PACKET) {
5523 return false;
5524 }
5525 return header.long_packet_type == VERSION_NEGOTIATION;
5526}
5527
QUICHE teama6ef0a62019-03-07 20:34:33 -05005528bool QuicFramer::AppendIetfConnectionCloseFrame(
5529 const QuicConnectionCloseFrame& frame,
5530 QuicDataWriter* writer) {
fkastenholz72f509b2019-04-10 09:17:49 -07005531 if (frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE &&
5532 frame.close_type != IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
5533 QUIC_BUG << "Invalid close_type for writing IETF CONNECTION CLOSE.";
5534 set_detailed_error("Invalid close_type for writing IETF CONNECTION CLOSE.");
5535 return false;
5536 }
5537
fkastenholze9d71a82019-04-09 05:12:13 -07005538 if (!writer->WriteUInt16(frame.application_error_code)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005539 set_detailed_error("Can not write connection close frame error code");
5540 return false;
5541 }
fkastenholze9d71a82019-04-09 05:12:13 -07005542
fkastenholz72f509b2019-04-10 09:17:49 -07005543 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5544 // Write the frame-type of the frame causing the error only
5545 // if it's a CONNECTION_CLOSE/Transport.
5546 if (!writer->WriteVarInt62(frame.transport_close_frame_type)) {
5547 set_detailed_error("Writing frame type failed.");
5548 return false;
5549 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005550 }
5551
fkastenholz72f509b2019-04-10 09:17:49 -07005552 // TODO(fkastenholz): For full IETF CONNECTION CLOSE support,
5553 // if this is a Transport CONNECTION_CLOSE and the extended
5554 // error is not QUIC_IETF_GQUIC_ERROR_MISSING then append the extended
5555 // "QuicErrorCode: #" string to the phrase.
QUICHE teama6ef0a62019-03-07 20:34:33 -05005556 if (!writer->WriteStringPieceVarInt62(
5557 TruncateErrorString(frame.error_details))) {
5558 set_detailed_error("Can not write connection close phrase");
5559 return false;
5560 }
5561 return true;
5562}
5563
QUICHE teama6ef0a62019-03-07 20:34:33 -05005564bool QuicFramer::ProcessIetfConnectionCloseFrame(
5565 QuicDataReader* reader,
fkastenholze9d71a82019-04-09 05:12:13 -07005566 QuicConnectionCloseType type,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005567 QuicConnectionCloseFrame* frame) {
fkastenholze9d71a82019-04-09 05:12:13 -07005568 frame->close_type = type;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005569 uint16_t code;
5570 if (!reader->ReadUInt16(&code)) {
5571 set_detailed_error("Unable to read connection close error code.");
5572 return false;
5573 }
fkastenholze9d71a82019-04-09 05:12:13 -07005574 frame->transport_error_code = static_cast<QuicIetfTransportErrorCodes>(code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005575
fkastenholz72f509b2019-04-10 09:17:49 -07005576 if (type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5577 // The frame-type of the frame causing the error is present only
5578 // if it's a CONNECTION_CLOSE/Transport.
5579 if (!reader->ReadVarInt62(&frame->transport_close_frame_type)) {
5580 set_detailed_error("Unable to read connection close frame type.");
5581 return false;
5582 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005583 }
5584
5585 uint64_t phrase_length;
5586 if (!reader->ReadVarInt62(&phrase_length)) {
5587 set_detailed_error("Unable to read connection close error details.");
5588 return false;
5589 }
5590 QuicStringPiece phrase;
5591 if (!reader->ReadStringPiece(&phrase, static_cast<size_t>(phrase_length))) {
5592 set_detailed_error("Unable to read connection close error details.");
5593 return false;
5594 }
fkastenholz72f509b2019-04-10 09:17:49 -07005595 // TODO(fkastenholz): when full support is done, add code here
5596 // to extract the extended error code from the reason phrase
5597 // and set it into frame->extracted_error_code.
vasilvvc48c8712019-03-11 13:38:16 -07005598 frame->error_details = std::string(phrase);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005599
5600 return true;
5601}
5602
5603// IETF Quic Path Challenge/Response frames.
5604bool QuicFramer::ProcessPathChallengeFrame(QuicDataReader* reader,
5605 QuicPathChallengeFrame* frame) {
5606 if (!reader->ReadBytes(frame->data_buffer.data(),
5607 frame->data_buffer.size())) {
5608 set_detailed_error("Can not read path challenge data.");
5609 return false;
5610 }
5611 return true;
5612}
5613
5614bool QuicFramer::ProcessPathResponseFrame(QuicDataReader* reader,
5615 QuicPathResponseFrame* frame) {
5616 if (!reader->ReadBytes(frame->data_buffer.data(),
5617 frame->data_buffer.size())) {
5618 set_detailed_error("Can not read path response data.");
5619 return false;
5620 }
5621 return true;
5622}
5623
5624bool QuicFramer::AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
5625 QuicDataWriter* writer) {
5626 if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5627 set_detailed_error("Writing Path Challenge data failed.");
5628 return false;
5629 }
5630 return true;
5631}
5632
5633bool QuicFramer::AppendPathResponseFrame(const QuicPathResponseFrame& frame,
5634 QuicDataWriter* writer) {
5635 if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5636 set_detailed_error("Writing Path Response data failed.");
5637 return false;
5638 }
5639 return true;
5640}
5641
5642// Add a new ietf-format stream reset frame.
5643// General format is
5644// stream id
5645// application error code
5646// final offset
5647bool QuicFramer::AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
5648 QuicDataWriter* writer) {
5649 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
5650 set_detailed_error("Writing reset-stream stream id failed.");
5651 return false;
5652 }
5653 if (!writer->WriteUInt16(frame.ietf_error_code)) {
5654 set_detailed_error("Writing reset-stream error code failed.");
5655 return false;
5656 }
5657 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.byte_offset))) {
5658 set_detailed_error("Writing reset-stream final-offset failed.");
5659 return false;
5660 }
5661 return true;
5662}
5663
5664bool QuicFramer::ProcessIetfResetStreamFrame(QuicDataReader* reader,
5665 QuicRstStreamFrame* frame) {
5666 // Get Stream ID from frame. ReadVarIntStreamID returns false
5667 // if either A) there is a read error or B) the resulting value of
5668 // the Stream ID is larger than the maximum allowed value.
fkastenholz3c4eabf2019-04-22 07:49:59 -07005669 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005670 set_detailed_error("Unable to read rst stream stream id.");
5671 return false;
5672 }
5673
5674 if (!reader->ReadUInt16(&frame->ietf_error_code)) {
5675 set_detailed_error("Unable to read rst stream error code.");
5676 return false;
5677 }
5678
5679 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5680 set_detailed_error("Unable to read rst stream sent byte offset.");
5681 return false;
5682 }
5683 return true;
5684}
5685
5686bool QuicFramer::ProcessStopSendingFrame(
5687 QuicDataReader* reader,
5688 QuicStopSendingFrame* stop_sending_frame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005689 if (!reader->ReadVarIntU32(&stop_sending_frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005690 set_detailed_error("Unable to read stop sending stream id.");
5691 return false;
5692 }
5693
5694 if (!reader->ReadUInt16(&stop_sending_frame->application_error_code)) {
5695 set_detailed_error("Unable to read stop sending application error code.");
5696 return false;
5697 }
5698 return true;
5699}
5700
5701bool QuicFramer::AppendStopSendingFrame(
5702 const QuicStopSendingFrame& stop_sending_frame,
5703 QuicDataWriter* writer) {
5704 if (!writer->WriteVarInt62(stop_sending_frame.stream_id)) {
5705 set_detailed_error("Can not write stop sending stream id");
5706 return false;
5707 }
5708 if (!writer->WriteUInt16(stop_sending_frame.application_error_code)) {
5709 set_detailed_error("Can not write application error code");
5710 return false;
5711 }
5712 return true;
5713}
5714
5715// Append/process IETF-Format MAX_DATA Frame
5716bool QuicFramer::AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
5717 QuicDataWriter* writer) {
5718 if (!writer->WriteVarInt62(frame.byte_offset)) {
5719 set_detailed_error("Can not write MAX_DATA byte-offset");
5720 return false;
5721 }
5722 return true;
5723}
5724
5725bool QuicFramer::ProcessMaxDataFrame(QuicDataReader* reader,
5726 QuicWindowUpdateFrame* frame) {
5727 frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
5728 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5729 set_detailed_error("Can not read MAX_DATA byte-offset");
5730 return false;
5731 }
5732 return true;
5733}
5734
5735// Append/process IETF-Format MAX_STREAM_DATA Frame
5736bool QuicFramer::AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
5737 QuicDataWriter* writer) {
5738 if (!writer->WriteVarInt62(frame.stream_id)) {
5739 set_detailed_error("Can not write MAX_STREAM_DATA stream id");
5740 return false;
5741 }
5742 if (!writer->WriteVarInt62(frame.byte_offset)) {
5743 set_detailed_error("Can not write MAX_STREAM_DATA byte-offset");
5744 return false;
5745 }
5746 return true;
5747}
5748
5749bool QuicFramer::ProcessMaxStreamDataFrame(QuicDataReader* reader,
5750 QuicWindowUpdateFrame* frame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005751 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005752 set_detailed_error("Can not read MAX_STREAM_DATA stream id");
5753 return false;
5754 }
5755 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5756 set_detailed_error("Can not read MAX_STREAM_DATA byte-count");
5757 return false;
5758 }
5759 return true;
5760}
5761
fkastenholz3c4eabf2019-04-22 07:49:59 -07005762bool QuicFramer::AppendMaxStreamsFrame(const QuicMaxStreamsFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005763 QuicDataWriter* writer) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005764 if (!writer->WriteVarInt62(frame.stream_count)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005765 set_detailed_error("Can not write MAX_STREAMS stream count");
5766 return false;
5767 }
5768 return true;
5769}
5770
5771bool QuicFramer::ProcessMaxStreamsFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -07005772 QuicMaxStreamsFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005773 uint64_t frame_type) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005774 if (!reader->ReadVarIntU32(&frame->stream_count)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005775 set_detailed_error("Can not read MAX_STREAMS stream count.");
5776 return false;
5777 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07005778 frame->unidirectional = (frame_type == IETF_MAX_STREAMS_UNIDIRECTIONAL);
5779 return true;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005780}
5781
5782bool QuicFramer::AppendIetfBlockedFrame(const QuicBlockedFrame& frame,
5783 QuicDataWriter* writer) {
5784 if (!writer->WriteVarInt62(frame.offset)) {
5785 set_detailed_error("Can not write blocked offset.");
5786 return false;
5787 }
5788 return true;
5789}
5790
5791bool QuicFramer::ProcessIetfBlockedFrame(QuicDataReader* reader,
5792 QuicBlockedFrame* frame) {
5793 // Indicates that it is a BLOCKED frame (as opposed to STREAM_BLOCKED).
5794 frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
5795 if (!reader->ReadVarInt62(&frame->offset)) {
5796 set_detailed_error("Can not read blocked offset.");
5797 return false;
5798 }
5799 return true;
5800}
5801
5802bool QuicFramer::AppendStreamBlockedFrame(const QuicBlockedFrame& frame,
5803 QuicDataWriter* writer) {
5804 if (!writer->WriteVarInt62(frame.stream_id)) {
5805 set_detailed_error("Can not write stream blocked stream id.");
5806 return false;
5807 }
5808 if (!writer->WriteVarInt62(frame.offset)) {
5809 set_detailed_error("Can not write stream blocked offset.");
5810 return false;
5811 }
5812 return true;
5813}
5814
5815bool QuicFramer::ProcessStreamBlockedFrame(QuicDataReader* reader,
5816 QuicBlockedFrame* frame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005817 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005818 set_detailed_error("Can not read stream blocked stream id.");
5819 return false;
5820 }
5821 if (!reader->ReadVarInt62(&frame->offset)) {
5822 set_detailed_error("Can not read stream blocked offset.");
5823 return false;
5824 }
5825 return true;
5826}
5827
fkastenholz3c4eabf2019-04-22 07:49:59 -07005828bool QuicFramer::AppendStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
5829 QuicDataWriter* writer) {
5830 if (!writer->WriteVarInt62(frame.stream_count)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005831 set_detailed_error("Can not write STREAMS_BLOCKED stream count");
5832 return false;
5833 }
5834 return true;
5835}
5836
5837bool QuicFramer::ProcessStreamsBlockedFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -07005838 QuicStreamsBlockedFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005839 uint64_t frame_type) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005840 if (!reader->ReadVarIntU32(&frame->stream_count)) {
5841 set_detailed_error("Can not read STREAMS_BLOCKED stream count.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05005842 return false;
5843 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07005844 frame->unidirectional = (frame_type == IETF_STREAMS_BLOCKED_UNIDIRECTIONAL);
5845
QUICHE teama6ef0a62019-03-07 20:34:33 -05005846 // TODO(fkastenholz): handle properly when the STREAMS_BLOCKED
5847 // frame is implemented and passed up to the stream ID manager.
fkastenholz3c4eabf2019-04-22 07:49:59 -07005848 if (frame->stream_count >
5849 QuicUtils::GetMaxStreamCount(
5850 (frame_type == IETF_STREAMS_BLOCKED_UNIDIRECTIONAL),
5851 ((perspective_ == Perspective::IS_CLIENT)
5852 ? Perspective::IS_SERVER
5853 : Perspective::IS_CLIENT))) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005854 // If stream count is such that the resulting stream ID would exceed our
5855 // implementation limit, generate an error.
5856 set_detailed_error(
5857 "STREAMS_BLOCKED stream count exceeds implementation limit.");
5858 return false;
5859 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07005860 return true;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005861}
5862
5863bool QuicFramer::AppendNewConnectionIdFrame(
5864 const QuicNewConnectionIdFrame& frame,
5865 QuicDataWriter* writer) {
5866 if (!writer->WriteVarInt62(frame.sequence_number)) {
5867 set_detailed_error("Can not write New Connection ID sequence number");
5868 return false;
5869 }
5870 if (!writer->WriteUInt8(frame.connection_id.length())) {
5871 set_detailed_error(
5872 "Can not write New Connection ID frame connection ID Length");
5873 return false;
5874 }
5875 if (!writer->WriteConnectionId(frame.connection_id)) {
5876 set_detailed_error("Can not write New Connection ID frame connection ID");
5877 return false;
5878 }
5879
5880 if (!writer->WriteBytes(
5881 static_cast<const void*>(&frame.stateless_reset_token),
5882 sizeof(frame.stateless_reset_token))) {
5883 set_detailed_error("Can not write New Connection ID Reset Token");
5884 return false;
5885 }
5886 return true;
5887}
5888
5889bool QuicFramer::ProcessNewConnectionIdFrame(QuicDataReader* reader,
5890 QuicNewConnectionIdFrame* frame) {
5891 if (!reader->ReadVarInt62(&frame->sequence_number)) {
5892 set_detailed_error(
5893 "Unable to read new connection ID frame sequence number.");
5894 return false;
5895 }
5896
5897 uint8_t connection_id_length;
5898 if (!reader->ReadUInt8(&connection_id_length)) {
5899 set_detailed_error(
5900 "Unable to read new connection ID frame connection id length.");
5901 return false;
5902 }
5903
QUICHE team0131a5b2019-03-20 15:23:27 -07005904 if (connection_id_length > kQuicMaxConnectionIdLength) {
5905 set_detailed_error("New connection ID length too high.");
5906 return false;
5907 }
5908
QUICHE team8e2e4532019-03-14 14:37:56 -07005909 if (connection_id_length != kQuicDefaultConnectionIdLength &&
5910 !QuicUtils::VariableLengthConnectionIdAllowedForVersion(
5911 transport_version())) {
QUICHE team0131a5b2019-03-20 15:23:27 -07005912 set_detailed_error("Invalid new connection ID length for version.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05005913 return false;
5914 }
5915
5916 if (!reader->ReadConnectionId(&frame->connection_id, connection_id_length)) {
5917 set_detailed_error("Unable to read new connection ID frame connection id.");
5918 return false;
5919 }
5920
5921 if (!reader->ReadBytes(&frame->stateless_reset_token,
5922 sizeof(frame->stateless_reset_token))) {
5923 set_detailed_error("Can not read new connection ID frame reset token.");
5924 return false;
5925 }
5926 return true;
5927}
5928
5929bool QuicFramer::AppendRetireConnectionIdFrame(
5930 const QuicRetireConnectionIdFrame& frame,
5931 QuicDataWriter* writer) {
5932 if (!writer->WriteVarInt62(frame.sequence_number)) {
5933 set_detailed_error("Can not write Retire Connection ID sequence number");
5934 return false;
5935 }
5936 return true;
5937}
5938
5939bool QuicFramer::ProcessRetireConnectionIdFrame(
5940 QuicDataReader* reader,
5941 QuicRetireConnectionIdFrame* frame) {
5942 if (!reader->ReadVarInt62(&frame->sequence_number)) {
5943 set_detailed_error(
5944 "Unable to read retire connection ID frame sequence number.");
5945 return false;
5946 }
5947 return true;
5948}
5949
5950uint8_t QuicFramer::GetStreamFrameTypeByte(const QuicStreamFrame& frame,
5951 bool last_frame_in_packet) const {
5952 if (version_.transport_version == QUIC_VERSION_99) {
5953 return GetIetfStreamFrameTypeByte(frame, last_frame_in_packet);
5954 }
5955 uint8_t type_byte = 0;
5956 // Fin bit.
5957 type_byte |= frame.fin ? kQuicStreamFinMask : 0;
5958
5959 // Data Length bit.
5960 type_byte <<= kQuicStreamDataLengthShift;
5961 type_byte |= last_frame_in_packet ? 0 : kQuicStreamDataLengthMask;
5962
5963 // Offset 3 bits.
5964 type_byte <<= kQuicStreamShift;
5965 const size_t offset_len =
5966 GetStreamOffsetSize(version_.transport_version, frame.offset);
5967 if (offset_len > 0) {
5968 type_byte |= offset_len - 1;
5969 }
5970
5971 // stream id 2 bits.
5972 type_byte <<= kQuicStreamIdShift;
5973 type_byte |= GetStreamIdSize(frame.stream_id) - 1;
5974 type_byte |= kQuicFrameTypeStreamMask; // Set Stream Frame Type to 1.
5975
5976 return type_byte;
5977}
5978
5979uint8_t QuicFramer::GetIetfStreamFrameTypeByte(
5980 const QuicStreamFrame& frame,
5981 bool last_frame_in_packet) const {
5982 DCHECK_EQ(QUIC_VERSION_99, version_.transport_version);
5983 uint8_t type_byte = IETF_STREAM;
5984 if (!last_frame_in_packet) {
5985 type_byte |= IETF_STREAM_FRAME_LEN_BIT;
5986 }
5987 if (frame.offset != 0) {
5988 type_byte |= IETF_STREAM_FRAME_OFF_BIT;
5989 }
5990 if (frame.fin) {
5991 type_byte |= IETF_STREAM_FRAME_FIN_BIT;
5992 }
5993 return type_byte;
5994}
5995
5996void QuicFramer::InferPacketHeaderTypeFromVersion() {
5997 // This function should only be called when server connection negotiates the
5998 // version.
5999 DCHECK(perspective_ == Perspective::IS_SERVER &&
6000 !infer_packet_header_type_from_version_);
6001 infer_packet_header_type_from_version_ = true;
6002}
6003
QUICHE team10b22a12019-03-21 15:31:42 -07006004void QuicFramer::EnableMultiplePacketNumberSpacesSupport() {
6005 if (supports_multiple_packet_number_spaces_) {
6006 QUIC_BUG << "Multiple packet number spaces has already been enabled";
6007 return;
6008 }
6009 if (largest_packet_number_.IsInitialized()) {
6010 QUIC_BUG << "Try to enable multiple packet number spaces support after any "
6011 "packet has been received.";
6012 return;
6013 }
6014
6015 supports_multiple_packet_number_spaces_ = true;
6016}
6017
fayangccbab732019-05-13 10:11:25 -07006018// static
6019QuicErrorCode QuicFramer::ProcessPacketDispatcher(
6020 const QuicEncryptedPacket& packet,
dschinazib42a8c52019-05-30 09:45:01 -07006021 uint8_t expected_destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -07006022 PacketHeaderFormat* format,
6023 bool* version_flag,
6024 QuicVersionLabel* version_label,
fayangccbab732019-05-13 10:11:25 -07006025 QuicConnectionId* destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -07006026 QuicConnectionId* source_connection_id,
fayangccbab732019-05-13 10:11:25 -07006027 std::string* detailed_error) {
6028 QuicDataReader reader(packet.data(), packet.length());
6029
dschinazib42a8c52019-05-30 09:45:01 -07006030 *source_connection_id = EmptyQuicConnectionId();
fayangccbab732019-05-13 10:11:25 -07006031 uint8_t first_byte;
6032 if (!reader.ReadBytes(&first_byte, 1)) {
6033 *detailed_error = "Unable to read first byte.";
6034 return QUIC_INVALID_PACKET_HEADER;
6035 }
dschinazib42a8c52019-05-30 09:45:01 -07006036 uint8_t destination_connection_id_length = 0, source_connection_id_length = 0;
fayangccbab732019-05-13 10:11:25 -07006037 if (!QuicUtils::IsIetfPacketHeader(first_byte)) {
6038 *format = GOOGLE_QUIC_PACKET;
6039 *version_flag = (first_byte & PACKET_PUBLIC_FLAGS_VERSION) != 0;
dschinazib42a8c52019-05-30 09:45:01 -07006040 destination_connection_id_length =
fayangccbab732019-05-13 10:11:25 -07006041 first_byte & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID;
dschinazib42a8c52019-05-30 09:45:01 -07006042 if (destination_connection_id_length == 0 ||
fayangccbab732019-05-13 10:11:25 -07006043 !reader.ReadConnectionId(destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -07006044 destination_connection_id_length)) {
fayangccbab732019-05-13 10:11:25 -07006045 *detailed_error = "Unable to read ConnectionId.";
6046 return QUIC_INVALID_PACKET_HEADER;
6047 }
6048 if (*version_flag && !ProcessVersionLabel(&reader, version_label)) {
6049 *detailed_error = "Unable to read protocol version.";
6050 return QUIC_INVALID_PACKET_HEADER;
6051 }
6052 return QUIC_NO_ERROR;
6053 }
6054
6055 *format = GetIetfPacketHeaderFormat(first_byte);
6056 QUIC_DVLOG(1) << "Dispatcher: Processing IETF QUIC packet, format: "
6057 << *format;
6058 *version_flag = *format == IETF_QUIC_LONG_HEADER_PACKET;
6059 if (*format == IETF_QUIC_LONG_HEADER_PACKET) {
6060 if (!ProcessVersionLabel(&reader, version_label)) {
6061 *detailed_error = "Unable to read protocol version.";
6062 return QUIC_INVALID_PACKET_HEADER;
6063 }
dschinazi8ff74822019-05-28 16:37:20 -07006064 // Set should_update_expected_server_connection_id_length to true to bypass
fayangccbab732019-05-13 10:11:25 -07006065 // connection ID lengths validation.
dschinazi8ff74822019-05-28 16:37:20 -07006066 uint8_t unused_expected_server_connection_id_length = 0;
fayangccbab732019-05-13 10:11:25 -07006067 if (!ProcessAndValidateIetfConnectionIdLength(
6068 &reader, ParseQuicVersionLabel(*version_label),
dschinazi334f0232019-05-29 16:08:53 -07006069 Perspective::IS_SERVER,
dschinazi8ff74822019-05-28 16:37:20 -07006070 /*should_update_expected_server_connection_id_length=*/true,
6071 &unused_expected_server_connection_id_length,
dschinazib42a8c52019-05-30 09:45:01 -07006072 &destination_connection_id_length, &source_connection_id_length,
6073 detailed_error)) {
fayangccbab732019-05-13 10:11:25 -07006074 return QUIC_INVALID_PACKET_HEADER;
6075 }
6076 } else {
dschinazib42a8c52019-05-30 09:45:01 -07006077 // For short header packets, expected_destination_connection_id_length
6078 // is used to determine the destination_connection_id_length.
6079 destination_connection_id_length =
6080 expected_destination_connection_id_length;
6081 DCHECK_EQ(0, source_connection_id_length);
fayangccbab732019-05-13 10:11:25 -07006082 }
6083 // Read destination connection ID.
6084 if (!reader.ReadConnectionId(destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -07006085 destination_connection_id_length)) {
6086 *detailed_error = "Unable to read destination connection ID.";
6087 return QUIC_INVALID_PACKET_HEADER;
6088 }
6089 // Read source connection ID.
6090 if (GetQuicRestartFlag(quic_do_not_override_connection_id) &&
6091 !reader.ReadConnectionId(source_connection_id,
6092 source_connection_id_length)) {
6093 *detailed_error = "Unable to read source connection ID.";
fayangccbab732019-05-13 10:11:25 -07006094 return QUIC_INVALID_PACKET_HEADER;
6095 }
6096 return QUIC_NO_ERROR;
6097}
6098
dschinazide0f6dc2019-05-15 16:10:11 -07006099// static
6100bool QuicFramer::WriteClientVersionNegotiationProbePacket(
6101 char* packet_bytes,
6102 QuicByteCount packet_length,
6103 const char* destination_connection_id_bytes,
6104 uint8_t destination_connection_id_length) {
6105 if (packet_bytes == nullptr) {
6106 QUIC_BUG << "Invalid packet_bytes";
6107 return false;
6108 }
6109 if (packet_length < kMinPacketSizeForVersionNegotiation ||
6110 packet_length > 65535) {
6111 QUIC_BUG << "Invalid packet_length";
6112 return false;
6113 }
6114 if (destination_connection_id_length > kQuicMaxConnectionIdLength ||
6115 (destination_connection_id_length > 0 &&
6116 destination_connection_id_length < 4)) {
6117 QUIC_BUG << "Invalid connection_id_length";
6118 return false;
6119 }
6120 // clang-format off
6121 static const unsigned char packet_start_bytes[] = {
6122 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
6123 0xc0,
6124 // Version, part of the IETF space reserved for negotiation.
6125 // This intentionally differs from QuicVersionReservedForNegotiation()
6126 // to allow differentiating them over the wire.
6127 0xca, 0xba, 0xda, 0xba,
6128 };
6129 // clang-format on
6130 static_assert(sizeof(packet_start_bytes) == 5, "bad packet_start_bytes size");
6131 QuicDataWriter writer(packet_length, packet_bytes);
6132 if (!writer.WriteBytes(packet_start_bytes, sizeof(packet_start_bytes))) {
6133 QUIC_BUG << "Failed to write packet start";
6134 return false;
6135 }
6136
6137 QuicConnectionId destination_connection_id(destination_connection_id_bytes,
6138 destination_connection_id_length);
6139 if (!AppendIetfConnectionIds(/*version_flag=*/true, destination_connection_id,
6140 EmptyQuicConnectionId(), &writer)) {
6141 QUIC_BUG << "Failed to write connection IDs";
6142 return false;
6143 }
6144 // Add 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
6145 // not parse with any known version. The zeroes make sure that packet numbers,
6146 // retry token lengths and payload lengths are parsed as zero, and if the
6147 // zeroes are treated as padding frames, 0xff is known to not parse as a
6148 // valid frame type.
6149 if (!writer.WriteUInt64(0) ||
6150 !writer.WriteUInt64(std::numeric_limits<uint64_t>::max())) {
6151 QUIC_BUG << "Failed to write 18 bytes";
6152 return false;
6153 }
6154 // Make sure the polite greeting below is padded to a 16-byte boundary to
6155 // make it easier to read in tcpdump.
6156 while (writer.length() % 16 != 0) {
6157 if (!writer.WriteUInt8(0)) {
6158 QUIC_BUG << "Failed to write padding byte";
6159 return false;
6160 }
6161 }
6162 // Add a polite greeting in case a human sees this in tcpdump.
6163 static const char polite_greeting[] =
6164 "This packet only exists to trigger IETF QUIC version negotiation. "
6165 "Please respond with a Version Negotiation packet indicating what "
6166 "versions you support. Thank you and have a nice day.";
6167 if (!writer.WriteBytes(polite_greeting, sizeof(polite_greeting))) {
6168 QUIC_BUG << "Failed to write polite greeting";
6169 return false;
6170 }
6171 // Fill the rest of the packet with zeroes.
6172 writer.WritePadding();
6173 DCHECK_EQ(0u, writer.remaining());
6174 return true;
6175}
6176
6177// static
6178bool QuicFramer::ParseServerVersionNegotiationProbeResponse(
6179 const char* packet_bytes,
6180 QuicByteCount packet_length,
6181 char* source_connection_id_bytes,
6182 uint8_t* source_connection_id_length_out,
6183 std::string* detailed_error) {
6184 if (detailed_error == nullptr) {
6185 QUIC_BUG << "Invalid error_details";
6186 return false;
6187 }
6188 *detailed_error = "";
6189 if (packet_bytes == nullptr) {
6190 *detailed_error = "Invalid packet_bytes";
6191 return false;
6192 }
6193 if (packet_length < 6) {
6194 *detailed_error = "Invalid packet_length";
6195 return false;
6196 }
6197 if (source_connection_id_bytes == nullptr) {
6198 *detailed_error = "Invalid source_connection_id_bytes";
6199 return false;
6200 }
6201 if (source_connection_id_length_out == nullptr) {
6202 *detailed_error = "Invalid source_connection_id_length_out";
6203 return false;
6204 }
6205 QuicDataReader reader(packet_bytes, packet_length);
6206 uint8_t type_byte = 0;
6207 if (!reader.ReadUInt8(&type_byte)) {
6208 *detailed_error = "Failed to read type byte";
6209 return false;
6210 }
6211 if ((type_byte & 0x80) == 0) {
6212 *detailed_error = "Packet does not have long header";
6213 return false;
6214 }
6215 uint32_t version = 0;
6216 if (!reader.ReadUInt32(&version)) {
6217 *detailed_error = "Failed to read version";
6218 return false;
6219 }
6220 if (version != 0) {
6221 *detailed_error = "Packet is not a version negotiation packet";
6222 return false;
6223 }
dschinazi8ff74822019-05-28 16:37:20 -07006224 uint8_t expected_server_connection_id_length = 0,
dschinazide0f6dc2019-05-15 16:10:11 -07006225 destination_connection_id_length = 0, source_connection_id_length = 0;
6226 if (!ProcessAndValidateIetfConnectionIdLength(
dschinazi334f0232019-05-29 16:08:53 -07006227 &reader, UnsupportedQuicVersion(), Perspective::IS_CLIENT,
dschinazi8ff74822019-05-28 16:37:20 -07006228 /*should_update_expected_server_connection_id_length=*/true,
6229 &expected_server_connection_id_length,
6230 &destination_connection_id_length, &source_connection_id_length,
6231 detailed_error)) {
dschinazide0f6dc2019-05-15 16:10:11 -07006232 return false;
6233 }
6234 if (destination_connection_id_length != 0) {
6235 *detailed_error = "Received unexpected destination connection ID length";
6236 return false;
6237 }
6238 QuicConnectionId destination_connection_id, source_connection_id;
6239 if (!reader.ReadConnectionId(&destination_connection_id,
6240 destination_connection_id_length)) {
6241 *detailed_error = "Failed to read destination connection ID";
6242 return false;
6243 }
6244 if (!reader.ReadConnectionId(&source_connection_id,
6245 source_connection_id_length)) {
6246 *detailed_error = "Failed to read source connection ID";
6247 return false;
6248 }
6249
6250 memcpy(source_connection_id_bytes, source_connection_id.data(),
6251 source_connection_id_length);
6252 *source_connection_id_length_out = source_connection_id_length;
6253
6254 return true;
6255}
6256
QUICHE teama6ef0a62019-03-07 20:34:33 -05006257#undef ENDPOINT // undef for jumbo builds
6258} // namespace quic