blob: 6048133d55e8612c5fe2ad4a688edcddbf8f3def [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"
36#include "net/third_party/quiche/src/quic/platform/api/quic_endian.h"
37#include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h"
38#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
39#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
40#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
41#include "net/third_party/quiche/src/quic/platform/api/quic_map_util.h"
42#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
43#include "net/third_party/quiche/src/quic/platform/api/quic_stack_trace.h"
44#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050045#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
46
47namespace quic {
48
49namespace {
50
51#define ENDPOINT \
52 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
53
54// How much to shift the timestamp in the IETF Ack frame.
55// TODO(fkastenholz) when we get real IETF QUIC, need to get
56// the currect shift from the transport parameters.
57const int kIetfAckTimestampShift = 3;
58
59// Number of bits the packet number length bits are shifted from the right
60// edge of the header.
61const uint8_t kPublicHeaderSequenceNumberShift = 4;
62
63// There are two interpretations for the Frame Type byte in the QUIC protocol,
64// resulting in two Frame Types: Special Frame Types and Regular Frame Types.
65//
66// Regular Frame Types use the Frame Type byte simply. Currently defined
67// Regular Frame Types are:
68// Padding : 0b 00000000 (0x00)
69// ResetStream : 0b 00000001 (0x01)
70// ConnectionClose : 0b 00000010 (0x02)
71// GoAway : 0b 00000011 (0x03)
72// WindowUpdate : 0b 00000100 (0x04)
73// Blocked : 0b 00000101 (0x05)
74//
75// Special Frame Types encode both a Frame Type and corresponding flags
76// all in the Frame Type byte. Currently defined Special Frame Types
77// are:
78// Stream : 0b 1xxxxxxx
79// Ack : 0b 01xxxxxx
80//
81// Semantics of the flag bits above (the x bits) depends on the frame type.
82
83// Masks to determine if the frame type is a special use
84// and for specific special frame types.
85const uint8_t kQuicFrameTypeBrokenMask = 0xE0; // 0b 11100000
86const uint8_t kQuicFrameTypeSpecialMask = 0xC0; // 0b 11000000
87const uint8_t kQuicFrameTypeStreamMask = 0x80;
88const uint8_t kQuicFrameTypeAckMask = 0x40;
89static_assert(kQuicFrameTypeSpecialMask ==
90 (kQuicFrameTypeStreamMask | kQuicFrameTypeAckMask),
91 "Invalid kQuicFrameTypeSpecialMask");
92
93// The stream type format is 1FDOOOSS, where
94// F is the fin bit.
95// D is the data length bit (0 or 2 bytes).
96// OO/OOO are the size of the offset.
97// SS is the size of the stream ID.
98// Note that the stream encoding can not be determined by inspection. It can
99// be determined only by knowing the QUIC Version.
100// Stream frame relative shifts and masks for interpreting the stream flags.
101// StreamID may be 1, 2, 3, or 4 bytes.
102const uint8_t kQuicStreamIdShift = 2;
103const uint8_t kQuicStreamIDLengthMask = 0x03;
104
105// Offset may be 0, 2, 4, or 8 bytes.
106const uint8_t kQuicStreamShift = 3;
107const uint8_t kQuicStreamOffsetMask = 0x07;
108
109// Data length may be 0 or 2 bytes.
110const uint8_t kQuicStreamDataLengthShift = 1;
111const uint8_t kQuicStreamDataLengthMask = 0x01;
112
113// Fin bit may be set or not.
114const uint8_t kQuicStreamFinShift = 1;
115const uint8_t kQuicStreamFinMask = 0x01;
116
117// The format is 01M0LLOO, where
118// M if set, there are multiple ack blocks in the frame.
119// LL is the size of the largest ack field.
120// OO is the size of the ack blocks offset field.
121// packet number size shift used in AckFrames.
122const uint8_t kQuicSequenceNumberLengthNumBits = 2;
123const uint8_t kActBlockLengthOffset = 0;
124const uint8_t kLargestAckedOffset = 2;
125
126// Acks may have only one ack block.
127const uint8_t kQuicHasMultipleAckBlocksOffset = 5;
128
129// Timestamps are 4 bytes followed by 2 bytes.
130const uint8_t kQuicNumTimestampsLength = 1;
131const uint8_t kQuicFirstTimestampLength = 4;
132const uint8_t kQuicTimestampLength = 2;
133// Gaps between packet numbers are 1 byte.
134const uint8_t kQuicTimestampPacketNumberGapLength = 1;
135
136// Maximum length of encoded error strings.
137const int kMaxErrorStringLength = 256;
138
139const uint8_t kConnectionIdLengthAdjustment = 3;
140const uint8_t kDestinationConnectionIdLengthMask = 0xF0;
141const uint8_t kSourceConnectionIdLengthMask = 0x0F;
142
143// Returns the absolute value of the difference between |a| and |b|.
144uint64_t Delta(uint64_t a, uint64_t b) {
145 // Since these are unsigned numbers, we can't just return abs(a - b)
146 if (a < b) {
147 return b - a;
148 }
149 return a - b;
150}
151
152uint64_t ClosestTo(uint64_t target, uint64_t a, uint64_t b) {
153 return (Delta(target, a) < Delta(target, b)) ? a : b;
154}
155
156uint64_t PacketNumberIntervalLength(
157 const QuicInterval<QuicPacketNumber>& interval) {
158 if (interval.Empty()) {
159 return 0u;
160 }
161 return interval.max() - interval.min();
162}
163
164QuicPacketNumberLength ReadSequenceNumberLength(uint8_t flags) {
165 switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
166 case PACKET_FLAGS_8BYTE_PACKET:
167 return PACKET_6BYTE_PACKET_NUMBER;
168 case PACKET_FLAGS_4BYTE_PACKET:
169 return PACKET_4BYTE_PACKET_NUMBER;
170 case PACKET_FLAGS_2BYTE_PACKET:
171 return PACKET_2BYTE_PACKET_NUMBER;
172 case PACKET_FLAGS_1BYTE_PACKET:
173 return PACKET_1BYTE_PACKET_NUMBER;
174 default:
175 QUIC_BUG << "Unreachable case statement.";
176 return PACKET_6BYTE_PACKET_NUMBER;
177 }
178}
179
180QuicPacketNumberLength ReadAckPacketNumberLength(QuicTransportVersion version,
181 uint8_t flags) {
182 switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
183 case PACKET_FLAGS_8BYTE_PACKET:
184 return PACKET_6BYTE_PACKET_NUMBER;
185 case PACKET_FLAGS_4BYTE_PACKET:
186 return PACKET_4BYTE_PACKET_NUMBER;
187 case PACKET_FLAGS_2BYTE_PACKET:
188 return PACKET_2BYTE_PACKET_NUMBER;
189 case PACKET_FLAGS_1BYTE_PACKET:
190 return PACKET_1BYTE_PACKET_NUMBER;
191 default:
192 QUIC_BUG << "Unreachable case statement.";
193 return PACKET_6BYTE_PACKET_NUMBER;
194 }
195}
196
197uint8_t PacketNumberLengthToOnWireValue(
198 QuicTransportVersion version,
199 QuicPacketNumberLength packet_number_length) {
200 if (version > QUIC_VERSION_44) {
201 return packet_number_length - 1;
202 }
203 switch (packet_number_length) {
204 case PACKET_1BYTE_PACKET_NUMBER:
205 return 0;
206 case PACKET_2BYTE_PACKET_NUMBER:
207 return 1;
208 case PACKET_4BYTE_PACKET_NUMBER:
209 return 2;
210 default:
211 QUIC_BUG << "Invalid packet number length.";
212 return 0;
213 }
214}
215
216bool GetShortHeaderPacketNumberLength(
217 QuicTransportVersion version,
218 uint8_t type,
219 bool infer_packet_header_type_from_version,
220 QuicPacketNumberLength* packet_number_length) {
221 DCHECK(!(type & FLAGS_LONG_HEADER));
222 const bool two_bits_packet_number_length =
223 infer_packet_header_type_from_version ? version > QUIC_VERSION_44
224 : (type & FLAGS_FIXED_BIT);
225 if (two_bits_packet_number_length) {
226 *packet_number_length =
227 static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
228 return true;
229 }
230 switch (type & 0x07) {
231 case 0:
232 *packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
233 break;
234 case 1:
235 *packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
236 break;
237 case 2:
238 *packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
239 break;
240 default:
241 *packet_number_length = PACKET_6BYTE_PACKET_NUMBER;
242 return false;
243 }
244 return true;
245}
246
247uint8_t LongHeaderTypeToOnWireValue(QuicTransportVersion version,
248 QuicLongHeaderType type) {
249 switch (type) {
250 case INITIAL:
251 return version > QUIC_VERSION_44 ? 0 : 0x7F;
252 case ZERO_RTT_PROTECTED:
253 return version > QUIC_VERSION_44 ? 1 << 4 : 0x7C;
254 case HANDSHAKE:
255 return version > QUIC_VERSION_44 ? 2 << 4 : 0x7D;
256 case RETRY:
257 return version > QUIC_VERSION_44 ? 3 << 4 : 0x7E;
258 case VERSION_NEGOTIATION:
259 return 0xF0; // Value does not matter
260 default:
261 QUIC_BUG << "Invalid long header type: " << type;
262 return 0xFF;
263 }
264}
265
266bool GetLongHeaderType(QuicTransportVersion version,
267 uint8_t type,
268 QuicLongHeaderType* long_header_type) {
269 DCHECK((type & FLAGS_LONG_HEADER) && version != QUIC_VERSION_UNSUPPORTED);
270 if (version > QUIC_VERSION_44) {
271 switch ((type & 0x30) >> 4) {
272 case 0:
273 *long_header_type = INITIAL;
274 break;
275 case 1:
276 *long_header_type = ZERO_RTT_PROTECTED;
277 break;
278 case 2:
279 *long_header_type = HANDSHAKE;
280 break;
281 case 3:
282 *long_header_type = RETRY;
283 break;
284 default:
285 QUIC_BUG << "Unreachable statement";
dschinazi072da7c2019-05-07 17:57:42 -0700286 *long_header_type = INVALID_PACKET_TYPE;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 return false;
288 }
289 return true;
290 }
291
292 switch (type & 0x7F) {
293 case 0x7F:
294 *long_header_type = INITIAL;
295 break;
296 case 0x7C:
297 *long_header_type = ZERO_RTT_PROTECTED;
298 break;
299 case 0x7D:
300 *long_header_type = HANDSHAKE;
301 break;
302 case 0x7E:
303 *long_header_type = RETRY;
304 break;
305 default:
306 // Invalid packet header type. Whether a packet is version negotiation is
307 // determined by the version field.
308 *long_header_type = INVALID_PACKET_TYPE;
309 return false;
310 }
311 return true;
312}
313
314QuicPacketNumberLength GetLongHeaderPacketNumberLength(
315 QuicTransportVersion version,
316 uint8_t type) {
317 if (version > QUIC_VERSION_44) {
318 return static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
319 }
320 return PACKET_4BYTE_PACKET_NUMBER;
321}
322
QUICHE team10b22a12019-03-21 15:31:42 -0700323// Used to get packet number space before packet gets decrypted.
324PacketNumberSpace GetPacketNumberSpace(const QuicPacketHeader& header) {
325 switch (header.form) {
326 case GOOGLE_QUIC_PACKET:
327 QUIC_BUG << "Try to get packet number space of Google QUIC packet";
328 break;
329 case IETF_QUIC_SHORT_HEADER_PACKET:
330 return APPLICATION_DATA;
331 case IETF_QUIC_LONG_HEADER_PACKET:
332 switch (header.long_packet_type) {
333 case INITIAL:
334 return INITIAL_DATA;
335 case HANDSHAKE:
336 return HANDSHAKE_DATA;
337 case ZERO_RTT_PROTECTED:
338 return APPLICATION_DATA;
339 case VERSION_NEGOTIATION:
340 case RETRY:
341 case INVALID_PACKET_TYPE:
342 QUIC_BUG << "Try to get packet number space of long header type: "
343 << QuicUtils::QuicLongHeaderTypetoString(
344 header.long_packet_type);
345 break;
346 }
347 }
348
349 return NUM_PACKET_NUMBER_SPACES;
350}
351
zhongyi546cc452019-04-12 15:27:49 -0700352EncryptionLevel GetEncryptionLevel(const QuicPacketHeader& header) {
353 switch (header.form) {
354 case GOOGLE_QUIC_PACKET:
355 QUIC_BUG << "Cannot determine EncryptionLevel from Google QUIC header";
356 break;
357 case IETF_QUIC_SHORT_HEADER_PACKET:
358 return ENCRYPTION_FORWARD_SECURE;
359 case IETF_QUIC_LONG_HEADER_PACKET:
360 switch (header.long_packet_type) {
361 case INITIAL:
362 return ENCRYPTION_INITIAL;
363 case HANDSHAKE:
364 return ENCRYPTION_HANDSHAKE;
365 case ZERO_RTT_PROTECTED:
366 return ENCRYPTION_ZERO_RTT;
367 case VERSION_NEGOTIATION:
368 case RETRY:
369 case INVALID_PACKET_TYPE:
370 QUIC_BUG << "No encryption used with type "
371 << QuicUtils::QuicLongHeaderTypetoString(
372 header.long_packet_type);
373 }
374 }
375 return NUM_ENCRYPTION_LEVELS;
376}
377
QUICHE teama6ef0a62019-03-07 20:34:33 -0500378QuicStringPiece TruncateErrorString(QuicStringPiece error) {
379 if (error.length() <= kMaxErrorStringLength) {
380 return error;
381 }
382 return QuicStringPiece(error.data(), kMaxErrorStringLength);
383}
384
385size_t TruncatedErrorStringSize(const QuicStringPiece& error) {
386 if (error.length() < kMaxErrorStringLength) {
387 return error.length();
388 }
389 return kMaxErrorStringLength;
390}
391
392uint8_t GetConnectionIdLengthValue(QuicConnectionIdLength length) {
393 if (length == 0) {
394 return 0;
395 }
396 return static_cast<uint8_t>(length - kConnectionIdLengthAdjustment);
397}
398
399bool IsValidPacketNumberLength(QuicPacketNumberLength packet_number_length) {
400 size_t length = packet_number_length;
401 return length == 1 || length == 2 || length == 4 || length == 6 ||
402 length == 8;
403}
404
405bool IsValidFullPacketNumber(uint64_t full_packet_number,
406 QuicTransportVersion version) {
QUICHE team577718a2019-03-20 09:00:59 -0700407 return full_packet_number > 0 || version == QUIC_VERSION_99;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500408}
409
dschinazi1f485a12019-05-13 11:57:01 -0700410bool AppendIetfConnectionIds(bool version_flag,
411 QuicConnectionId destination_connection_id,
412 QuicConnectionId source_connection_id,
413 QuicDataWriter* writer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500414 if (!version_flag) {
415 return writer->WriteConnectionId(destination_connection_id);
416 }
417
418 // Compute connection ID length byte.
419 uint8_t dcil = GetConnectionIdLengthValue(
420 static_cast<QuicConnectionIdLength>(destination_connection_id.length()));
421 uint8_t scil = GetConnectionIdLengthValue(
422 static_cast<QuicConnectionIdLength>(source_connection_id.length()));
423 uint8_t connection_id_length = dcil << 4 | scil;
424
425 return writer->WriteUInt8(connection_id_length) &&
426 writer->WriteConnectionId(destination_connection_id) &&
427 writer->WriteConnectionId(source_connection_id);
428}
429
430enum class DroppedPacketReason {
431 // General errors
432 INVALID_PUBLIC_HEADER,
433 VERSION_MISMATCH,
434 // Version negotiation packet errors
435 INVALID_VERSION_NEGOTIATION_PACKET,
436 // Public reset packet errors, pre-v44
437 INVALID_PUBLIC_RESET_PACKET,
438 // Data packet errors
439 INVALID_PACKET_NUMBER,
440 INVALID_DIVERSIFICATION_NONCE,
441 DECRYPTION_FAILURE,
442 NUM_REASONS,
443};
444
445void RecordDroppedPacketReason(DroppedPacketReason reason) {
446 QUIC_CLIENT_HISTOGRAM_ENUM("QuicDroppedPacketReason", reason,
447 DroppedPacketReason::NUM_REASONS,
448 "The reason a packet was not processed. Recorded "
449 "each time such a packet is dropped");
450}
451
fayangccbab732019-05-13 10:11:25 -0700452PacketHeaderFormat GetIetfPacketHeaderFormat(uint8_t type_byte) {
453 return type_byte & FLAGS_LONG_HEADER ? IETF_QUIC_LONG_HEADER_PACKET
454 : IETF_QUIC_SHORT_HEADER_PACKET;
455}
456
QUICHE teama6ef0a62019-03-07 20:34:33 -0500457} // namespace
458
459QuicFramer::QuicFramer(const ParsedQuicVersionVector& supported_versions,
460 QuicTime creation_time,
461 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -0700462 uint8_t expected_server_connection_id_length)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500463 : visitor_(nullptr),
464 error_(QUIC_NO_ERROR),
dschinazi7b9278c2019-05-20 07:36:21 -0700465 last_serialized_server_connection_id_(EmptyQuicConnectionId()),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500466 last_version_label_(0),
467 version_(PROTOCOL_UNSUPPORTED, QUIC_VERSION_UNSUPPORTED),
468 supported_versions_(supported_versions),
QUICHE team6987b4a2019-03-15 16:23:04 -0700469 decrypter_level_(ENCRYPTION_INITIAL),
QUICHE team76086e42019-03-25 15:12:29 -0700470 alternative_decrypter_level_(NUM_ENCRYPTION_LEVELS),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500471 alternative_decrypter_latch_(false),
472 perspective_(perspective),
473 validate_flags_(true),
474 process_timestamps_(false),
475 creation_time_(creation_time),
476 last_timestamp_(QuicTime::Delta::Zero()),
477 first_sending_packet_number_(FirstSendingPacketNumber()),
478 data_producer_(nullptr),
479 infer_packet_header_type_from_version_(perspective ==
480 Perspective::IS_CLIENT),
dschinazi8ff74822019-05-28 16:37:20 -0700481 expected_server_connection_id_length_(
482 expected_server_connection_id_length),
483 should_update_expected_server_connection_id_length_(false),
nharper55fa6132019-05-07 19:37:21 -0700484 supports_multiple_packet_number_spaces_(false),
485 last_written_packet_number_length_(0) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486 DCHECK(!supported_versions.empty());
487 version_ = supported_versions_[0];
QUICHE team76086e42019-03-25 15:12:29 -0700488 decrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullDecrypter>(perspective);
QUICHE team6987b4a2019-03-15 16:23:04 -0700489 encrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullEncrypter>(perspective);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500490}
491
492QuicFramer::~QuicFramer() {}
493
494// static
495size_t QuicFramer::GetMinStreamFrameSize(QuicTransportVersion version,
496 QuicStreamId stream_id,
497 QuicStreamOffset offset,
498 bool last_frame_in_packet,
499 QuicPacketLength data_length) {
500 if (version == QUIC_VERSION_99) {
501 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(stream_id) +
502 (last_frame_in_packet
503 ? 0
504 : QuicDataWriter::GetVarInt62Len(data_length)) +
505 (offset != 0 ? QuicDataWriter::GetVarInt62Len(offset) : 0);
506 }
507 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
508 GetStreamOffsetSize(version, offset) +
509 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize);
510}
511
512// static
513size_t QuicFramer::GetMinCryptoFrameSize(QuicStreamOffset offset,
514 QuicPacketLength data_length) {
515 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(offset) +
516 QuicDataWriter::GetVarInt62Len(data_length);
517}
518
519// static
520size_t QuicFramer::GetMessageFrameSize(QuicTransportVersion version,
521 bool last_frame_in_packet,
522 QuicByteCount length) {
523 QUIC_BUG_IF(version <= QUIC_VERSION_44)
524 << "Try to serialize MESSAGE frame in " << version;
525 return kQuicFrameTypeSize +
526 (last_frame_in_packet ? 0 : QuicDataWriter::GetVarInt62Len(length)) +
527 length;
528}
529
530// static
531size_t QuicFramer::GetMinAckFrameSize(
532 QuicTransportVersion version,
533 QuicPacketNumberLength largest_observed_length) {
534 if (version == QUIC_VERSION_99) {
535 // The minimal ack frame consists of the following four fields: Largest
536 // Acknowledged, ACK Delay, ACK Block Count, and First ACK Block. Minimum
537 // size of each is 1 byte.
538 return kQuicFrameTypeSize + 4;
539 }
540 size_t min_size = kQuicFrameTypeSize + largest_observed_length +
541 kQuicDeltaTimeLargestObservedSize;
542 return min_size + kQuicNumTimestampsSize;
543}
544
545// static
546size_t QuicFramer::GetStopWaitingFrameSize(
547 QuicTransportVersion version,
548 QuicPacketNumberLength packet_number_length) {
549 size_t min_size = kQuicFrameTypeSize + packet_number_length;
550 return min_size;
551}
552
553// static
554size_t QuicFramer::GetRstStreamFrameSize(QuicTransportVersion version,
555 const QuicRstStreamFrame& frame) {
556 if (version == QUIC_VERSION_99) {
557 return QuicDataWriter::GetVarInt62Len(frame.stream_id) +
558 QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
559 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
560 }
561 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize +
562 kQuicErrorCodeSize;
563}
564
565// static
fkastenholza037b8b2019-05-07 06:00:05 -0700566size_t QuicFramer::GetConnectionCloseFrameSize(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500567 QuicTransportVersion version,
568 const QuicConnectionCloseFrame& frame) {
fkastenholza037b8b2019-05-07 06:00:05 -0700569 if (version != QUIC_VERSION_99) {
570 // Not version 99/IETF QUIC, return Google QUIC CONNECTION CLOSE frame size.
571 return kQuicFrameTypeSize + kQuicErrorCodeSize +
572 kQuicErrorDetailsLengthSize +
573 TruncatedErrorStringSize(frame.error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500574 }
fkastenholza037b8b2019-05-07 06:00:05 -0700575 // TODO(fkastenholz): For complete support of IETF QUIC CONNECTION_CLOSE,
576 // check if the frame is a Transport close and if the frame's
577 // extracted_error_code is not QUIC_IETF_GQUIC_ERROR_MISSING. If so,
578 // extend the error string to include " QuicErrorCode: #"
579 const size_t truncated_error_string_size =
580 TruncatedErrorStringSize(frame.error_details);
581 const size_t frame_size =
582 truncated_error_string_size +
583 QuicDataWriter::GetVarInt62Len(truncated_error_string_size) +
584 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
585 if (frame.close_type == IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
586 return frame_size;
587 }
588 // frame includes the transport_close_frame_type, so include its length.
589 return frame_size +
590 QuicDataWriter::GetVarInt62Len(frame.transport_close_frame_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500591}
592
593// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500594size_t QuicFramer::GetMinGoAwayFrameSize() {
595 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
596 kQuicMaxStreamIdSize;
597}
598
599// static
600size_t QuicFramer::GetWindowUpdateFrameSize(
601 QuicTransportVersion version,
602 const QuicWindowUpdateFrame& frame) {
603 if (version != QUIC_VERSION_99) {
604 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
605 }
606 if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
607 // Frame would be a MAX DATA frame, which has only a Maximum Data field.
608 return kQuicFrameTypeSize +
609 QuicDataWriter::GetVarInt62Len(frame.byte_offset);
610 }
611 // Frame would be MAX STREAM DATA, has Maximum Stream Data and Stream ID
612 // fields.
613 return kQuicFrameTypeSize +
614 QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
615 QuicDataWriter::GetVarInt62Len(frame.stream_id);
616}
617
618// static
619size_t QuicFramer::GetMaxStreamsFrameSize(QuicTransportVersion version,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700620 const QuicMaxStreamsFrame& frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500621 if (version != QUIC_VERSION_99) {
622 QUIC_BUG << "In version " << version
fkastenholz3c4eabf2019-04-22 07:49:59 -0700623 << " - not 99 - and tried to serialize MaxStreams Frame.";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500624 }
fkastenholz3c4eabf2019-04-22 07:49:59 -0700625 return kQuicFrameTypeSize +
626 QuicDataWriter::GetVarInt62Len(frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500627}
628
629// static
630size_t QuicFramer::GetStreamsBlockedFrameSize(
631 QuicTransportVersion version,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700632 const QuicStreamsBlockedFrame& frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500633 if (version != QUIC_VERSION_99) {
634 QUIC_BUG << "In version " << version
fkastenholz3c4eabf2019-04-22 07:49:59 -0700635 << " - not 99 - and tried to serialize StreamsBlocked Frame.";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500636 }
637
fkastenholz3c4eabf2019-04-22 07:49:59 -0700638 return kQuicFrameTypeSize +
639 QuicDataWriter::GetVarInt62Len(frame.stream_count);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500640}
641
642// static
643size_t QuicFramer::GetBlockedFrameSize(QuicTransportVersion version,
644 const QuicBlockedFrame& frame) {
645 if (version != QUIC_VERSION_99) {
646 return kQuicFrameTypeSize + kQuicMaxStreamIdSize;
647 }
648 if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
649 // return size of IETF QUIC Blocked frame
650 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset);
651 }
652 // return size of IETF QUIC Stream Blocked frame.
653 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset) +
654 QuicDataWriter::GetVarInt62Len(frame.stream_id);
655}
656
657// static
658size_t QuicFramer::GetStopSendingFrameSize(const QuicStopSendingFrame& frame) {
659 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.stream_id) +
660 sizeof(QuicApplicationErrorCode);
661}
662
663// static
664size_t QuicFramer::GetPathChallengeFrameSize(
665 const QuicPathChallengeFrame& frame) {
666 return kQuicFrameTypeSize + sizeof(frame.data_buffer);
667}
668
669// static
670size_t QuicFramer::GetPathResponseFrameSize(
671 const QuicPathResponseFrame& frame) {
672 return kQuicFrameTypeSize + sizeof(frame.data_buffer);
673}
674
675// static
676size_t QuicFramer::GetRetransmittableControlFrameSize(
677 QuicTransportVersion version,
678 const QuicFrame& frame) {
679 switch (frame.type) {
680 case PING_FRAME:
681 // Ping has no payload.
682 return kQuicFrameTypeSize;
683 case RST_STREAM_FRAME:
684 return GetRstStreamFrameSize(version, *frame.rst_stream_frame);
685 case CONNECTION_CLOSE_FRAME:
fkastenholza037b8b2019-05-07 06:00:05 -0700686 return GetConnectionCloseFrameSize(version,
687 *frame.connection_close_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500688 case GOAWAY_FRAME:
689 return GetMinGoAwayFrameSize() +
690 TruncatedErrorStringSize(frame.goaway_frame->reason_phrase);
691 case WINDOW_UPDATE_FRAME:
692 // For version 99, this could be either a MAX DATA or MAX STREAM DATA.
693 // GetWindowUpdateFrameSize figures this out and returns the correct
694 // length.
695 return GetWindowUpdateFrameSize(version, *frame.window_update_frame);
696 case BLOCKED_FRAME:
697 return GetBlockedFrameSize(version, *frame.blocked_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500698 case NEW_CONNECTION_ID_FRAME:
699 return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
700 case RETIRE_CONNECTION_ID_FRAME:
701 return GetRetireConnectionIdFrameSize(*frame.retire_connection_id_frame);
702 case NEW_TOKEN_FRAME:
703 return GetNewTokenFrameSize(*frame.new_token_frame);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700704 case MAX_STREAMS_FRAME:
705 return GetMaxStreamsFrameSize(version, frame.max_streams_frame);
706 case STREAMS_BLOCKED_FRAME:
707 return GetStreamsBlockedFrameSize(version, frame.streams_blocked_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 case PATH_RESPONSE_FRAME:
709 return GetPathResponseFrameSize(*frame.path_response_frame);
710 case PATH_CHALLENGE_FRAME:
711 return GetPathChallengeFrameSize(*frame.path_challenge_frame);
712 case STOP_SENDING_FRAME:
713 return GetStopSendingFrameSize(*frame.stop_sending_frame);
714
715 case STREAM_FRAME:
716 case ACK_FRAME:
717 case STOP_WAITING_FRAME:
718 case MTU_DISCOVERY_FRAME:
719 case PADDING_FRAME:
720 case MESSAGE_FRAME:
721 case CRYPTO_FRAME:
722 case NUM_FRAME_TYPES:
723 DCHECK(false);
724 return 0;
725 }
726
727 // Not reachable, but some Chrome compilers can't figure that out. *sigh*
728 DCHECK(false);
729 return 0;
730}
731
732// static
733size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
734 // Sizes are 1 through 4 bytes.
735 for (int i = 1; i <= 4; ++i) {
736 stream_id >>= 8;
737 if (stream_id == 0) {
738 return i;
739 }
740 }
741 QUIC_BUG << "Failed to determine StreamIDSize.";
742 return 4;
743}
744
745// static
746size_t QuicFramer::GetStreamOffsetSize(QuicTransportVersion version,
747 QuicStreamOffset offset) {
748 // 0 is a special case.
749 if (offset == 0) {
750 return 0;
751 }
752 // 2 through 8 are the remaining sizes.
753 offset >>= 8;
754 for (int i = 2; i <= 8; ++i) {
755 offset >>= 8;
756 if (offset == 0) {
757 return i;
758 }
759 }
760 QUIC_BUG << "Failed to determine StreamOffsetSize.";
761 return 8;
762}
763
764// static
765size_t QuicFramer::GetNewConnectionIdFrameSize(
766 const QuicNewConnectionIdFrame& frame) {
767 return kQuicFrameTypeSize +
768 QuicDataWriter::GetVarInt62Len(frame.sequence_number) +
769 kConnectionIdLengthSize + frame.connection_id.length() +
770 sizeof(frame.stateless_reset_token);
771}
772
773// static
774size_t QuicFramer::GetRetireConnectionIdFrameSize(
775 const QuicRetireConnectionIdFrame& frame) {
776 return kQuicFrameTypeSize +
777 QuicDataWriter::GetVarInt62Len(frame.sequence_number);
778}
779
780// static
781size_t QuicFramer::GetNewTokenFrameSize(const QuicNewTokenFrame& frame) {
782 return kQuicFrameTypeSize +
783 QuicDataWriter::GetVarInt62Len(frame.token.length()) +
784 frame.token.length();
785}
786
787// TODO(nharper): Change this method to take a ParsedQuicVersion.
788bool QuicFramer::IsSupportedTransportVersion(
789 const QuicTransportVersion version) const {
790 for (ParsedQuicVersion supported_version : supported_versions_) {
791 if (version == supported_version.transport_version) {
792 return true;
793 }
794 }
795 return false;
796}
797
798bool QuicFramer::IsSupportedVersion(const ParsedQuicVersion version) const {
799 for (const ParsedQuicVersion& supported_version : supported_versions_) {
800 if (version == supported_version) {
801 return true;
802 }
803 }
804 return false;
805}
806
807size_t QuicFramer::GetSerializedFrameLength(
808 const QuicFrame& frame,
809 size_t free_bytes,
810 bool first_frame,
811 bool last_frame,
812 QuicPacketNumberLength packet_number_length) {
813 // Prevent a rare crash reported in b/19458523.
814 if (frame.type == ACK_FRAME && frame.ack_frame == nullptr) {
815 QUIC_BUG << "Cannot compute the length of a null ack frame. free_bytes:"
816 << free_bytes << " first_frame:" << first_frame
817 << " last_frame:" << last_frame
818 << " seq num length:" << packet_number_length;
819 set_error(QUIC_INTERNAL_ERROR);
820 visitor_->OnError(this);
821 return 0;
822 }
823 if (frame.type == PADDING_FRAME) {
824 if (frame.padding_frame.num_padding_bytes == -1) {
825 // Full padding to the end of the packet.
826 return free_bytes;
827 } else {
828 // Lite padding.
829 return free_bytes <
830 static_cast<size_t>(frame.padding_frame.num_padding_bytes)
831 ? free_bytes
832 : frame.padding_frame.num_padding_bytes;
833 }
834 }
835
836 size_t frame_len =
837 ComputeFrameLength(frame, last_frame, packet_number_length);
838 if (frame_len <= free_bytes) {
839 // Frame fits within packet. Note that acks may be truncated.
840 return frame_len;
841 }
842 // Only truncate the first frame in a packet, so if subsequent ones go
843 // over, stop including more frames.
844 if (!first_frame) {
845 return 0;
846 }
847 bool can_truncate =
848 frame.type == ACK_FRAME &&
849 free_bytes >= GetMinAckFrameSize(version_.transport_version,
850 PACKET_6BYTE_PACKET_NUMBER);
851 if (can_truncate) {
dschinazi66dea072019-04-09 11:41:06 -0700852 // Truncate the frame so the packet will not exceed kMaxOutgoingPacketSize.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500853 // Note that we may not use every byte of the writer in this case.
854 QUIC_DLOG(INFO) << ENDPOINT
855 << "Truncating large frame, free bytes: " << free_bytes;
856 return free_bytes;
857 }
858 return 0;
859}
860
861QuicFramer::AckFrameInfo::AckFrameInfo()
862 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {}
863
864QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default;
865
866QuicFramer::AckFrameInfo::~AckFrameInfo() {}
867
868bool QuicFramer::WriteIetfLongHeaderLength(const QuicPacketHeader& header,
869 QuicDataWriter* writer,
870 size_t length_field_offset,
871 EncryptionLevel level) {
872 if (!QuicVersionHasLongHeaderLengths(transport_version()) ||
873 !header.version_flag || length_field_offset == 0) {
874 return true;
875 }
876 if (writer->length() < length_field_offset ||
877 writer->length() - length_field_offset <
878 kQuicDefaultLongHeaderLengthLength) {
879 set_detailed_error("Invalid length_field_offset.");
880 QUIC_BUG << "Invalid length_field_offset.";
881 return false;
882 }
883 size_t length_to_write = writer->length() - length_field_offset -
884 kQuicDefaultLongHeaderLengthLength;
885 // Add length of auth tag.
886 length_to_write = GetCiphertextSize(level, length_to_write);
887
888 QuicDataWriter length_writer(writer->length() - length_field_offset,
889 writer->data() + length_field_offset);
890 if (!length_writer.WriteVarInt62(length_to_write,
891 kQuicDefaultLongHeaderLengthLength)) {
892 set_detailed_error("Failed to overwrite long header length.");
893 QUIC_BUG << "Failed to overwrite long header length.";
894 return false;
895 }
896 return true;
897}
898
899size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
900 const QuicFrames& frames,
901 char* buffer,
902 size_t packet_length,
903 EncryptionLevel level) {
904 QuicDataWriter writer(packet_length, buffer);
905 size_t length_field_offset = 0;
906 if (!AppendPacketHeader(header, &writer, &length_field_offset)) {
907 QUIC_BUG << "AppendPacketHeader failed";
908 return 0;
909 }
910
911 if (transport_version() == QUIC_VERSION_99) {
912 if (AppendIetfFrames(frames, &writer) == 0) {
913 return 0;
914 }
915 if (!WriteIetfLongHeaderLength(header, &writer, length_field_offset,
916 level)) {
917 return 0;
918 }
919 return writer.length();
920 }
921 // TODO(dschinazi) if we enable long header lengths before v99, we need to
922 // add support for fixing up lengths in QuicFramer::BuildDataPacket.
923 DCHECK(!QuicVersionHasLongHeaderLengths(transport_version()));
924
925 size_t i = 0;
926 for (const QuicFrame& frame : frames) {
927 // Determine if we should write stream frame length in header.
928 const bool last_frame_in_packet = i == frames.size() - 1;
929 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) {
930 QUIC_BUG << "AppendTypeByte failed";
931 return 0;
932 }
933
934 switch (frame.type) {
935 case PADDING_FRAME:
936 if (!AppendPaddingFrame(frame.padding_frame, &writer)) {
937 QUIC_BUG << "AppendPaddingFrame of "
938 << frame.padding_frame.num_padding_bytes << " failed";
939 return 0;
940 }
941 break;
942 case STREAM_FRAME:
943 if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
944 &writer)) {
945 QUIC_BUG << "AppendStreamFrame failed";
946 return 0;
947 }
948 break;
949 case ACK_FRAME:
950 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) {
951 QUIC_BUG << "AppendAckFrameAndTypeByte failed: " << detailed_error_;
952 return 0;
953 }
954 break;
955 case STOP_WAITING_FRAME:
956 if (!AppendStopWaitingFrame(header, frame.stop_waiting_frame,
957 &writer)) {
958 QUIC_BUG << "AppendStopWaitingFrame failed";
959 return 0;
960 }
961 break;
962 case MTU_DISCOVERY_FRAME:
963 // MTU discovery frames are serialized as ping frames.
964 QUIC_FALLTHROUGH_INTENDED;
965 case PING_FRAME:
966 // Ping has no payload.
967 break;
968 case RST_STREAM_FRAME:
969 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
970 QUIC_BUG << "AppendRstStreamFrame failed";
971 return 0;
972 }
973 break;
974 case CONNECTION_CLOSE_FRAME:
975 if (!AppendConnectionCloseFrame(*frame.connection_close_frame,
976 &writer)) {
977 QUIC_BUG << "AppendConnectionCloseFrame failed";
978 return 0;
979 }
980 break;
981 case GOAWAY_FRAME:
982 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
983 QUIC_BUG << "AppendGoAwayFrame failed";
984 return 0;
985 }
986 break;
987 case WINDOW_UPDATE_FRAME:
988 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) {
989 QUIC_BUG << "AppendWindowUpdateFrame failed";
990 return 0;
991 }
992 break;
993 case BLOCKED_FRAME:
994 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) {
995 QUIC_BUG << "AppendBlockedFrame failed";
996 return 0;
997 }
998 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500999 case NEW_CONNECTION_ID_FRAME:
1000 set_detailed_error(
1001 "Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
1002 return RaiseError(QUIC_INTERNAL_ERROR);
1003 case RETIRE_CONNECTION_ID_FRAME:
1004 set_detailed_error(
1005 "Attempt to append RETIRE_CONNECTION_ID frame and not in version "
1006 "99.");
1007 return RaiseError(QUIC_INTERNAL_ERROR);
1008 case NEW_TOKEN_FRAME:
1009 set_detailed_error(
1010 "Attempt to append NEW_TOKEN_ID frame and not in version 99.");
1011 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001012 case MAX_STREAMS_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05001013 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07001014 "Attempt to append MAX_STREAMS frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001015 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07001016 case STREAMS_BLOCKED_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05001017 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07001018 "Attempt to append STREAMS_BLOCKED frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001019 return RaiseError(QUIC_INTERNAL_ERROR);
1020 case PATH_RESPONSE_FRAME:
1021 set_detailed_error(
1022 "Attempt to append PATH_RESPONSE frame and not in version 99.");
1023 return RaiseError(QUIC_INTERNAL_ERROR);
1024 case PATH_CHALLENGE_FRAME:
1025 set_detailed_error(
1026 "Attempt to append PATH_CHALLENGE frame and not in version 99.");
1027 return RaiseError(QUIC_INTERNAL_ERROR);
1028 case STOP_SENDING_FRAME:
1029 set_detailed_error(
1030 "Attempt to append STOP_SENDING frame and not in version 99.");
1031 return RaiseError(QUIC_INTERNAL_ERROR);
1032 case MESSAGE_FRAME:
1033 if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1034 last_frame_in_packet, &writer)) {
1035 QUIC_BUG << "AppendMessageFrame failed";
1036 return 0;
1037 }
1038 break;
1039 case CRYPTO_FRAME:
QUICHE teamea740082019-03-11 17:58:43 -07001040 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001041 set_detailed_error(
1042 "Attempt to append CRYPTO frame in version prior to 47.");
1043 return RaiseError(QUIC_INTERNAL_ERROR);
1044 }
1045 if (!AppendCryptoFrame(*frame.crypto_frame, &writer)) {
1046 QUIC_BUG << "AppendCryptoFrame failed";
1047 return 0;
1048 }
1049 break;
1050 default:
1051 RaiseError(QUIC_INVALID_FRAME_DATA);
1052 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
1053 return 0;
1054 }
1055 ++i;
1056 }
1057
1058 return writer.length();
1059}
1060
1061size_t QuicFramer::AppendIetfFrames(const QuicFrames& frames,
1062 QuicDataWriter* writer) {
1063 size_t i = 0;
1064 for (const QuicFrame& frame : frames) {
1065 // Determine if we should write stream frame length in header.
1066 const bool last_frame_in_packet = i == frames.size() - 1;
1067 if (!AppendIetfTypeByte(frame, last_frame_in_packet, writer)) {
1068 QUIC_BUG << "AppendIetfTypeByte failed: " << detailed_error();
1069 return 0;
1070 }
1071
1072 switch (frame.type) {
1073 case PADDING_FRAME:
1074 if (!AppendPaddingFrame(frame.padding_frame, writer)) {
1075 QUIC_BUG << "AppendPaddingFrame of "
1076 << frame.padding_frame.num_padding_bytes
1077 << " failed: " << detailed_error();
1078 return 0;
1079 }
1080 break;
1081 case STREAM_FRAME:
1082 if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
1083 writer)) {
1084 QUIC_BUG << "AppendStreamFrame failed: " << detailed_error();
1085 return 0;
1086 }
1087 break;
1088 case ACK_FRAME:
1089 if (!AppendIetfAckFrameAndTypeByte(*frame.ack_frame, writer)) {
QUICHE team4fe0b942019-03-08 09:25:06 -05001090 QUIC_BUG << "AppendIetfAckFrameAndTypeByte failed: "
1091 << detailed_error();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001092 return 0;
1093 }
1094 break;
1095 case STOP_WAITING_FRAME:
1096 set_detailed_error(
1097 "Attempt to append STOP WAITING frame in version 99.");
1098 return RaiseError(QUIC_INTERNAL_ERROR);
1099 case MTU_DISCOVERY_FRAME:
1100 // MTU discovery frames are serialized as ping frames.
1101 QUIC_FALLTHROUGH_INTENDED;
1102 case PING_FRAME:
1103 // Ping has no payload.
1104 break;
1105 case RST_STREAM_FRAME:
1106 if (!AppendRstStreamFrame(*frame.rst_stream_frame, writer)) {
1107 QUIC_BUG << "AppendRstStreamFrame failed: " << detailed_error();
1108 return 0;
1109 }
1110 break;
1111 case CONNECTION_CLOSE_FRAME:
fkastenholz72f509b2019-04-10 09:17:49 -07001112 if (!AppendIetfConnectionCloseFrame(*frame.connection_close_frame,
1113 writer)) {
1114 QUIC_BUG << "AppendIetfConnectionCloseFrame failed: "
1115 << detailed_error();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001116 return 0;
1117 }
1118 break;
1119 case GOAWAY_FRAME:
1120 set_detailed_error("Attempt to append GOAWAY frame in version 99.");
1121 return RaiseError(QUIC_INTERNAL_ERROR);
1122 case WINDOW_UPDATE_FRAME:
1123 // Depending on whether there is a stream ID or not, will be either a
1124 // MAX STREAM DATA frame or a MAX DATA frame.
1125 if (frame.window_update_frame->stream_id ==
1126 QuicUtils::GetInvalidStreamId(transport_version())) {
1127 if (!AppendMaxDataFrame(*frame.window_update_frame, writer)) {
1128 QUIC_BUG << "AppendMaxDataFrame failed: " << detailed_error();
1129 return 0;
1130 }
1131 } else {
1132 if (!AppendMaxStreamDataFrame(*frame.window_update_frame, writer)) {
1133 QUIC_BUG << "AppendMaxStreamDataFrame failed: " << detailed_error();
1134 return 0;
1135 }
1136 }
1137 break;
1138 case BLOCKED_FRAME:
1139 if (!AppendBlockedFrame(*frame.blocked_frame, writer)) {
1140 QUIC_BUG << "AppendBlockedFrame failed: " << detailed_error();
1141 return 0;
1142 }
1143 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07001144 case MAX_STREAMS_FRAME:
1145 if (!AppendMaxStreamsFrame(frame.max_streams_frame, writer)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001146 QUIC_BUG << "AppendMaxStreamsFrame failed" << detailed_error();
1147 return 0;
1148 }
1149 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07001150 case STREAMS_BLOCKED_FRAME:
1151 if (!AppendStreamsBlockedFrame(frame.streams_blocked_frame, writer)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001152 QUIC_BUG << "AppendStreamsBlockedFrame failed" << detailed_error();
1153 return 0;
1154 }
1155 break;
1156 case NEW_CONNECTION_ID_FRAME:
1157 if (!AppendNewConnectionIdFrame(*frame.new_connection_id_frame,
1158 writer)) {
1159 QUIC_BUG << "AppendNewConnectionIdFrame failed: " << detailed_error();
1160 return 0;
1161 }
1162 break;
1163 case RETIRE_CONNECTION_ID_FRAME:
1164 if (!AppendRetireConnectionIdFrame(*frame.retire_connection_id_frame,
1165 writer)) {
1166 QUIC_BUG << "AppendRetireConnectionIdFrame failed: "
1167 << detailed_error();
1168 return 0;
1169 }
1170 break;
1171 case NEW_TOKEN_FRAME:
1172 if (!AppendNewTokenFrame(*frame.new_token_frame, writer)) {
1173 QUIC_BUG << "AppendNewTokenFrame failed: " << detailed_error();
1174 return 0;
1175 }
1176 break;
1177 case STOP_SENDING_FRAME:
1178 if (!AppendStopSendingFrame(*frame.stop_sending_frame, writer)) {
1179 QUIC_BUG << "AppendStopSendingFrame failed: " << detailed_error();
1180 return 0;
1181 }
1182 break;
1183 case PATH_CHALLENGE_FRAME:
1184 if (!AppendPathChallengeFrame(*frame.path_challenge_frame, writer)) {
1185 QUIC_BUG << "AppendPathChallengeFrame failed: " << detailed_error();
1186 return 0;
1187 }
1188 break;
1189 case PATH_RESPONSE_FRAME:
1190 if (!AppendPathResponseFrame(*frame.path_response_frame, writer)) {
1191 QUIC_BUG << "AppendPathResponseFrame failed: " << detailed_error();
1192 return 0;
1193 }
1194 break;
1195 case MESSAGE_FRAME:
1196 if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1197 last_frame_in_packet, writer)) {
1198 QUIC_BUG << "AppendMessageFrame failed: " << detailed_error();
1199 return 0;
1200 }
1201 break;
1202 case CRYPTO_FRAME:
1203 if (!AppendCryptoFrame(*frame.crypto_frame, writer)) {
1204 QUIC_BUG << "AppendCryptoFrame failed: " << detailed_error();
1205 return 0;
1206 }
1207 break;
1208 default:
1209 RaiseError(QUIC_INVALID_FRAME_DATA);
1210 set_detailed_error("Tried to append unknown frame type.");
1211 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
1212 return 0;
1213 }
1214 ++i;
1215 }
1216
1217 return writer->length();
1218}
1219
rch67cb9df2019-03-26 16:52:07 -07001220size_t QuicFramer::BuildConnectivityProbingPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05001221 const QuicPacketHeader& header,
1222 char* buffer,
1223 size_t packet_length,
1224 EncryptionLevel level) {
1225 QuicFrames frames;
1226
1227 // Write a PING frame, which has no data payload.
1228 QuicPingFrame ping_frame;
1229 frames.push_back(QuicFrame(ping_frame));
1230
1231 // Add padding to the rest of the packet.
1232 QuicPaddingFrame padding_frame;
1233 frames.push_back(QuicFrame(padding_frame));
1234
1235 return BuildDataPacket(header, frames, buffer, packet_length, level);
1236}
1237
QUICHE teama6ef0a62019-03-07 20:34:33 -05001238size_t QuicFramer::BuildPaddedPathChallengePacket(
1239 const QuicPacketHeader& header,
1240 char* buffer,
1241 size_t packet_length,
1242 QuicPathFrameBuffer* payload,
1243 QuicRandom* randomizer,
1244 EncryptionLevel level) {
1245 if (version_.transport_version != QUIC_VERSION_99) {
1246 QUIC_BUG << "Attempt to build a PATH_CHALLENGE Connectivity Probing "
1247 "packet and not doing IETF QUIC";
1248 return 0;
1249 }
1250 QuicFrames frames;
1251
1252 // Write a PATH_CHALLENGE frame, which has a random 8-byte payload
1253 randomizer->RandBytes(payload->data(), payload->size());
1254
1255 QuicPathChallengeFrame path_challenge_frame(0, *payload);
1256 frames.push_back(QuicFrame(&path_challenge_frame));
1257
1258 // Add padding to the rest of the packet in order to assess Path MTU
1259 // characteristics.
1260 QuicPaddingFrame padding_frame;
1261 frames.push_back(QuicFrame(padding_frame));
1262
1263 return BuildDataPacket(header, frames, buffer, packet_length, level);
1264}
1265
1266size_t QuicFramer::BuildPathResponsePacket(
1267 const QuicPacketHeader& header,
1268 char* buffer,
1269 size_t packet_length,
1270 const QuicDeque<QuicPathFrameBuffer>& payloads,
1271 const bool is_padded,
1272 EncryptionLevel level) {
1273 if (payloads.empty()) {
1274 QUIC_BUG
1275 << "Attempt to generate connectivity response with no request payloads";
1276 return 0;
1277 }
1278 if (version_.transport_version != QUIC_VERSION_99) {
1279 QUIC_BUG << "Attempt to build a PATH_RESPONSE Connectivity Probing "
1280 "packet and not doing IETF QUIC";
1281 return 0;
1282 }
1283
1284 std::vector<std::unique_ptr<QuicPathResponseFrame>> path_response_frames;
1285 for (const QuicPathFrameBuffer& payload : payloads) {
1286 // Note that the control frame ID can be 0 since this is not retransmitted.
1287 path_response_frames.push_back(
1288 QuicMakeUnique<QuicPathResponseFrame>(0, payload));
1289 }
1290
1291 QuicFrames frames;
1292 for (const std::unique_ptr<QuicPathResponseFrame>& path_response_frame :
1293 path_response_frames) {
1294 frames.push_back(QuicFrame(path_response_frame.get()));
1295 }
1296
1297 if (is_padded) {
1298 // Add padding to the rest of the packet in order to assess Path MTU
1299 // characteristics.
1300 QuicPaddingFrame padding_frame;
1301 frames.push_back(QuicFrame(padding_frame));
1302 }
1303
1304 return BuildDataPacket(header, frames, buffer, packet_length, level);
1305}
1306
1307// static
1308std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
1309 const QuicPublicResetPacket& packet) {
1310 CryptoHandshakeMessage reset;
1311 reset.set_tag(kPRST);
1312 reset.SetValue(kRNON, packet.nonce_proof);
1313 if (packet.client_address.host().address_family() !=
1314 IpAddressFamily::IP_UNSPEC) {
1315 // packet.client_address is non-empty.
1316 QuicSocketAddressCoder address_coder(packet.client_address);
vasilvvc48c8712019-03-11 13:38:16 -07001317 std::string serialized_address = address_coder.Encode();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001318 if (serialized_address.empty()) {
1319 return nullptr;
1320 }
1321 reset.SetStringPiece(kCADR, serialized_address);
1322 }
1323 if (!packet.endpoint_id.empty()) {
1324 reset.SetStringPiece(kEPID, packet.endpoint_id);
1325 }
1326 const QuicData& reset_serialized = reset.GetSerialized();
1327
1328 size_t len = kPublicFlagsSize + packet.connection_id.length() +
1329 reset_serialized.length();
1330 std::unique_ptr<char[]> buffer(new char[len]);
1331 // Endianness is not a concern here, as writer is not going to write integers
1332 // or floating numbers.
1333 QuicDataWriter writer(len, buffer.get());
1334
1335 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
1336 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
1337 // This hack makes post-v33 public reset packet look like pre-v33 packets.
1338 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1339 if (!writer.WriteUInt8(flags)) {
1340 return nullptr;
1341 }
1342
1343 if (!writer.WriteConnectionId(packet.connection_id)) {
1344 return nullptr;
1345 }
1346
1347 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
1348 return nullptr;
1349 }
1350
1351 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1352}
1353
1354// static
1355std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildIetfStatelessResetPacket(
1356 QuicConnectionId connection_id,
1357 QuicUint128 stateless_reset_token) {
1358 QUIC_DVLOG(1) << "Building IETF stateless reset packet.";
1359 size_t len = kPacketHeaderTypeSize + kMinRandomBytesLengthInStatelessReset +
1360 sizeof(stateless_reset_token);
1361 std::unique_ptr<char[]> buffer(new char[len]);
1362 QuicDataWriter writer(len, buffer.get());
1363
1364 uint8_t type = 0;
1365 type |= FLAGS_FIXED_BIT;
1366 type |= FLAGS_SHORT_HEADER_RESERVED_1;
1367 type |= FLAGS_SHORT_HEADER_RESERVED_2;
1368 type |= PacketNumberLengthToOnWireValue(QUIC_VERSION_UNSUPPORTED,
1369 PACKET_1BYTE_PACKET_NUMBER);
1370
1371 // Append type byte.
1372 if (!writer.WriteUInt8(type)) {
1373 return nullptr;
1374 }
1375 // Append random bytes.
1376 if (!writer.WriteRandomBytes(QuicRandom::GetInstance(),
1377 kMinRandomBytesLengthInStatelessReset)) {
1378 return nullptr;
1379 }
1380
1381 // Append stateless reset token.
1382 if (!writer.WriteBytes(&stateless_reset_token,
1383 sizeof(stateless_reset_token))) {
1384 return nullptr;
1385 }
1386 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1387}
1388
1389// static
1390std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
dschinazi8ff74822019-05-28 16:37:20 -07001391 QuicConnectionId server_connection_id,
dschinazib417d602019-05-29 13:08:45 -07001392 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001393 bool ietf_quic,
1394 const ParsedQuicVersionVector& versions) {
1395 if (ietf_quic) {
dschinazib417d602019-05-29 13:08:45 -07001396 return BuildIetfVersionNegotiationPacket(server_connection_id,
1397 client_connection_id, versions);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001398 }
dschinazib417d602019-05-29 13:08:45 -07001399
1400 // The GQUIC encoding does not support encoding client connection IDs.
1401 DCHECK(client_connection_id.IsEmpty());
1402
QUICHE teama6ef0a62019-03-07 20:34:33 -05001403 DCHECK(!versions.empty());
dschinazi8ff74822019-05-28 16:37:20 -07001404 size_t len = kPublicFlagsSize + server_connection_id.length() +
QUICHE teama6ef0a62019-03-07 20:34:33 -05001405 versions.size() * kQuicVersionSize;
1406 std::unique_ptr<char[]> buffer(new char[len]);
1407 // Endianness is not a concern here, version negotiation packet does not have
1408 // integers or floating numbers.
1409 QuicDataWriter writer(len, buffer.get());
1410
1411 uint8_t flags = static_cast<uint8_t>(
1412 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
1413 // TODO(rch): Remove this QUIC_VERSION_32 is retired.
1414 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1415 if (!writer.WriteUInt8(flags)) {
1416 return nullptr;
1417 }
1418
dschinazi8ff74822019-05-28 16:37:20 -07001419 if (!writer.WriteConnectionId(server_connection_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001420 return nullptr;
1421 }
1422
1423 for (const ParsedQuicVersion& version : versions) {
1424 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
1425 if (!writer.WriteTag(
1426 QuicEndian::HostToNet32(CreateQuicVersionLabel(version)))) {
1427 return nullptr;
1428 }
1429 }
1430
1431 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1432}
1433
1434// static
1435std::unique_ptr<QuicEncryptedPacket>
1436QuicFramer::BuildIetfVersionNegotiationPacket(
dschinazib417d602019-05-29 13:08:45 -07001437 QuicConnectionId server_connection_id,
1438 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001439 const ParsedQuicVersionVector& versions) {
dschinazi5a354c92019-05-09 12:18:53 -07001440 QUIC_DVLOG(1) << "Building IETF version negotiation packet: "
1441 << ParsedQuicVersionVectorToString(versions);
dschinazib417d602019-05-29 13:08:45 -07001442 DCHECK(client_connection_id.IsEmpty() ||
1443 GetQuicRestartFlag(quic_do_not_override_connection_id));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001444 DCHECK(!versions.empty());
1445 size_t len = kPacketHeaderTypeSize + kConnectionIdLengthSize +
dschinazib417d602019-05-29 13:08:45 -07001446 client_connection_id.length() + server_connection_id.length() +
QUICHE teama6ef0a62019-03-07 20:34:33 -05001447 (versions.size() + 1) * kQuicVersionSize;
1448 std::unique_ptr<char[]> buffer(new char[len]);
1449 QuicDataWriter writer(len, buffer.get());
1450
1451 // TODO(fayang): Randomly select a value for the type.
dschinazi072da7c2019-05-07 17:57:42 -07001452 uint8_t type = static_cast<uint8_t>(FLAGS_LONG_HEADER);
dschinazi9e92fb32019-05-08 14:47:24 -07001453 if (GetQuicReloadableFlag(quic_send_version_negotiation_fixed_bit)) {
1454 QUIC_RELOADABLE_FLAG_COUNT(quic_send_version_negotiation_fixed_bit);
1455 type |= static_cast<uint8_t>(FLAGS_FIXED_BIT);
1456 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001457 if (!writer.WriteUInt8(type)) {
1458 return nullptr;
1459 }
1460
1461 if (!writer.WriteUInt32(0)) {
1462 return nullptr;
1463 }
1464
dschinazib417d602019-05-29 13:08:45 -07001465 if (!AppendIetfConnectionIds(true, client_connection_id, server_connection_id,
1466 &writer)) {
dschinazi1f485a12019-05-13 11:57:01 -07001467 return nullptr;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001468 }
1469
1470 for (const ParsedQuicVersion& version : versions) {
1471 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
1472 if (!writer.WriteTag(
1473 QuicEndian::HostToNet32(CreateQuicVersionLabel(version)))) {
1474 return nullptr;
1475 }
1476 }
1477
1478 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1479}
1480
1481bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
1482 QuicDataReader reader(packet.data(), packet.length());
1483
1484 bool packet_has_ietf_packet_header = false;
1485 if (infer_packet_header_type_from_version_) {
1486 packet_has_ietf_packet_header =
1487 version_.transport_version > QUIC_VERSION_43;
1488 } else if (!reader.IsDoneReading()) {
1489 uint8_t type = reader.PeekByte();
1490 packet_has_ietf_packet_header = QuicUtils::IsIetfPacketHeader(type);
1491 }
1492 if (packet_has_ietf_packet_header) {
1493 QUIC_DVLOG(1) << ENDPOINT << "Processing IETF QUIC packet.";
1494 }
1495
1496 visitor_->OnPacket();
1497
1498 QuicPacketHeader header;
1499 if (!ProcessPublicHeader(&reader, packet_has_ietf_packet_header, &header)) {
1500 DCHECK_NE("", detailed_error_);
1501 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: "
1502 << detailed_error_;
1503 DCHECK_NE("", detailed_error_);
1504 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_HEADER);
1505 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1506 }
1507
1508 if (!visitor_->OnUnauthenticatedPublicHeader(header)) {
1509 // The visitor suppresses further processing of the packet.
1510 return true;
1511 }
1512
dschinazie0df3f72019-05-06 16:37:51 -07001513 if (IsVersionNegotiation(header, packet_has_ietf_packet_header)) {
dschinazi072da7c2019-05-07 17:57:42 -07001514 if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) {
1515 QUIC_DVLOG(1) << ENDPOINT << "Received version negotiation packet";
1516 return ProcessVersionNegotiationPacket(&reader, header);
1517 }
1518 QUIC_RESTART_FLAG_COUNT_N(quic_server_drop_version_negotiation, 1, 2);
1519 if (perspective_ == Perspective::IS_CLIENT) {
1520 QUIC_DVLOG(1) << "Client received version negotiation packet";
1521 return ProcessVersionNegotiationPacket(&reader, header);
1522 } else {
1523 QUIC_DLOG(ERROR) << "Server received version negotiation packet";
1524 set_detailed_error("Server received version negotiation packet.");
1525 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1526 }
dschinazie0df3f72019-05-06 16:37:51 -07001527 }
1528
1529 if (header.version_flag && header.version != version_) {
1530 if (perspective_ == Perspective::IS_SERVER) {
1531 if (!visitor_->OnProtocolVersionMismatch(header.version, header.form)) {
1532 RecordDroppedPacketReason(DroppedPacketReason::VERSION_MISMATCH);
1533 return true;
1534 }
1535 } else {
1536 // A client received a packet of a different version but that packet is
1537 // not a version negotiation packet. It is therefore invalid and dropped.
1538 QUIC_DLOG(ERROR) << "Client received unexpected version "
1539 << ParsedQuicVersionToString(header.version)
1540 << " instead of " << ParsedQuicVersionToString(version_);
1541 set_detailed_error("Client received unexpected version.");
1542 return RaiseError(QUIC_INVALID_VERSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001543 }
1544 }
1545
1546 bool rv;
dschinazie0df3f72019-05-06 16:37:51 -07001547 if (header.long_packet_type == RETRY) {
dschinazi244f6dc2019-05-06 15:45:16 -07001548 rv = ProcessRetryPacket(&reader, header);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001549 } else if (header.reset_flag) {
1550 rv = ProcessPublicResetPacket(&reader, header);
dschinazie8d7fa72019-04-05 14:44:40 -07001551 } else if (packet.length() <= kMaxIncomingPacketSize) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001552 // The optimized decryption algorithm implementations run faster when
1553 // operating on aligned memory.
dschinazie8d7fa72019-04-05 14:44:40 -07001554 QUIC_CACHELINE_ALIGNED char buffer[kMaxIncomingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001555 if (packet_has_ietf_packet_header) {
1556 rv = ProcessIetfDataPacket(&reader, &header, packet, buffer,
dschinazie8d7fa72019-04-05 14:44:40 -07001557 QUIC_ARRAYSIZE(buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001558 } else {
dschinazie8d7fa72019-04-05 14:44:40 -07001559 rv = ProcessDataPacket(&reader, &header, packet, buffer,
1560 QUIC_ARRAYSIZE(buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001561 }
1562 } else {
1563 std::unique_ptr<char[]> large_buffer(new char[packet.length()]);
1564 if (packet_has_ietf_packet_header) {
1565 rv = ProcessIetfDataPacket(&reader, &header, packet, large_buffer.get(),
1566 packet.length());
1567 } else {
1568 rv = ProcessDataPacket(&reader, &header, packet, large_buffer.get(),
1569 packet.length());
1570 }
1571 QUIC_BUG_IF(rv) << "QUIC should never successfully process packets larger"
dschinazie8d7fa72019-04-05 14:44:40 -07001572 << "than kMaxIncomingPacketSize. packet size:"
1573 << packet.length();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001574 }
1575 return rv;
1576}
1577
1578bool QuicFramer::ProcessVersionNegotiationPacket(
1579 QuicDataReader* reader,
1580 const QuicPacketHeader& header) {
1581 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1582
QUICHE team2252b702019-05-14 23:55:14 -04001583 QuicVersionNegotiationPacket packet(
1584 GetServerConnectionIdAsRecipient(header, perspective_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001585 // Try reading at least once to raise error if the packet is invalid.
1586 do {
1587 QuicVersionLabel version_label;
fayang40315542019-05-09 09:19:09 -07001588 if (!ProcessVersionLabel(reader, &version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001589 set_detailed_error("Unable to read supported version in negotiation.");
1590 RecordDroppedPacketReason(
1591 DroppedPacketReason::INVALID_VERSION_NEGOTIATION_PACKET);
1592 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1593 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001594 packet.versions.push_back(ParseQuicVersionLabel(version_label));
1595 } while (!reader->IsDoneReading());
1596
dschinazi5a354c92019-05-09 12:18:53 -07001597 QUIC_DLOG(INFO) << ENDPOINT << "parsed version negotiation: "
1598 << ParsedQuicVersionVectorToString(packet.versions);
1599
QUICHE teama6ef0a62019-03-07 20:34:33 -05001600 visitor_->OnVersionNegotiationPacket(packet);
1601 return true;
1602}
1603
dschinazi244f6dc2019-05-06 15:45:16 -07001604bool QuicFramer::ProcessRetryPacket(QuicDataReader* reader,
1605 const QuicPacketHeader& header) {
1606 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1607
1608 // Parse Original Destination Connection ID Length.
1609 uint8_t odcil = header.type_byte & 0xf;
1610 if (odcil != 0) {
1611 odcil += kConnectionIdLengthAdjustment;
1612 }
1613
1614 // Parse Original Destination Connection ID.
1615 QuicConnectionId original_destination_connection_id;
1616 if (!reader->ReadConnectionId(&original_destination_connection_id, odcil)) {
1617 set_detailed_error("Unable to read Original Destination ConnectionId.");
1618 return false;
1619 }
1620
1621 QuicStringPiece retry_token = reader->ReadRemainingPayload();
1622 visitor_->OnRetryPacket(original_destination_connection_id,
1623 header.source_connection_id, retry_token);
1624 return true;
1625}
1626
QUICHE teama6ef0a62019-03-07 20:34:33 -05001627bool QuicFramer::MaybeProcessIetfInitialRetryToken(
1628 QuicDataReader* encrypted_reader,
1629 QuicPacketHeader* header) {
1630 if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1631 header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1632 header->long_packet_type != INITIAL) {
1633 return true;
1634 }
1635 uint64_t retry_token_length = 0;
1636 header->retry_token_length_length = encrypted_reader->PeekVarInt62Length();
1637 if (!encrypted_reader->ReadVarInt62(&retry_token_length)) {
1638 set_detailed_error("Unable to read INITIAL retry token length.");
1639 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1640 }
1641 header->retry_token = encrypted_reader->PeekRemainingPayload();
1642 // Safety check to avoid spending ressources if malformed.
1643 // At this point header->retry_token contains the rest of the packet
1644 // so its length() is the amount of data remaining in the packet.
1645 if (retry_token_length > header->retry_token.length()) {
1646 set_detailed_error("INITIAL token length longer than packet.");
1647 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1648 }
1649 // Resize retry_token to make it only contain the retry token.
1650 header->retry_token.remove_suffix(header->retry_token.length() -
1651 retry_token_length);
1652 // Advance encrypted_reader by retry_token_length.
1653 uint8_t wasted_byte;
1654 for (uint64_t i = 0; i < retry_token_length; ++i) {
1655 if (!encrypted_reader->ReadUInt8(&wasted_byte)) {
1656 set_detailed_error("Unable to read INITIAL retry token.");
1657 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1658 }
1659 }
1660 return true;
1661}
1662
1663// Seeks the current packet to check for a coalesced packet at the end.
1664// If the IETF length field only spans part of the outer packet,
1665// then there is a coalesced packet after this one.
1666void QuicFramer::MaybeProcessCoalescedPacket(
1667 const QuicDataReader& encrypted_reader,
1668 uint64_t remaining_bytes_length,
1669 const QuicPacketHeader& header) {
1670 if (header.remaining_packet_length >= remaining_bytes_length) {
1671 // There is no coalesced packet.
1672 return;
1673 }
1674
1675 QuicStringPiece remaining_data = encrypted_reader.PeekRemainingPayload();
1676 DCHECK_EQ(remaining_data.length(), remaining_bytes_length);
1677
1678 const char* coalesced_data =
1679 remaining_data.data() + header.remaining_packet_length;
1680 uint64_t coalesced_data_length =
1681 remaining_bytes_length - header.remaining_packet_length;
1682 QuicDataReader coalesced_reader(coalesced_data, coalesced_data_length);
1683
1684 QuicPacketHeader coalesced_header;
1685 if (!ProcessIetfPacketHeader(&coalesced_reader, &coalesced_header)) {
1686 QUIC_PEER_BUG << ENDPOINT
1687 << "Failed to parse received coalesced header of length "
1688 << coalesced_data_length << ": "
1689 << QuicTextUtils::HexEncode(coalesced_data,
1690 coalesced_data_length)
1691 << " previous header was " << header;
1692 return;
1693 }
1694
1695 if (coalesced_header.destination_connection_id !=
1696 header.destination_connection_id ||
1697 (coalesced_header.form != IETF_QUIC_SHORT_HEADER_PACKET &&
1698 coalesced_header.version != header.version)) {
1699 QUIC_PEER_BUG << ENDPOINT << "Received mismatched coalesced header "
1700 << coalesced_header << " previous header was " << header;
1701 return;
1702 }
1703
1704 QuicEncryptedPacket coalesced_packet(coalesced_data, coalesced_data_length,
1705 /*owns_buffer=*/false);
1706 visitor_->OnCoalescedPacket(coalesced_packet);
1707}
1708
1709bool QuicFramer::MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
1710 QuicPacketHeader* header) {
1711 if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1712 header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1713 (header->long_packet_type != INITIAL &&
1714 header->long_packet_type != HANDSHAKE &&
1715 header->long_packet_type != ZERO_RTT_PROTECTED)) {
1716 return true;
1717 }
1718 header->length_length = encrypted_reader->PeekVarInt62Length();
1719 if (!encrypted_reader->ReadVarInt62(&header->remaining_packet_length)) {
1720 set_detailed_error("Unable to read long header payload length.");
1721 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1722 }
1723 uint64_t remaining_bytes_length = encrypted_reader->BytesRemaining();
1724 if (header->remaining_packet_length > remaining_bytes_length) {
1725 set_detailed_error("Long header payload length longer than packet.");
1726 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1727 }
1728
1729 MaybeProcessCoalescedPacket(*encrypted_reader, remaining_bytes_length,
1730 *header);
1731
1732 if (!encrypted_reader->TruncateRemaining(header->remaining_packet_length)) {
1733 set_detailed_error("Length TruncateRemaining failed.");
1734 QUIC_BUG << "Length TruncateRemaining failed.";
1735 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1736 }
1737 return true;
1738}
1739
1740bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
1741 QuicPacketHeader* header,
1742 const QuicEncryptedPacket& packet,
1743 char* decrypted_buffer,
1744 size_t buffer_length) {
1745 DCHECK_NE(GOOGLE_QUIC_PACKET, header->form);
1746 DCHECK(!header->has_possible_stateless_reset_token);
1747 header->retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
1748 header->retry_token = QuicStringPiece();
1749 header->length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
1750 header->remaining_packet_length = 0;
1751 if (header->form == IETF_QUIC_SHORT_HEADER_PACKET &&
1752 perspective_ == Perspective::IS_CLIENT) {
1753 // Peek possible stateless reset token. Will only be used on decryption
1754 // failure.
1755 QuicStringPiece remaining = encrypted_reader->PeekRemainingPayload();
1756 if (remaining.length() >= sizeof(header->possible_stateless_reset_token)) {
1757 header->has_possible_stateless_reset_token = true;
1758 memcpy(&header->possible_stateless_reset_token,
1759 &remaining.data()[remaining.length() -
1760 sizeof(header->possible_stateless_reset_token)],
1761 sizeof(header->possible_stateless_reset_token));
1762 }
1763 }
1764
1765 if (!MaybeProcessIetfInitialRetryToken(encrypted_reader, header)) {
1766 return false;
1767 }
1768
1769 if (!MaybeProcessIetfLength(encrypted_reader, header)) {
1770 return false;
1771 }
1772
nharper55fa6132019-05-07 19:37:21 -07001773 QuicStringPiece associated_data;
1774 std::vector<char> ad_storage;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001775 if (header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1776 header->long_packet_type != VERSION_NEGOTIATION) {
dschinazi072da7c2019-05-07 17:57:42 -07001777 DCHECK(header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1778 header->long_packet_type == INITIAL ||
1779 header->long_packet_type == HANDSHAKE ||
1780 header->long_packet_type == ZERO_RTT_PROTECTED);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001781 // Process packet number.
QUICHE team10b22a12019-03-21 15:31:42 -07001782 QuicPacketNumber base_packet_number;
1783 if (supports_multiple_packet_number_spaces_) {
nharper55fa6132019-05-07 19:37:21 -07001784 PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
1785 if (pn_space == NUM_PACKET_NUMBER_SPACES) {
1786 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1787 }
1788 base_packet_number = largest_decrypted_packet_numbers_[pn_space];
QUICHE team10b22a12019-03-21 15:31:42 -07001789 } else {
1790 base_packet_number = largest_packet_number_;
1791 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001792 uint64_t full_packet_number;
nharper55fa6132019-05-07 19:37:21 -07001793 bool hp_removal_failed = false;
1794 if (version_.HasHeaderProtection()) {
1795 if (!RemoveHeaderProtection(encrypted_reader, packet, header,
1796 &full_packet_number, &ad_storage)) {
1797 hp_removal_failed = true;
1798 }
1799 associated_data = QuicStringPiece(ad_storage.data(), ad_storage.size());
1800 } else if (!ProcessAndCalculatePacketNumber(
1801 encrypted_reader, header->packet_number_length,
1802 base_packet_number, &full_packet_number)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001803 set_detailed_error("Unable to read packet number.");
1804 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1805 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1806 }
1807
nharper55fa6132019-05-07 19:37:21 -07001808 if (hp_removal_failed ||
1809 !IsValidFullPacketNumber(full_packet_number, transport_version())) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001810 if (IsIetfStatelessResetPacket(*header)) {
1811 // This is a stateless reset packet.
1812 QuicIetfStatelessResetPacket packet(
1813 *header, header->possible_stateless_reset_token);
1814 visitor_->OnAuthenticatedIetfStatelessResetPacket(packet);
1815 return true;
1816 }
nharper55fa6132019-05-07 19:37:21 -07001817 if (hp_removal_failed) {
1818 set_detailed_error("Unable to decrypt header protection.");
1819 return RaiseError(QUIC_DECRYPTION_FAILURE);
1820 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001821 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1822 set_detailed_error("packet numbers cannot be 0.");
1823 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1824 }
1825 header->packet_number = QuicPacketNumber(full_packet_number);
1826 }
1827
1828 // A nonce should only present in SHLO from the server to the client when
1829 // using QUIC crypto.
1830 if (header->form == IETF_QUIC_LONG_HEADER_PACKET &&
1831 header->long_packet_type == ZERO_RTT_PROTECTED &&
1832 perspective_ == Perspective::IS_CLIENT &&
1833 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
1834 if (!encrypted_reader->ReadBytes(
1835 reinterpret_cast<uint8_t*>(last_nonce_.data()),
1836 last_nonce_.size())) {
1837 set_detailed_error("Unable to read nonce.");
1838 RecordDroppedPacketReason(
1839 DroppedPacketReason::INVALID_DIVERSIFICATION_NONCE);
1840 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1841 }
1842
1843 header->nonce = &last_nonce_;
1844 } else {
1845 header->nonce = nullptr;
1846 }
1847
1848 if (!visitor_->OnUnauthenticatedHeader(*header)) {
1849 set_detailed_error(
1850 "Visitor asked to stop processing of unauthenticated header.");
1851 return false;
1852 }
1853
1854 QuicStringPiece encrypted = encrypted_reader->ReadRemainingPayload();
nharper55fa6132019-05-07 19:37:21 -07001855 if (!version_.HasHeaderProtection()) {
1856 associated_data = GetAssociatedDataFromEncryptedPacket(
1857 version_.transport_version, packet,
1858 GetIncludedDestinationConnectionIdLength(*header),
1859 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1860 header->nonce != nullptr, header->packet_number_length,
1861 header->retry_token_length_length, header->retry_token.length(),
1862 header->length_length);
1863 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001864
1865 size_t decrypted_length = 0;
QUICHE team10b22a12019-03-21 15:31:42 -07001866 EncryptionLevel decrypted_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001867 if (!DecryptPayload(encrypted, associated_data, *header, decrypted_buffer,
QUICHE team10b22a12019-03-21 15:31:42 -07001868 buffer_length, &decrypted_length, &decrypted_level)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001869 if (IsIetfStatelessResetPacket(*header)) {
1870 // This is a stateless reset packet.
1871 QuicIetfStatelessResetPacket packet(
1872 *header, header->possible_stateless_reset_token);
1873 visitor_->OnAuthenticatedIetfStatelessResetPacket(packet);
1874 return true;
1875 }
1876 set_detailed_error("Unable to decrypt payload.");
1877 RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1878 return RaiseError(QUIC_DECRYPTION_FAILURE);
1879 }
1880 QuicDataReader reader(decrypted_buffer, decrypted_length);
1881
1882 // Update the largest packet number after we have decrypted the packet
1883 // so we are confident is not attacker controlled.
QUICHE team10b22a12019-03-21 15:31:42 -07001884 if (supports_multiple_packet_number_spaces_) {
1885 largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1886 decrypted_level)]
1887 .UpdateMax(header->packet_number);
1888 } else {
1889 largest_packet_number_.UpdateMax(header->packet_number);
1890 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001891
1892 if (!visitor_->OnPacketHeader(*header)) {
1893 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1894 // The visitor suppresses further processing of the packet.
1895 return true;
1896 }
1897
dschinazie8d7fa72019-04-05 14:44:40 -07001898 if (packet.length() > kMaxIncomingPacketSize) {
1899 set_detailed_error("Packet too large.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001900 return RaiseError(QUIC_PACKET_TOO_LARGE);
1901 }
1902
1903 // Handle the payload.
1904 if (version_.transport_version == QUIC_VERSION_99) {
1905 if (!ProcessIetfFrameData(&reader, *header)) {
1906 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessIetfFrameData sets the error.
1907 DCHECK_NE("", detailed_error_);
1908 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1909 << detailed_error_;
1910 return false;
1911 }
1912 } else {
1913 if (!ProcessFrameData(&reader, *header)) {
1914 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
1915 DCHECK_NE("", detailed_error_);
1916 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1917 << detailed_error_;
1918 return false;
1919 }
1920 }
1921
1922 visitor_->OnPacketComplete();
1923 return true;
1924}
1925
1926bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader,
1927 QuicPacketHeader* header,
1928 const QuicEncryptedPacket& packet,
1929 char* decrypted_buffer,
1930 size_t buffer_length) {
1931 if (!ProcessUnauthenticatedHeader(encrypted_reader, header)) {
1932 DCHECK_NE("", detailed_error_);
1933 QUIC_DVLOG(1)
1934 << ENDPOINT
1935 << "Unable to process packet header. Stopping parsing. Error: "
1936 << detailed_error_;
1937 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1938 return false;
1939 }
1940
1941 QuicStringPiece encrypted = encrypted_reader->ReadRemainingPayload();
1942 QuicStringPiece associated_data = GetAssociatedDataFromEncryptedPacket(
1943 version_.transport_version, packet,
1944 GetIncludedDestinationConnectionIdLength(*header),
1945 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1946 header->nonce != nullptr, header->packet_number_length,
1947 header->retry_token_length_length, header->retry_token.length(),
1948 header->length_length);
1949
1950 size_t decrypted_length = 0;
QUICHE team10b22a12019-03-21 15:31:42 -07001951 EncryptionLevel decrypted_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001952 if (!DecryptPayload(encrypted, associated_data, *header, decrypted_buffer,
QUICHE team10b22a12019-03-21 15:31:42 -07001953 buffer_length, &decrypted_length, &decrypted_level)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001954 RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1955 set_detailed_error("Unable to decrypt payload.");
1956 return RaiseError(QUIC_DECRYPTION_FAILURE);
1957 }
1958
1959 QuicDataReader reader(decrypted_buffer, decrypted_length);
1960
1961 // Update the largest packet number after we have decrypted the packet
1962 // so we are confident is not attacker controlled.
QUICHE team10b22a12019-03-21 15:31:42 -07001963 if (supports_multiple_packet_number_spaces_) {
1964 largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1965 decrypted_level)]
1966 .UpdateMax(header->packet_number);
1967 } else {
1968 largest_packet_number_.UpdateMax(header->packet_number);
1969 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001970
1971 if (!visitor_->OnPacketHeader(*header)) {
1972 // The visitor suppresses further processing of the packet.
1973 return true;
1974 }
1975
dschinazie8d7fa72019-04-05 14:44:40 -07001976 if (packet.length() > kMaxIncomingPacketSize) {
1977 set_detailed_error("Packet too large.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001978 return RaiseError(QUIC_PACKET_TOO_LARGE);
1979 }
1980
1981 // Handle the payload.
1982 if (!ProcessFrameData(&reader, *header)) {
1983 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
1984 DCHECK_NE("", detailed_error_);
1985 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1986 << detailed_error_;
1987 return false;
1988 }
1989
1990 visitor_->OnPacketComplete();
1991 return true;
1992}
1993
1994bool QuicFramer::ProcessPublicResetPacket(QuicDataReader* reader,
1995 const QuicPacketHeader& header) {
QUICHE team2252b702019-05-14 23:55:14 -04001996 QuicPublicResetPacket packet(
1997 GetServerConnectionIdAsRecipient(header, perspective_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001998
1999 std::unique_ptr<CryptoHandshakeMessage> reset(
2000 CryptoFramer::ParseMessage(reader->ReadRemainingPayload()));
2001 if (!reset.get()) {
2002 set_detailed_error("Unable to read reset message.");
2003 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
2004 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
2005 }
2006 if (reset->tag() != kPRST) {
2007 set_detailed_error("Incorrect message tag.");
2008 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
2009 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
2010 }
2011
2012 if (reset->GetUint64(kRNON, &packet.nonce_proof) != QUIC_NO_ERROR) {
2013 set_detailed_error("Unable to read nonce proof.");
2014 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
2015 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
2016 }
2017 // TODO(satyamshekhar): validate nonce to protect against DoS.
2018
2019 QuicStringPiece address;
2020 if (reset->GetStringPiece(kCADR, &address)) {
2021 QuicSocketAddressCoder address_coder;
2022 if (address_coder.Decode(address.data(), address.length())) {
2023 packet.client_address =
2024 QuicSocketAddress(address_coder.ip(), address_coder.port());
2025 }
2026 }
2027
2028 QuicStringPiece endpoint_id;
2029 if (perspective_ == Perspective::IS_CLIENT &&
2030 reset->GetStringPiece(kEPID, &endpoint_id)) {
vasilvvc48c8712019-03-11 13:38:16 -07002031 packet.endpoint_id = std::string(endpoint_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002032 packet.endpoint_id += '\0';
2033 }
2034
2035 visitor_->OnPublicResetPacket(packet);
2036 return true;
2037}
2038
2039bool QuicFramer::IsIetfStatelessResetPacket(
2040 const QuicPacketHeader& header) const {
2041 QUIC_BUG_IF(header.has_possible_stateless_reset_token &&
2042 perspective_ != Perspective::IS_CLIENT)
2043 << "has_possible_stateless_reset_token can only be true at client side.";
2044 return header.form == IETF_QUIC_SHORT_HEADER_PACKET &&
2045 header.has_possible_stateless_reset_token &&
2046 visitor_->IsValidStatelessResetToken(
2047 header.possible_stateless_reset_token);
2048}
2049
2050bool QuicFramer::HasEncrypterOfEncryptionLevel(EncryptionLevel level) const {
2051 return encrypter_[level] != nullptr;
2052}
2053
2054bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
2055 QuicDataWriter* writer,
2056 size_t* length_field_offset) {
2057 if (transport_version() > QUIC_VERSION_43) {
2058 return AppendIetfPacketHeader(header, writer, length_field_offset);
2059 }
2060 QUIC_DVLOG(1) << ENDPOINT << "Appending header: " << header;
2061 uint8_t public_flags = 0;
2062 if (header.reset_flag) {
2063 public_flags |= PACKET_PUBLIC_FLAGS_RST;
2064 }
2065 if (header.version_flag) {
2066 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
2067 }
2068
2069 public_flags |= GetPacketNumberFlags(header.packet_number_length)
2070 << kPublicHeaderSequenceNumberShift;
2071
2072 if (header.nonce != nullptr) {
2073 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2074 public_flags |= PACKET_PUBLIC_FLAGS_NONCE;
2075 }
QUICHE team2252b702019-05-14 23:55:14 -04002076
dschinazi7b9278c2019-05-20 07:36:21 -07002077 QuicConnectionId server_connection_id =
QUICHE team2252b702019-05-14 23:55:14 -04002078 GetServerConnectionIdAsSender(header, perspective_);
dschinazi7b9278c2019-05-20 07:36:21 -07002079 QuicConnectionIdIncluded server_connection_id_included =
QUICHE team2252b702019-05-14 23:55:14 -04002080 GetServerConnectionIdIncludedAsSender(header, perspective_);
2081 DCHECK_EQ(CONNECTION_ID_ABSENT,
2082 GetClientConnectionIdIncludedAsSender(header, perspective_));
2083
dschinazi7b9278c2019-05-20 07:36:21 -07002084 switch (server_connection_id_included) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002085 case CONNECTION_ID_ABSENT:
2086 if (!writer->WriteUInt8(public_flags |
2087 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) {
2088 return false;
2089 }
2090 break;
2091 case CONNECTION_ID_PRESENT:
2092 QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(
dschinazi7b9278c2019-05-20 07:36:21 -07002093 server_connection_id, transport_version()))
QUICHE teama6ef0a62019-03-07 20:34:33 -05002094 << "AppendPacketHeader: attempted to use connection ID "
dschinazi7b9278c2019-05-20 07:36:21 -07002095 << server_connection_id << " which is invalid with version "
QUICHE teama6ef0a62019-03-07 20:34:33 -05002096 << QuicVersionToString(transport_version());
2097
2098 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID;
2099 if (perspective_ == Perspective::IS_CLIENT) {
2100 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD;
2101 }
2102 if (!writer->WriteUInt8(public_flags) ||
dschinazi7b9278c2019-05-20 07:36:21 -07002103 !writer->WriteConnectionId(server_connection_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002104 return false;
2105 }
2106 break;
2107 }
dschinazi7b9278c2019-05-20 07:36:21 -07002108 last_serialized_server_connection_id_ = server_connection_id;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002109
2110 if (header.version_flag) {
2111 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
2112 QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
2113 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
2114 if (!writer->WriteTag(QuicEndian::NetToHost32(version_label))) {
2115 return false;
2116 }
2117
2118 QUIC_DVLOG(1) << ENDPOINT << "label = '"
2119 << QuicVersionLabelToString(version_label) << "'";
2120 }
2121
2122 if (header.nonce != nullptr &&
2123 !writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2124 return false;
2125 }
2126
2127 if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2128 writer)) {
2129 return false;
2130 }
2131
2132 return true;
2133}
2134
2135bool QuicFramer::AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
2136 QuicDataWriter* writer) {
2137 uint8_t type = 0;
2138 if (transport_version() > QUIC_VERSION_44) {
2139 if (header.version_flag) {
2140 type = static_cast<uint8_t>(
2141 FLAGS_LONG_HEADER | FLAGS_FIXED_BIT |
2142 LongHeaderTypeToOnWireValue(transport_version(),
2143 header.long_packet_type) |
2144 PacketNumberLengthToOnWireValue(transport_version(),
2145 header.packet_number_length));
2146 } else {
2147 type = static_cast<uint8_t>(
2148 FLAGS_FIXED_BIT |
2149 PacketNumberLengthToOnWireValue(transport_version(),
2150 header.packet_number_length));
2151 }
2152 return writer->WriteUInt8(type);
2153 }
2154
2155 if (header.version_flag) {
2156 type = static_cast<uint8_t>(
2157 FLAGS_LONG_HEADER | LongHeaderTypeToOnWireValue(
2158 transport_version(), header.long_packet_type));
2159 DCHECK_EQ(PACKET_4BYTE_PACKET_NUMBER, header.packet_number_length);
2160 } else {
2161 type |= FLAGS_SHORT_HEADER_RESERVED_1;
2162 type |= FLAGS_SHORT_HEADER_RESERVED_2;
2163 DCHECK_GE(PACKET_4BYTE_PACKET_NUMBER, header.packet_number_length);
2164 type |= PacketNumberLengthToOnWireValue(transport_version(),
2165 header.packet_number_length);
2166 }
2167 return writer->WriteUInt8(type);
2168}
2169
2170bool QuicFramer::AppendIetfPacketHeader(const QuicPacketHeader& header,
2171 QuicDataWriter* writer,
2172 size_t* length_field_offset) {
2173 QUIC_DVLOG(1) << ENDPOINT << "Appending IETF header: " << header;
QUICHE team2252b702019-05-14 23:55:14 -04002174 QuicConnectionId server_connection_id =
2175 GetServerConnectionIdAsSender(header, perspective_);
2176 QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(server_connection_id,
2177 transport_version()))
QUICHE teama6ef0a62019-03-07 20:34:33 -05002178 << "AppendIetfPacketHeader: attempted to use connection ID "
QUICHE team2252b702019-05-14 23:55:14 -04002179 << server_connection_id << " which is invalid with version "
QUICHE teama6ef0a62019-03-07 20:34:33 -05002180 << QuicVersionToString(transport_version());
2181 if (!AppendIetfHeaderTypeByte(header, writer)) {
2182 return false;
2183 }
2184
2185 if (header.version_flag) {
2186 // Append version for long header.
2187 QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
2188 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
2189 if (!writer->WriteTag(QuicEndian::NetToHost32(version_label))) {
2190 return false;
2191 }
2192 }
2193
2194 // Append connection ID.
dschinazi1f485a12019-05-13 11:57:01 -07002195 if (!AppendIetfConnectionIds(
2196 header.version_flag,
2197 header.destination_connection_id_included != CONNECTION_ID_ABSENT
2198 ? header.destination_connection_id
2199 : EmptyQuicConnectionId(),
2200 header.source_connection_id_included != CONNECTION_ID_ABSENT
2201 ? header.source_connection_id
2202 : EmptyQuicConnectionId(),
2203 writer)) {
2204 return false;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002205 }
dschinazi1f485a12019-05-13 11:57:01 -07002206
dschinazi7b9278c2019-05-20 07:36:21 -07002207 last_serialized_server_connection_id_ = server_connection_id;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002208
2209 if (QuicVersionHasLongHeaderLengths(transport_version()) &&
2210 header.version_flag) {
2211 if (header.long_packet_type == INITIAL) {
2212 // Write retry token length.
2213 if (!writer->WriteVarInt62(header.retry_token.length(),
2214 header.retry_token_length_length)) {
2215 return false;
2216 }
2217 // Write retry token.
2218 if (!header.retry_token.empty() &&
2219 !writer->WriteStringPiece(header.retry_token)) {
2220 return false;
2221 }
2222 }
2223 if (length_field_offset != nullptr) {
2224 *length_field_offset = writer->length();
2225 }
2226 // Add fake length to reserve two bytes to add length in later.
2227 writer->WriteVarInt62(256);
2228 } else if (length_field_offset != nullptr) {
2229 *length_field_offset = 0;
2230 }
2231
2232 // Append packet number.
2233 if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2234 writer)) {
2235 return false;
2236 }
nharper55fa6132019-05-07 19:37:21 -07002237 last_written_packet_number_length_ = header.packet_number_length;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002238
2239 if (!header.version_flag) {
2240 return true;
2241 }
2242
2243 if (header.nonce != nullptr) {
2244 DCHECK(header.version_flag);
2245 DCHECK_EQ(ZERO_RTT_PROTECTED, header.long_packet_type);
2246 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2247 if (!writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2248 return false;
2249 }
2250 }
2251
2252 return true;
2253}
2254
2255const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
2256 uint32_t time_delta_us) {
2257 // The new time_delta might have wrapped to the next epoch, or it
2258 // might have reverse wrapped to the previous epoch, or it might
2259 // remain in the same epoch. Select the time closest to the previous
2260 // time.
2261 //
2262 // epoch_delta is the delta between epochs. A delta is 4 bytes of
2263 // microseconds.
2264 const uint64_t epoch_delta = UINT64_C(1) << 32;
2265 uint64_t epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1);
2266 // Wrapping is safe here because a wrapped value will not be ClosestTo below.
2267 uint64_t prev_epoch = epoch - epoch_delta;
2268 uint64_t next_epoch = epoch + epoch_delta;
2269
2270 uint64_t time = ClosestTo(
2271 last_timestamp_.ToMicroseconds(), epoch + time_delta_us,
2272 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us,
2273 next_epoch + time_delta_us));
2274
2275 return QuicTime::Delta::FromMicroseconds(time);
2276}
2277
2278uint64_t QuicFramer::CalculatePacketNumberFromWire(
2279 QuicPacketNumberLength packet_number_length,
2280 QuicPacketNumber base_packet_number,
2281 uint64_t packet_number) const {
2282 // The new packet number might have wrapped to the next epoch, or
2283 // it might have reverse wrapped to the previous epoch, or it might
2284 // remain in the same epoch. Select the packet number closest to the
2285 // next expected packet number, the previous packet number plus 1.
2286
2287 // epoch_delta is the delta between epochs the packet number was serialized
2288 // with, so the correct value is likely the same epoch as the last sequence
2289 // number or an adjacent epoch.
2290 if (!base_packet_number.IsInitialized()) {
2291 return packet_number;
2292 }
2293 const uint64_t epoch_delta = UINT64_C(1) << (8 * packet_number_length);
2294 uint64_t next_packet_number = base_packet_number.ToUint64() + 1;
2295 uint64_t epoch = base_packet_number.ToUint64() & ~(epoch_delta - 1);
2296 uint64_t prev_epoch = epoch - epoch_delta;
2297 uint64_t next_epoch = epoch + epoch_delta;
2298
2299 return ClosestTo(next_packet_number, epoch + packet_number,
2300 ClosestTo(next_packet_number, prev_epoch + packet_number,
2301 next_epoch + packet_number));
2302}
2303
2304bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader,
2305 bool packet_has_ietf_packet_header,
2306 QuicPacketHeader* header) {
2307 if (packet_has_ietf_packet_header) {
2308 return ProcessIetfPacketHeader(reader, header);
2309 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002310 uint8_t public_flags;
2311 if (!reader->ReadBytes(&public_flags, 1)) {
2312 set_detailed_error("Unable to read public flags.");
2313 return false;
2314 }
2315
2316 header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
2317 header->version_flag = (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
2318
2319 if (validate_flags_ && !header->version_flag &&
2320 public_flags > PACKET_PUBLIC_FLAGS_MAX) {
2321 set_detailed_error("Illegal public flags value.");
2322 return false;
2323 }
2324
2325 if (header->reset_flag && header->version_flag) {
2326 set_detailed_error("Got version flag in reset packet");
2327 return false;
2328 }
2329
QUICHE team2252b702019-05-14 23:55:14 -04002330 QuicConnectionId* header_connection_id = &header->destination_connection_id;
2331 QuicConnectionIdIncluded* header_connection_id_included =
2332 &header->destination_connection_id_included;
2333 if (perspective_ == Perspective::IS_CLIENT &&
2334 GetQuicRestartFlag(quic_do_not_override_connection_id)) {
2335 header_connection_id = &header->source_connection_id;
2336 header_connection_id_included = &header->source_connection_id_included;
2337 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002338 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) {
2339 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID:
QUICHE team2252b702019-05-14 23:55:14 -04002340 if (!reader->ReadConnectionId(header_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002341 kQuicDefaultConnectionIdLength)) {
2342 set_detailed_error("Unable to read ConnectionId.");
2343 return false;
2344 }
QUICHE team2252b702019-05-14 23:55:14 -04002345 *header_connection_id_included = CONNECTION_ID_PRESENT;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002346 break;
2347 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID:
QUICHE team2252b702019-05-14 23:55:14 -04002348 *header_connection_id_included = CONNECTION_ID_ABSENT;
dschinazi7b9278c2019-05-20 07:36:21 -07002349 *header_connection_id = last_serialized_server_connection_id_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002350 break;
2351 }
2352
2353 header->packet_number_length = ReadSequenceNumberLength(
2354 public_flags >> kPublicHeaderSequenceNumberShift);
2355
2356 // Read the version only if the packet is from the client.
2357 // version flag from the server means version negotiation packet.
2358 if (header->version_flag && perspective_ == Perspective::IS_SERVER) {
2359 QuicVersionLabel version_label;
fayang40315542019-05-09 09:19:09 -07002360 if (!ProcessVersionLabel(reader, &version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002361 set_detailed_error("Unable to read protocol version.");
2362 return false;
2363 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002364 // If the version from the new packet is the same as the version of this
2365 // framer, then the public flags should be set to something we understand.
2366 // If not, this raises an error.
2367 last_version_label_ = version_label;
2368 ParsedQuicVersion version = ParseQuicVersionLabel(version_label);
2369 if (version == version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
2370 set_detailed_error("Illegal public flags value.");
2371 return false;
2372 }
2373 header->version = version;
2374 }
2375
2376 // A nonce should only be present in packets from the server to the client,
2377 // which are neither version negotiation nor public reset packets.
2378 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE &&
2379 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) &&
2380 !(public_flags & PACKET_PUBLIC_FLAGS_RST) &&
2381 // The nonce flag from a client is ignored and is assumed to be an older
2382 // client indicating an eight-byte connection ID.
2383 perspective_ == Perspective::IS_CLIENT) {
2384 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()),
2385 last_nonce_.size())) {
2386 set_detailed_error("Unable to read nonce.");
2387 return false;
2388 }
2389 header->nonce = &last_nonce_;
2390 } else {
2391 header->nonce = nullptr;
2392 }
2393
2394 return true;
2395}
2396
2397// static
2398QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength(
2399 QuicTransportVersion version,
2400 QuicPacketNumber packet_number) {
2401 DCHECK(packet_number.IsInitialized());
2402 if (packet_number < QuicPacketNumber(1 << (PACKET_1BYTE_PACKET_NUMBER * 8))) {
2403 return PACKET_1BYTE_PACKET_NUMBER;
2404 } else if (packet_number <
2405 QuicPacketNumber(1 << (PACKET_2BYTE_PACKET_NUMBER * 8))) {
2406 return PACKET_2BYTE_PACKET_NUMBER;
2407 } else if (packet_number <
2408 QuicPacketNumber(UINT64_C(1)
2409 << (PACKET_4BYTE_PACKET_NUMBER * 8))) {
2410 return PACKET_4BYTE_PACKET_NUMBER;
2411 } else {
2412 return PACKET_6BYTE_PACKET_NUMBER;
2413 }
2414}
2415
2416// static
2417uint8_t QuicFramer::GetPacketNumberFlags(
2418 QuicPacketNumberLength packet_number_length) {
2419 switch (packet_number_length) {
2420 case PACKET_1BYTE_PACKET_NUMBER:
2421 return PACKET_FLAGS_1BYTE_PACKET;
2422 case PACKET_2BYTE_PACKET_NUMBER:
2423 return PACKET_FLAGS_2BYTE_PACKET;
2424 case PACKET_4BYTE_PACKET_NUMBER:
2425 return PACKET_FLAGS_4BYTE_PACKET;
2426 case PACKET_6BYTE_PACKET_NUMBER:
2427 case PACKET_8BYTE_PACKET_NUMBER:
2428 return PACKET_FLAGS_8BYTE_PACKET;
2429 default:
2430 QUIC_BUG << "Unreachable case statement.";
2431 return PACKET_FLAGS_8BYTE_PACKET;
2432 }
2433}
2434
2435// static
2436QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo(
2437 const QuicAckFrame& frame) {
2438 AckFrameInfo new_ack_info;
2439 if (frame.packets.Empty()) {
2440 return new_ack_info;
2441 }
2442 // The first block is the last interval. It isn't encoded with the gap-length
2443 // encoding, so skip it.
2444 new_ack_info.first_block_length = frame.packets.LastIntervalLength();
2445 auto itr = frame.packets.rbegin();
2446 QuicPacketNumber previous_start = itr->min();
2447 new_ack_info.max_block_length = PacketNumberIntervalLength(*itr);
2448 ++itr;
2449
2450 // Don't do any more work after getting information for 256 ACK blocks; any
2451 // more can't be encoded anyway.
2452 for (; itr != frame.packets.rend() &&
2453 new_ack_info.num_ack_blocks < std::numeric_limits<uint8_t>::max();
2454 previous_start = itr->min(), ++itr) {
2455 const auto& interval = *itr;
2456 const QuicPacketCount total_gap = previous_start - interval.max();
2457 new_ack_info.num_ack_blocks +=
2458 (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
2459 std::numeric_limits<uint8_t>::max();
2460 new_ack_info.max_block_length = std::max(
2461 new_ack_info.max_block_length, PacketNumberIntervalLength(interval));
2462 }
2463 return new_ack_info;
2464}
2465
2466bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
2467 QuicPacketHeader* header) {
QUICHE team10b22a12019-03-21 15:31:42 -07002468 QuicPacketNumber base_packet_number;
2469 if (supports_multiple_packet_number_spaces_) {
nharper55fa6132019-05-07 19:37:21 -07002470 PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
2471 if (pn_space == NUM_PACKET_NUMBER_SPACES) {
2472 set_detailed_error("Unable to determine packet number space.");
2473 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2474 }
2475 base_packet_number = largest_decrypted_packet_numbers_[pn_space];
QUICHE team10b22a12019-03-21 15:31:42 -07002476 } else {
2477 base_packet_number = largest_packet_number_;
2478 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002479 uint64_t full_packet_number;
2480 if (!ProcessAndCalculatePacketNumber(
2481 encrypted_reader, header->packet_number_length, base_packet_number,
2482 &full_packet_number)) {
2483 set_detailed_error("Unable to read packet number.");
2484 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2485 }
2486
2487 if (!IsValidFullPacketNumber(full_packet_number, transport_version())) {
2488 set_detailed_error("packet numbers cannot be 0.");
2489 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2490 }
2491 header->packet_number = QuicPacketNumber(full_packet_number);
2492
2493 if (!visitor_->OnUnauthenticatedHeader(*header)) {
2494 set_detailed_error(
2495 "Visitor asked to stop processing of unauthenticated header.");
2496 return false;
2497 }
nharper3f283562019-05-02 16:37:12 -07002498 // The function we are in is called because the framer believes that it is
2499 // processing a packet that uses the non-IETF (i.e. Google QUIC) packet header
2500 // type. Usually, the framer makes that decision based on the framer's
2501 // version, but when the framer is used with Perspective::IS_SERVER, then
2502 // before version negotiation is complete (specifically, before
2503 // InferPacketHeaderTypeFromVersion is called), this decision is made based on
2504 // the type byte of the packet.
2505 //
2506 // If the framer's version KnowsWhichDecrypterToUse, then that version expects
2507 // to use the IETF packet header type. If that's the case and we're in this
2508 // function, then the packet received is invalid: the framer was expecting an
2509 // IETF packet header and didn't get one.
2510 if (version().KnowsWhichDecrypterToUse()) {
nharpera745e392019-04-19 12:05:15 -07002511 set_detailed_error("Invalid public header type for expected version.");
2512 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2513 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002514 return true;
2515}
2516
2517bool QuicFramer::ProcessIetfHeaderTypeByte(QuicDataReader* reader,
2518 QuicPacketHeader* header) {
2519 uint8_t type;
2520 if (!reader->ReadBytes(&type, 1)) {
2521 set_detailed_error("Unable to read type.");
2522 return false;
2523 }
dschinazi244f6dc2019-05-06 15:45:16 -07002524 header->type_byte = type;
QUICHE teama6ef0a62019-03-07 20:34:33 -05002525 // Determine whether this is a long or short header.
fayangccbab732019-05-13 10:11:25 -07002526 header->form = GetIetfPacketHeaderFormat(type);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002527 if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
2528 // Version is always present in long headers.
2529 header->version_flag = true;
2530 // Long header packets received by client must include 8-byte source
2531 // connection ID, and those received by server must include 8-byte
2532 // destination connection ID.
2533 header->destination_connection_id_included =
2534 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_ABSENT
2535 : CONNECTION_ID_PRESENT;
2536 header->source_connection_id_included =
2537 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_PRESENT
2538 : CONNECTION_ID_ABSENT;
2539 // Read version tag.
2540 QuicVersionLabel version_label;
fayang40315542019-05-09 09:19:09 -07002541 if (!ProcessVersionLabel(reader, &version_label)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002542 set_detailed_error("Unable to read protocol version.");
2543 return false;
2544 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002545 if (!version_label) {
2546 // Version label is 0 indicating this is a version negotiation packet.
2547 header->long_packet_type = VERSION_NEGOTIATION;
2548 } else {
2549 header->version = ParseQuicVersionLabel(version_label);
2550 if (header->version.transport_version != QUIC_VERSION_UNSUPPORTED) {
2551 if (header->version.transport_version > QUIC_VERSION_44 &&
2552 !(type & FLAGS_FIXED_BIT)) {
2553 set_detailed_error("Fixed bit is 0 in long header.");
2554 return false;
2555 }
2556 if (!GetLongHeaderType(header->version.transport_version, type,
2557 &header->long_packet_type)) {
2558 set_detailed_error("Illegal long header type value.");
2559 return false;
2560 }
dschinazi244f6dc2019-05-06 15:45:16 -07002561 if (header->long_packet_type == RETRY) {
2562 if (!version().SupportsRetry()) {
2563 set_detailed_error("RETRY not supported in this version.");
2564 return false;
2565 }
2566 if (perspective_ == Perspective::IS_SERVER) {
2567 set_detailed_error("Client-initiated RETRY is invalid.");
2568 return false;
2569 }
nharper55fa6132019-05-07 19:37:21 -07002570 } else if (!header->version.HasHeaderProtection()) {
dschinazi244f6dc2019-05-06 15:45:16 -07002571 header->packet_number_length = GetLongHeaderPacketNumberLength(
2572 header->version.transport_version, type);
nharper2ceb97c2019-04-19 11:38:59 -07002573 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002574 }
2575 }
2576 if (header->long_packet_type != VERSION_NEGOTIATION) {
2577 // Do not save version of version negotiation packet.
2578 last_version_label_ = version_label;
2579 }
2580
2581 QUIC_DVLOG(1) << ENDPOINT << "Received IETF long header: "
2582 << QuicUtils::QuicLongHeaderTypetoString(
2583 header->long_packet_type);
2584 return true;
2585 }
2586
2587 QUIC_DVLOG(1) << ENDPOINT << "Received IETF short header";
2588 // Version is not present in short headers.
2589 header->version_flag = false;
2590 // Connection ID length depends on the perspective. Client does not expect
2591 // destination connection ID, and server expects destination connection ID.
2592 header->destination_connection_id_included =
2593 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_ABSENT
2594 : CONNECTION_ID_PRESENT;
2595 header->source_connection_id_included = CONNECTION_ID_ABSENT;
2596 if (infer_packet_header_type_from_version_ &&
2597 transport_version() > QUIC_VERSION_44 && !(type & FLAGS_FIXED_BIT)) {
2598 set_detailed_error("Fixed bit is 0 in short header.");
2599 return false;
2600 }
nharper55fa6132019-05-07 19:37:21 -07002601 if (!header->version.HasHeaderProtection() &&
2602 !GetShortHeaderPacketNumberLength(transport_version(), type,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002603 infer_packet_header_type_from_version_,
2604 &header->packet_number_length)) {
2605 set_detailed_error("Illegal short header type value.");
2606 return false;
2607 }
2608 QUIC_DVLOG(1) << "packet_number_length = " << header->packet_number_length;
2609 return true;
2610}
2611
fayang40315542019-05-09 09:19:09 -07002612// static
2613bool QuicFramer::ProcessVersionLabel(QuicDataReader* reader,
2614 QuicVersionLabel* version_label) {
2615 if (!reader->ReadTag(version_label)) {
2616 return false;
2617 }
2618 // TODO(rch): Use ReadUInt32() once QUIC_VERSION_35 is removed.
2619 *version_label = QuicEndian::NetToHost32(*version_label);
2620 return true;
2621}
2622
2623// static
fayangccbab732019-05-13 10:11:25 -07002624bool QuicFramer::ProcessAndValidateIetfConnectionIdLength(
2625 QuicDataReader* reader,
fayang40315542019-05-09 09:19:09 -07002626 ParsedQuicVersion version,
dschinazi334f0232019-05-29 16:08:53 -07002627 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -07002628 bool should_update_expected_server_connection_id_length,
2629 uint8_t* expected_server_connection_id_length,
fayang40315542019-05-09 09:19:09 -07002630 uint8_t* destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -07002631 uint8_t* source_connection_id_length,
2632 std::string* detailed_error) {
2633 uint8_t connection_id_lengths_byte;
2634 if (!reader->ReadBytes(&connection_id_lengths_byte, 1)) {
2635 *detailed_error = "Unable to read ConnectionId length.";
2636 return false;
2637 }
fayang40315542019-05-09 09:19:09 -07002638 uint8_t dcil =
2639 (connection_id_lengths_byte & kDestinationConnectionIdLengthMask) >> 4;
2640 if (dcil != 0) {
2641 dcil += kConnectionIdLengthAdjustment;
2642 }
fayang40315542019-05-09 09:19:09 -07002643 uint8_t scil = connection_id_lengths_byte & kSourceConnectionIdLengthMask;
2644 if (scil != 0) {
2645 scil += kConnectionIdLengthAdjustment;
2646 }
dschinazi334f0232019-05-29 16:08:53 -07002647 if (should_update_expected_server_connection_id_length) {
2648 uint8_t server_connection_id_length =
2649 perspective == Perspective::IS_SERVER ? dcil : scil;
2650 if (*expected_server_connection_id_length != server_connection_id_length) {
2651 QUIC_DVLOG(1) << "Updating expected_server_connection_id_length: "
2652 << static_cast<int>(*expected_server_connection_id_length)
2653 << " -> " << static_cast<int>(server_connection_id_length);
2654 *expected_server_connection_id_length = server_connection_id_length;
2655 }
2656 }
dschinazi8ff74822019-05-28 16:37:20 -07002657 if (!should_update_expected_server_connection_id_length &&
fayangde8a2222019-05-16 10:52:39 -07002658 (dcil != *destination_connection_id_length ||
fayang40315542019-05-09 09:19:09 -07002659 scil != *source_connection_id_length) &&
fayang40315542019-05-09 09:19:09 -07002660 !QuicUtils::VariableLengthConnectionIdAllowedForVersion(
2661 version.transport_version)) {
2662 // TODO(dschinazi): use the framer's version once the
2663 // OnProtocolVersionMismatch call is moved to before this is run.
2664 QUIC_DVLOG(1) << "dcil: " << static_cast<uint32_t>(dcil)
2665 << ", scil: " << static_cast<uint32_t>(scil);
fayangccbab732019-05-13 10:11:25 -07002666 *detailed_error = "Invalid ConnectionId length.";
fayang40315542019-05-09 09:19:09 -07002667 return false;
2668 }
2669 *destination_connection_id_length = dcil;
2670 *source_connection_id_length = scil;
2671 return true;
2672}
2673
QUICHE teama6ef0a62019-03-07 20:34:33 -05002674bool QuicFramer::ProcessIetfPacketHeader(QuicDataReader* reader,
2675 QuicPacketHeader* header) {
2676 if (!ProcessIetfHeaderTypeByte(reader, header)) {
2677 return false;
2678 }
2679
2680 uint8_t destination_connection_id_length =
2681 header->destination_connection_id_included == CONNECTION_ID_PRESENT
dschinazi8ff74822019-05-28 16:37:20 -07002682 ? expected_server_connection_id_length_
QUICHE teama6ef0a62019-03-07 20:34:33 -05002683 : 0;
2684 uint8_t source_connection_id_length =
2685 header->source_connection_id_included == CONNECTION_ID_PRESENT
dschinazi8ff74822019-05-28 16:37:20 -07002686 ? expected_server_connection_id_length_
QUICHE teama6ef0a62019-03-07 20:34:33 -05002687 : 0;
2688 if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
fayangccbab732019-05-13 10:11:25 -07002689 if (!ProcessAndValidateIetfConnectionIdLength(
dschinazi334f0232019-05-29 16:08:53 -07002690 reader, header->version, perspective_,
dschinazi8ff74822019-05-28 16:37:20 -07002691 should_update_expected_server_connection_id_length_,
2692 &expected_server_connection_id_length_,
2693 &destination_connection_id_length, &source_connection_id_length,
2694 &detailed_error_)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002695 return false;
2696 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002697 }
2698
QUICHE team0131a5b2019-03-20 15:23:27 -07002699 DCHECK_LE(destination_connection_id_length, kQuicMaxConnectionIdLength);
2700 DCHECK_LE(source_connection_id_length, kQuicMaxConnectionIdLength);
2701
QUICHE teama6ef0a62019-03-07 20:34:33 -05002702 // Read connection ID.
2703 if (!reader->ReadConnectionId(&header->destination_connection_id,
2704 destination_connection_id_length)) {
2705 set_detailed_error("Unable to read Destination ConnectionId.");
2706 return false;
2707 }
2708
2709 if (!reader->ReadConnectionId(&header->source_connection_id,
2710 source_connection_id_length)) {
2711 set_detailed_error("Unable to read Source ConnectionId.");
2712 return false;
2713 }
2714
QUICHE team2252b702019-05-14 23:55:14 -04002715 if (!GetQuicRestartFlag(quic_do_not_override_connection_id)) {
2716 if (header->source_connection_id_included == CONNECTION_ID_PRESENT) {
dschinazi7d066ca2019-05-15 17:59:49 -07002717 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
2718 DCHECK_EQ(IETF_QUIC_LONG_HEADER_PACKET, header->form);
2719 if (!header->destination_connection_id.IsEmpty()) {
2720 set_detailed_error("Client connection ID not supported yet.");
2721 return false;
2722 }
QUICHE team2252b702019-05-14 23:55:14 -04002723 // Set destination connection ID to source connection ID.
QUICHE team2252b702019-05-14 23:55:14 -04002724 header->destination_connection_id = header->source_connection_id;
2725 } else if (header->destination_connection_id_included ==
2726 CONNECTION_ID_ABSENT) {
dschinazi7b9278c2019-05-20 07:36:21 -07002727 header->destination_connection_id = last_serialized_server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -04002728 }
2729 } else {
2730 QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 5, 5);
2731 if (header->source_connection_id_included == CONNECTION_ID_ABSENT) {
2732 DCHECK_EQ(EmptyQuicConnectionId(), header->source_connection_id);
dschinazi7b9278c2019-05-20 07:36:21 -07002733 header->source_connection_id = last_serialized_server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -04002734 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002735 }
2736
2737 return true;
2738}
2739
2740bool QuicFramer::ProcessAndCalculatePacketNumber(
2741 QuicDataReader* reader,
2742 QuicPacketNumberLength packet_number_length,
2743 QuicPacketNumber base_packet_number,
2744 uint64_t* packet_number) {
2745 uint64_t wire_packet_number;
2746 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) {
2747 return false;
2748 }
2749
2750 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers
2751 // in case the first guess is incorrect.
2752 *packet_number = CalculatePacketNumberFromWire(
2753 packet_number_length, base_packet_number, wire_packet_number);
2754 return true;
2755}
2756
2757bool QuicFramer::ProcessFrameData(QuicDataReader* reader,
2758 const QuicPacketHeader& header) {
2759 DCHECK_NE(QUIC_VERSION_99, version_.transport_version)
2760 << "Version 99 negotiated, but not processing frames as version 99.";
2761 if (reader->IsDoneReading()) {
2762 set_detailed_error("Packet has no frames.");
2763 return RaiseError(QUIC_MISSING_PAYLOAD);
2764 }
2765 while (!reader->IsDoneReading()) {
2766 uint8_t frame_type;
2767 if (!reader->ReadBytes(&frame_type, 1)) {
2768 set_detailed_error("Unable to read frame type.");
2769 return RaiseError(QUIC_INVALID_FRAME_DATA);
2770 }
2771 const uint8_t special_mask = transport_version() <= QUIC_VERSION_44
2772 ? kQuicFrameTypeBrokenMask
2773 : kQuicFrameTypeSpecialMask;
2774 if (frame_type & special_mask) {
2775 // Stream Frame
2776 if (frame_type & kQuicFrameTypeStreamMask) {
2777 QuicStreamFrame frame;
2778 if (!ProcessStreamFrame(reader, frame_type, &frame)) {
2779 return RaiseError(QUIC_INVALID_STREAM_DATA);
2780 }
2781 if (!visitor_->OnStreamFrame(frame)) {
2782 QUIC_DVLOG(1) << ENDPOINT
2783 << "Visitor asked to stop further processing.";
2784 // Returning true since there was no parsing error.
2785 return true;
2786 }
2787 continue;
2788 }
2789
2790 // Ack Frame
2791 if (frame_type & kQuicFrameTypeAckMask) {
2792 if (!ProcessAckFrame(reader, frame_type)) {
2793 return RaiseError(QUIC_INVALID_ACK_DATA);
2794 }
2795 continue;
2796 }
2797
2798 // This was a special frame type that did not match any
2799 // of the known ones. Error.
2800 set_detailed_error("Illegal frame type.");
2801 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2802 << static_cast<int>(frame_type);
2803 return RaiseError(QUIC_INVALID_FRAME_DATA);
2804 }
2805
2806 switch (frame_type) {
2807 case PADDING_FRAME: {
2808 QuicPaddingFrame frame;
2809 ProcessPaddingFrame(reader, &frame);
2810 if (!visitor_->OnPaddingFrame(frame)) {
2811 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2812 // Returning true since there was no parsing error.
2813 return true;
2814 }
2815 continue;
2816 }
2817
2818 case RST_STREAM_FRAME: {
2819 QuicRstStreamFrame frame;
2820 if (!ProcessRstStreamFrame(reader, &frame)) {
2821 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2822 }
2823 if (!visitor_->OnRstStreamFrame(frame)) {
2824 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2825 // Returning true since there was no parsing error.
2826 return true;
2827 }
2828 continue;
2829 }
2830
2831 case CONNECTION_CLOSE_FRAME: {
2832 QuicConnectionCloseFrame frame;
2833 if (!ProcessConnectionCloseFrame(reader, &frame)) {
2834 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2835 }
2836
2837 if (!visitor_->OnConnectionCloseFrame(frame)) {
2838 QUIC_DVLOG(1) << ENDPOINT
2839 << "Visitor asked to stop further processing.";
2840 // Returning true since there was no parsing error.
2841 return true;
2842 }
2843 continue;
2844 }
2845
2846 case GOAWAY_FRAME: {
2847 QuicGoAwayFrame goaway_frame;
2848 if (!ProcessGoAwayFrame(reader, &goaway_frame)) {
2849 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
2850 }
2851 if (!visitor_->OnGoAwayFrame(goaway_frame)) {
2852 QUIC_DVLOG(1) << ENDPOINT
2853 << "Visitor asked to stop further processing.";
2854 // Returning true since there was no parsing error.
2855 return true;
2856 }
2857 continue;
2858 }
2859
2860 case WINDOW_UPDATE_FRAME: {
2861 QuicWindowUpdateFrame window_update_frame;
2862 if (!ProcessWindowUpdateFrame(reader, &window_update_frame)) {
2863 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
2864 }
2865 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
2866 QUIC_DVLOG(1) << ENDPOINT
2867 << "Visitor asked to stop further processing.";
2868 // Returning true since there was no parsing error.
2869 return true;
2870 }
2871 continue;
2872 }
2873
2874 case BLOCKED_FRAME: {
2875 QuicBlockedFrame blocked_frame;
2876 if (!ProcessBlockedFrame(reader, &blocked_frame)) {
2877 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
2878 }
2879 if (!visitor_->OnBlockedFrame(blocked_frame)) {
2880 QUIC_DVLOG(1) << ENDPOINT
2881 << "Visitor asked to stop further processing.";
2882 // Returning true since there was no parsing error.
2883 return true;
2884 }
2885 continue;
2886 }
2887
2888 case STOP_WAITING_FRAME: {
ianswett97b690b2019-05-02 15:12:43 -07002889 if (GetQuicReloadableFlag(quic_do_not_accept_stop_waiting) &&
2890 version_.transport_version >= QUIC_VERSION_44) {
2891 QUIC_RELOADABLE_FLAG_COUNT(quic_do_not_accept_stop_waiting);
2892 set_detailed_error("STOP WAITING not supported in version 44+.");
2893 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
2894 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002895 QuicStopWaitingFrame stop_waiting_frame;
2896 if (!ProcessStopWaitingFrame(reader, header, &stop_waiting_frame)) {
2897 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
2898 }
2899 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) {
2900 QUIC_DVLOG(1) << ENDPOINT
2901 << "Visitor asked to stop further processing.";
2902 // Returning true since there was no parsing error.
2903 return true;
2904 }
2905 continue;
2906 }
2907 case PING_FRAME: {
2908 // Ping has no payload.
2909 QuicPingFrame ping_frame;
2910 if (!visitor_->OnPingFrame(ping_frame)) {
2911 QUIC_DVLOG(1) << ENDPOINT
2912 << "Visitor asked to stop further processing.";
2913 // Returning true since there was no parsing error.
2914 return true;
2915 }
2916 continue;
2917 }
2918 case IETF_EXTENSION_MESSAGE_NO_LENGTH:
2919 QUIC_FALLTHROUGH_INTENDED;
2920 case IETF_EXTENSION_MESSAGE: {
2921 QuicMessageFrame message_frame;
2922 if (!ProcessMessageFrame(reader,
2923 frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
2924 &message_frame)) {
2925 return RaiseError(QUIC_INVALID_MESSAGE_DATA);
2926 }
2927 if (!visitor_->OnMessageFrame(message_frame)) {
2928 QUIC_DVLOG(1) << ENDPOINT
2929 << "Visitor asked to stop further processing.";
2930 // Returning true since there was no parsing error.
2931 return true;
2932 }
2933 break;
2934 }
2935 case CRYPTO_FRAME: {
QUICHE teamea740082019-03-11 17:58:43 -07002936 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002937 set_detailed_error("Illegal frame type.");
2938 return RaiseError(QUIC_INVALID_FRAME_DATA);
2939 }
2940 QuicCryptoFrame frame;
2941 if (!ProcessCryptoFrame(reader, &frame)) {
2942 return RaiseError(QUIC_INVALID_FRAME_DATA);
2943 }
2944 if (!visitor_->OnCryptoFrame(frame)) {
2945 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2946 // Returning true since there was no parsing error.
2947 return true;
2948 }
2949 break;
2950 }
2951
2952 default:
2953 set_detailed_error("Illegal frame type.");
2954 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2955 << static_cast<int>(frame_type);
2956 return RaiseError(QUIC_INVALID_FRAME_DATA);
2957 }
2958 }
2959
2960 return true;
2961}
2962
2963bool QuicFramer::ProcessIetfFrameData(QuicDataReader* reader,
2964 const QuicPacketHeader& header) {
2965 DCHECK_EQ(QUIC_VERSION_99, version_.transport_version)
2966 << "Attempt to process frames as IETF frames but version is "
2967 << version_.transport_version << ", not 99.";
2968 if (reader->IsDoneReading()) {
2969 set_detailed_error("Packet has no frames.");
2970 return RaiseError(QUIC_MISSING_PAYLOAD);
2971 }
2972 while (!reader->IsDoneReading()) {
2973 uint64_t frame_type;
2974 // Will be the number of bytes into which frame_type was encoded.
2975 size_t encoded_bytes = reader->BytesRemaining();
2976 if (!reader->ReadVarInt62(&frame_type)) {
2977 set_detailed_error("Unable to read frame type.");
2978 return RaiseError(QUIC_INVALID_FRAME_DATA);
2979 }
2980
2981 // Is now the number of bytes into which the frame type was encoded.
2982 encoded_bytes -= reader->BytesRemaining();
2983
2984 // Check that the frame type is minimally encoded.
2985 if (encoded_bytes !=
2986 static_cast<size_t>(QuicDataWriter::GetVarInt62Len(frame_type))) {
2987 // The frame type was not minimally encoded.
2988 set_detailed_error("Frame type not minimally encoded.");
2989 return RaiseError(IETF_QUIC_PROTOCOL_VIOLATION);
2990 }
2991
2992 if (IS_IETF_STREAM_FRAME(frame_type)) {
2993 QuicStreamFrame frame;
2994 if (!ProcessIetfStreamFrame(reader, frame_type, &frame)) {
2995 return RaiseError(QUIC_INVALID_STREAM_DATA);
2996 }
2997 if (!visitor_->OnStreamFrame(frame)) {
2998 QUIC_DVLOG(1) << ENDPOINT
2999 << "Visitor asked to stop further processing.";
3000 // Returning true since there was no parsing error.
3001 return true;
3002 }
3003 } else {
3004 switch (frame_type) {
3005 case IETF_PADDING: {
3006 QuicPaddingFrame frame;
3007 ProcessPaddingFrame(reader, &frame);
3008 if (!visitor_->OnPaddingFrame(frame)) {
3009 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3010 // Returning true since there was no parsing error.
3011 return true;
3012 }
3013 break;
3014 }
3015 case IETF_RST_STREAM: {
3016 QuicRstStreamFrame frame;
3017 if (!ProcessIetfResetStreamFrame(reader, &frame)) {
3018 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
3019 }
3020 if (!visitor_->OnRstStreamFrame(frame)) {
3021 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3022 // Returning true since there was no parsing error.
3023 return true;
3024 }
3025 break;
3026 }
fkastenholz04bd4f32019-04-16 12:24:38 -07003027 case IETF_APPLICATION_CLOSE:
QUICHE teama6ef0a62019-03-07 20:34:33 -05003028 case IETF_CONNECTION_CLOSE: {
3029 QuicConnectionCloseFrame frame;
fkastenholze9d71a82019-04-09 05:12:13 -07003030 if (!ProcessIetfConnectionCloseFrame(
fkastenholz04bd4f32019-04-16 12:24:38 -07003031 reader,
3032 (frame_type == IETF_CONNECTION_CLOSE)
3033 ? IETF_QUIC_TRANSPORT_CONNECTION_CLOSE
3034 : IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
3035 &frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003036 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
3037 }
3038 if (!visitor_->OnConnectionCloseFrame(frame)) {
3039 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3040 // Returning true since there was no parsing error.
3041 return true;
3042 }
3043 break;
3044 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05003045 case IETF_MAX_DATA: {
3046 QuicWindowUpdateFrame frame;
3047 if (!ProcessMaxDataFrame(reader, &frame)) {
3048 return RaiseError(QUIC_INVALID_MAX_DATA_FRAME_DATA);
3049 }
3050 // TODO(fkastenholz): Or should we create a new visitor function,
3051 // OnMaxDataFrame()?
3052 if (!visitor_->OnWindowUpdateFrame(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_MAX_STREAM_DATA: {
3060 QuicWindowUpdateFrame frame;
3061 if (!ProcessMaxStreamDataFrame(reader, &frame)) {
3062 return RaiseError(QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
3063 }
3064 // TODO(fkastenholz): Or should we create a new visitor function,
3065 // OnMaxStreamDataFrame()?
3066 if (!visitor_->OnWindowUpdateFrame(frame)) {
3067 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3068 // Returning true since there was no parsing error.
3069 return true;
3070 }
3071 break;
3072 }
3073 case IETF_MAX_STREAMS_BIDIRECTIONAL:
3074 case IETF_MAX_STREAMS_UNIDIRECTIONAL: {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003075 QuicMaxStreamsFrame frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003076 if (!ProcessMaxStreamsFrame(reader, &frame, frame_type)) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003077 return RaiseError(QUIC_MAX_STREAMS_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003078 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07003079 QUIC_CODE_COUNT_N(quic_max_streams_received, 1, 2);
3080 if (!visitor_->OnMaxStreamsFrame(frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003081 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3082 // Returning true since there was no parsing error.
3083 return true;
3084 }
3085 break;
3086 }
3087 case IETF_PING: {
3088 // Ping has no payload.
3089 QuicPingFrame ping_frame;
3090 if (!visitor_->OnPingFrame(ping_frame)) {
3091 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_BLOCKED: {
3098 QuicBlockedFrame frame;
3099 if (!ProcessIetfBlockedFrame(reader, &frame)) {
3100 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
3101 }
3102 if (!visitor_->OnBlockedFrame(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_STREAM_BLOCKED: {
3110 QuicBlockedFrame frame;
3111 if (!ProcessStreamBlockedFrame(reader, &frame)) {
3112 return RaiseError(QUIC_INVALID_STREAM_BLOCKED_DATA);
3113 }
3114 if (!visitor_->OnBlockedFrame(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_STREAMS_BLOCKED_UNIDIRECTIONAL:
3122 case IETF_STREAMS_BLOCKED_BIDIRECTIONAL: {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003123 QuicStreamsBlockedFrame frame;
QUICHE teama6ef0a62019-03-07 20:34:33 -05003124 if (!ProcessStreamsBlockedFrame(reader, &frame, frame_type)) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07003125 return RaiseError(QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003126 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07003127 QUIC_CODE_COUNT_N(quic_streams_blocked_received, 1, 2);
3128 if (!visitor_->OnStreamsBlockedFrame(frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003129 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3130 // Returning true since there was no parsing error.
3131 return true;
3132 }
3133 break;
3134 }
3135 case IETF_NEW_CONNECTION_ID: {
3136 QuicNewConnectionIdFrame frame;
3137 if (!ProcessNewConnectionIdFrame(reader, &frame)) {
3138 return RaiseError(QUIC_INVALID_NEW_CONNECTION_ID_DATA);
3139 }
3140 if (!visitor_->OnNewConnectionIdFrame(frame)) {
3141 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3142 // Returning true since there was no parsing error.
3143 return true;
3144 }
3145 break;
3146 }
3147 case IETF_RETIRE_CONNECTION_ID: {
3148 QuicRetireConnectionIdFrame frame;
3149 if (!ProcessRetireConnectionIdFrame(reader, &frame)) {
3150 return RaiseError(QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
3151 }
3152 if (!visitor_->OnRetireConnectionIdFrame(frame)) {
3153 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3154 // Returning true since there was no parsing error.
3155 return true;
3156 }
3157 break;
3158 }
3159 case IETF_NEW_TOKEN: {
3160 QuicNewTokenFrame frame;
3161 if (!ProcessNewTokenFrame(reader, &frame)) {
3162 return RaiseError(QUIC_INVALID_NEW_TOKEN);
3163 }
3164 if (!visitor_->OnNewTokenFrame(frame)) {
3165 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3166 // Returning true since there was no parsing error.
3167 return true;
3168 }
3169 break;
3170 }
3171 case IETF_STOP_SENDING: {
3172 QuicStopSendingFrame frame;
3173 if (!ProcessStopSendingFrame(reader, &frame)) {
3174 return RaiseError(QUIC_INVALID_STOP_SENDING_FRAME_DATA);
3175 }
3176 if (!visitor_->OnStopSendingFrame(frame)) {
3177 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3178 // Returning true since there was no parsing error.
3179 return true;
3180 }
3181 break;
3182 }
3183 case IETF_ACK_ECN:
3184 case IETF_ACK: {
3185 QuicAckFrame frame;
3186 if (!ProcessIetfAckFrame(reader, frame_type, &frame)) {
3187 return RaiseError(QUIC_INVALID_ACK_DATA);
3188 }
3189 break;
3190 }
3191 case IETF_PATH_CHALLENGE: {
3192 QuicPathChallengeFrame frame;
3193 if (!ProcessPathChallengeFrame(reader, &frame)) {
3194 return RaiseError(QUIC_INVALID_PATH_CHALLENGE_DATA);
3195 }
3196 if (!visitor_->OnPathChallengeFrame(frame)) {
3197 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3198 // Returning true since there was no parsing error.
3199 return true;
3200 }
3201 break;
3202 }
3203 case IETF_PATH_RESPONSE: {
3204 QuicPathResponseFrame frame;
3205 if (!ProcessPathResponseFrame(reader, &frame)) {
3206 return RaiseError(QUIC_INVALID_PATH_RESPONSE_DATA);
3207 }
3208 if (!visitor_->OnPathResponseFrame(frame)) {
3209 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3210 // Returning true since there was no parsing error.
3211 return true;
3212 }
3213 break;
3214 }
3215 case IETF_EXTENSION_MESSAGE_NO_LENGTH:
3216 QUIC_FALLTHROUGH_INTENDED;
3217 case IETF_EXTENSION_MESSAGE: {
3218 QuicMessageFrame message_frame;
3219 if (!ProcessMessageFrame(
3220 reader, frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
3221 &message_frame)) {
3222 return RaiseError(QUIC_INVALID_MESSAGE_DATA);
3223 }
3224 if (!visitor_->OnMessageFrame(message_frame)) {
3225 QUIC_DVLOG(1) << ENDPOINT
3226 << "Visitor asked to stop further processing.";
3227 // Returning true since there was no parsing error.
3228 return true;
3229 }
3230 break;
3231 }
3232 case IETF_CRYPTO: {
3233 QuicCryptoFrame frame;
3234 if (!ProcessCryptoFrame(reader, &frame)) {
3235 return RaiseError(QUIC_INVALID_FRAME_DATA);
3236 }
3237 if (!visitor_->OnCryptoFrame(frame)) {
3238 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3239 // Returning true since there was no parsing error.
3240 return true;
3241 }
3242 break;
3243 }
3244
3245 default:
3246 set_detailed_error("Illegal frame type.");
3247 QUIC_DLOG(WARNING)
3248 << ENDPOINT
3249 << "Illegal frame type: " << static_cast<int>(frame_type);
3250 return RaiseError(QUIC_INVALID_FRAME_DATA);
3251 }
3252 }
3253 }
3254 return true;
3255}
3256
3257namespace {
3258// Create a mask that sets the last |num_bits| to 1 and the rest to 0.
3259inline uint8_t GetMaskFromNumBits(uint8_t num_bits) {
3260 return (1u << num_bits) - 1;
3261}
3262
3263// Extract |num_bits| from |flags| offset by |offset|.
3264uint8_t ExtractBits(uint8_t flags, uint8_t num_bits, uint8_t offset) {
3265 return (flags >> offset) & GetMaskFromNumBits(num_bits);
3266}
3267
3268// Extract the bit at position |offset| from |flags| as a bool.
3269bool ExtractBit(uint8_t flags, uint8_t offset) {
3270 return ((flags >> offset) & GetMaskFromNumBits(1)) != 0;
3271}
3272
3273// Set |num_bits|, offset by |offset| to |val| in |flags|.
3274void SetBits(uint8_t* flags, uint8_t val, uint8_t num_bits, uint8_t offset) {
3275 DCHECK_LE(val, GetMaskFromNumBits(num_bits));
3276 *flags |= val << offset;
3277}
3278
3279// Set the bit at position |offset| to |val| in |flags|.
3280void SetBit(uint8_t* flags, bool val, uint8_t offset) {
3281 SetBits(flags, val ? 1 : 0, 1, offset);
3282}
3283} // namespace
3284
3285bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader,
3286 uint8_t frame_type,
3287 QuicStreamFrame* frame) {
3288 uint8_t stream_flags = frame_type;
3289
3290 uint8_t stream_id_length = 0;
3291 uint8_t offset_length = 4;
3292 bool has_data_length = true;
3293 stream_flags &= ~kQuicFrameTypeStreamMask;
3294
3295 // Read from right to left: StreamID, Offset, Data Length, Fin.
3296 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1;
3297 stream_flags >>= kQuicStreamIdShift;
3298
3299 offset_length = (stream_flags & kQuicStreamOffsetMask);
3300 // There is no encoding for 1 byte, only 0 and 2 through 8.
3301 if (offset_length > 0) {
3302 offset_length += 1;
3303 }
3304 stream_flags >>= kQuicStreamShift;
3305
3306 has_data_length =
3307 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask;
3308 stream_flags >>= kQuicStreamDataLengthShift;
3309
3310 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
3311
3312 uint64_t stream_id;
3313 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) {
3314 set_detailed_error("Unable to read stream_id.");
3315 return false;
3316 }
3317 frame->stream_id = static_cast<QuicStreamId>(stream_id);
3318
3319 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) {
3320 set_detailed_error("Unable to read offset.");
3321 return false;
3322 }
3323
3324 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3325 QuicStringPiece data;
3326 if (has_data_length) {
3327 if (!reader->ReadStringPiece16(&data)) {
3328 set_detailed_error("Unable to read frame data.");
3329 return false;
3330 }
3331 } else {
3332 if (!reader->ReadStringPiece(&data, reader->BytesRemaining())) {
3333 set_detailed_error("Unable to read frame data.");
3334 return false;
3335 }
3336 }
3337 frame->data_buffer = data.data();
3338 frame->data_length = static_cast<uint16_t>(data.length());
3339
3340 return true;
3341}
3342
3343bool QuicFramer::ProcessIetfStreamFrame(QuicDataReader* reader,
3344 uint8_t frame_type,
3345 QuicStreamFrame* frame) {
3346 // Read stream id from the frame. It's always present.
fkastenholz3c4eabf2019-04-22 07:49:59 -07003347 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05003348 set_detailed_error("Unable to read stream_id.");
3349 return false;
3350 }
3351
3352 // If we have a data offset, read it. If not, set to 0.
3353 if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
3354 if (!reader->ReadVarInt62(&frame->offset)) {
3355 set_detailed_error("Unable to read stream data offset.");
3356 return false;
3357 }
3358 } else {
3359 // no offset in the frame, ensure it's 0 in the Frame.
3360 frame->offset = 0;
3361 }
3362
3363 // If we have a data length, read it. If not, set to 0.
3364 if (frame_type & IETF_STREAM_FRAME_LEN_BIT) {
3365 QuicIetfStreamDataLength length;
3366 if (!reader->ReadVarInt62(&length)) {
3367 set_detailed_error("Unable to read stream data length.");
3368 return false;
3369 }
3370 if (length > 0xffff) {
3371 set_detailed_error("Stream data length is too large.");
3372 return false;
3373 }
3374 frame->data_length = length;
3375 } else {
3376 // no length in the frame, it is the number of bytes remaining in the
3377 // packet.
3378 frame->data_length = reader->BytesRemaining();
3379 }
3380
3381 if (frame_type & IETF_STREAM_FRAME_FIN_BIT) {
3382 frame->fin = true;
3383 } else {
3384 frame->fin = false;
3385 }
3386
3387 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3388 QuicStringPiece data;
3389 if (!reader->ReadStringPiece(&data, frame->data_length)) {
3390 set_detailed_error("Unable to read frame data.");
3391 return false;
3392 }
3393 frame->data_buffer = data.data();
3394 frame->data_length = static_cast<QuicIetfStreamDataLength>(data.length());
3395
3396 return true;
3397}
3398
3399bool QuicFramer::ProcessCryptoFrame(QuicDataReader* reader,
3400 QuicCryptoFrame* frame) {
3401 if (!reader->ReadVarInt62(&frame->offset)) {
3402 set_detailed_error("Unable to read crypto data offset.");
3403 return false;
3404 }
3405 uint64_t len;
3406 if (!reader->ReadVarInt62(&len) ||
3407 len > std::numeric_limits<QuicPacketLength>::max()) {
3408 set_detailed_error("Invalid data length.");
3409 return false;
3410 }
3411 frame->data_length = len;
3412
3413 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3414 QuicStringPiece data;
3415 if (!reader->ReadStringPiece(&data, frame->data_length)) {
3416 set_detailed_error("Unable to read frame data.");
3417 return false;
3418 }
3419 frame->data_buffer = data.data();
3420 return true;
3421}
3422
3423bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type) {
3424 const bool has_ack_blocks =
3425 ExtractBit(frame_type, kQuicHasMultipleAckBlocksOffset);
3426 uint8_t num_ack_blocks = 0;
3427 uint8_t num_received_packets = 0;
3428
3429 // Determine the two lengths from the frame type: largest acked length,
3430 // ack block length.
3431 const QuicPacketNumberLength ack_block_length = ReadAckPacketNumberLength(
3432 version_.transport_version,
3433 ExtractBits(frame_type, kQuicSequenceNumberLengthNumBits,
3434 kActBlockLengthOffset));
3435 const QuicPacketNumberLength largest_acked_length = ReadAckPacketNumberLength(
3436 version_.transport_version,
3437 ExtractBits(frame_type, kQuicSequenceNumberLengthNumBits,
3438 kLargestAckedOffset));
3439
3440 uint64_t largest_acked;
3441 if (!reader->ReadBytesToUInt64(largest_acked_length, &largest_acked)) {
3442 set_detailed_error("Unable to read largest acked.");
3443 return false;
3444 }
3445
3446 if (largest_acked < first_sending_packet_number_.ToUint64()) {
3447 // Connection always sends packet starting from kFirstSendingPacketNumber >
3448 // 0, peer has observed an unsent packet.
3449 set_detailed_error("Largest acked is 0.");
3450 return false;
3451 }
3452
3453 uint64_t ack_delay_time_us;
3454 if (!reader->ReadUFloat16(&ack_delay_time_us)) {
3455 set_detailed_error("Unable to read ack delay time.");
3456 return false;
3457 }
3458
3459 if (!visitor_->OnAckFrameStart(
3460 QuicPacketNumber(largest_acked),
3461 ack_delay_time_us == kUFloat16MaxValue
3462 ? QuicTime::Delta::Infinite()
3463 : QuicTime::Delta::FromMicroseconds(ack_delay_time_us))) {
3464 // The visitor suppresses further processing of the packet. Although this is
3465 // not a parsing error, returns false as this is in middle of processing an
3466 // ack frame,
3467 set_detailed_error("Visitor suppresses further processing of ack frame.");
3468 return false;
3469 }
3470
3471 if (has_ack_blocks && !reader->ReadUInt8(&num_ack_blocks)) {
3472 set_detailed_error("Unable to read num of ack blocks.");
3473 return false;
3474 }
3475
3476 uint64_t first_block_length;
3477 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) {
3478 set_detailed_error("Unable to read first ack block length.");
3479 return false;
3480 }
3481
3482 if (first_block_length == 0) {
3483 set_detailed_error("First block length is zero.");
3484 return false;
3485 }
3486 bool first_ack_block_underflow = first_block_length > largest_acked + 1;
3487 if (first_block_length + first_sending_packet_number_.ToUint64() >
3488 largest_acked + 1) {
3489 first_ack_block_underflow = true;
3490 }
3491 if (first_ack_block_underflow) {
3492 set_detailed_error(QuicStrCat("Underflow with first ack block length ",
3493 first_block_length, " largest acked is ",
3494 largest_acked, ".")
3495 .c_str());
3496 return false;
3497 }
3498
3499 uint64_t first_received = largest_acked + 1 - first_block_length;
3500 if (!visitor_->OnAckRange(QuicPacketNumber(first_received),
3501 QuicPacketNumber(largest_acked + 1))) {
3502 // The visitor suppresses further processing of the packet. Although
3503 // this is not a parsing error, returns false as this is in middle
3504 // of processing an ack frame,
3505 set_detailed_error("Visitor suppresses further processing of ack frame.");
3506 return false;
3507 }
3508
3509 if (num_ack_blocks > 0) {
3510 for (size_t i = 0; i < num_ack_blocks; ++i) {
3511 uint8_t gap = 0;
3512 if (!reader->ReadUInt8(&gap)) {
3513 set_detailed_error("Unable to read gap to next ack block.");
3514 return false;
3515 }
3516 uint64_t current_block_length;
3517 if (!reader->ReadBytesToUInt64(ack_block_length, &current_block_length)) {
3518 set_detailed_error("Unable to ack block length.");
3519 return false;
3520 }
3521 bool ack_block_underflow = first_received < gap + current_block_length;
3522 if (first_received < gap + current_block_length +
3523 first_sending_packet_number_.ToUint64()) {
3524 ack_block_underflow = true;
3525 }
3526 if (ack_block_underflow) {
3527 set_detailed_error(
3528 QuicStrCat("Underflow with ack block length ", current_block_length,
3529 ", end of block is ", first_received - gap, ".")
3530 .c_str());
3531 return false;
3532 }
3533
3534 first_received -= (gap + current_block_length);
3535 if (current_block_length > 0) {
3536 if (!visitor_->OnAckRange(
3537 QuicPacketNumber(first_received),
3538 QuicPacketNumber(first_received) + current_block_length)) {
3539 // The visitor suppresses further processing of the packet. Although
3540 // this is not a parsing error, returns false as this is in middle
3541 // of processing an ack frame,
3542 set_detailed_error(
3543 "Visitor suppresses further processing of ack frame.");
3544 return false;
3545 }
3546 }
3547 }
3548 }
3549
3550 if (!reader->ReadUInt8(&num_received_packets)) {
3551 set_detailed_error("Unable to read num received packets.");
3552 return false;
3553 }
3554
3555 if (!ProcessTimestampsInAckFrame(num_received_packets,
3556 QuicPacketNumber(largest_acked), reader)) {
3557 return false;
3558 }
3559
3560 // Done processing the ACK frame.
3561 return visitor_->OnAckFrameEnd(QuicPacketNumber(first_received));
3562}
3563
3564bool QuicFramer::ProcessTimestampsInAckFrame(uint8_t num_received_packets,
3565 QuicPacketNumber largest_acked,
3566 QuicDataReader* reader) {
3567 if (num_received_packets == 0) {
3568 return true;
3569 }
3570 uint8_t delta_from_largest_observed;
3571 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3572 set_detailed_error("Unable to read sequence delta in received packets.");
3573 return false;
3574 }
3575
3576 if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3577 set_detailed_error(QuicStrCat("delta_from_largest_observed too high: ",
3578 delta_from_largest_observed,
3579 ", largest_acked: ", largest_acked.ToUint64())
3580 .c_str());
3581 return false;
3582 }
3583
3584 // Time delta from the framer creation.
3585 uint32_t time_delta_us;
3586 if (!reader->ReadUInt32(&time_delta_us)) {
3587 set_detailed_error("Unable to read time delta in received packets.");
3588 return false;
3589 }
3590
3591 QuicPacketNumber seq_num = largest_acked - delta_from_largest_observed;
3592 if (process_timestamps_) {
3593 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
3594
3595 visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3596 }
3597
3598 for (uint8_t i = 1; i < num_received_packets; ++i) {
3599 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3600 set_detailed_error("Unable to read sequence delta in received packets.");
3601 return false;
3602 }
3603 if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3604 set_detailed_error(
3605 QuicStrCat("delta_from_largest_observed too high: ",
3606 delta_from_largest_observed,
3607 ", largest_acked: ", largest_acked.ToUint64())
3608 .c_str());
3609 return false;
3610 }
3611 seq_num = largest_acked - delta_from_largest_observed;
3612
3613 // Time delta from the previous timestamp.
3614 uint64_t incremental_time_delta_us;
3615 if (!reader->ReadUFloat16(&incremental_time_delta_us)) {
3616 set_detailed_error(
3617 "Unable to read incremental time delta in received packets.");
3618 return false;
3619 }
3620
3621 if (process_timestamps_) {
3622 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds(
3623 incremental_time_delta_us);
3624 visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3625 }
3626 }
3627 return true;
3628}
3629
3630bool QuicFramer::ProcessIetfAckFrame(QuicDataReader* reader,
3631 uint64_t frame_type,
3632 QuicAckFrame* ack_frame) {
3633 uint64_t largest_acked;
3634 if (!reader->ReadVarInt62(&largest_acked)) {
3635 set_detailed_error("Unable to read largest acked.");
3636 return false;
3637 }
3638 if (largest_acked < first_sending_packet_number_.ToUint64()) {
3639 // Connection always sends packet starting from kFirstSendingPacketNumber >
3640 // 0, peer has observed an unsent packet.
3641 set_detailed_error("Largest acked is 0.");
3642 return false;
3643 }
3644 ack_frame->largest_acked = static_cast<QuicPacketNumber>(largest_acked);
3645 uint64_t ack_delay_time_in_us;
3646 if (!reader->ReadVarInt62(&ack_delay_time_in_us)) {
3647 set_detailed_error("Unable to read ack delay time.");
3648 return false;
3649 }
3650
3651 // TODO(fkastenholz) when we get real IETF QUIC, need to get
3652 // the currect shift from the transport parameters.
3653 if (ack_delay_time_in_us == kVarInt62MaxValue) {
3654 ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
3655 } else {
3656 ack_delay_time_in_us = (ack_delay_time_in_us << kIetfAckTimestampShift);
3657 ack_frame->ack_delay_time =
3658 QuicTime::Delta::FromMicroseconds(ack_delay_time_in_us);
3659 }
3660 if (frame_type == IETF_ACK_ECN) {
3661 ack_frame->ecn_counters_populated = true;
3662 if (!reader->ReadVarInt62(&ack_frame->ect_0_count)) {
3663 set_detailed_error("Unable to read ack ect_0_count.");
3664 return false;
3665 }
3666 if (!reader->ReadVarInt62(&ack_frame->ect_1_count)) {
3667 set_detailed_error("Unable to read ack ect_1_count.");
3668 return false;
3669 }
3670 if (!reader->ReadVarInt62(&ack_frame->ecn_ce_count)) {
3671 set_detailed_error("Unable to read ack ecn_ce_count.");
3672 return false;
3673 }
3674 } else {
3675 ack_frame->ecn_counters_populated = false;
3676 ack_frame->ect_0_count = 0;
3677 ack_frame->ect_1_count = 0;
3678 ack_frame->ecn_ce_count = 0;
3679 }
3680 if (!visitor_->OnAckFrameStart(QuicPacketNumber(largest_acked),
3681 ack_frame->ack_delay_time)) {
3682 // The visitor suppresses further processing of the packet. Although this is
3683 // not a parsing error, returns false as this is in middle of processing an
3684 // ACK frame.
3685 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3686 return false;
3687 }
3688
3689 // Get number of ACK blocks from the packet.
3690 uint64_t ack_block_count;
3691 if (!reader->ReadVarInt62(&ack_block_count)) {
3692 set_detailed_error("Unable to read ack block count.");
3693 return false;
3694 }
3695 // There always is a first ACK block, which is the (number of packets being
3696 // acked)-1, up to and including the packet at largest_acked. Therefore if the
3697 // value is 0, then only largest is acked. If it is 1, then largest-1,
3698 // largest] are acked, etc
3699 uint64_t ack_block_value;
3700 if (!reader->ReadVarInt62(&ack_block_value)) {
3701 set_detailed_error("Unable to read first ack block length.");
3702 return false;
3703 }
3704 // Calculate the packets being acked in the first block.
3705 // +1 because AddRange implementation requires [low,high)
3706 uint64_t block_high = largest_acked + 1;
3707 uint64_t block_low = largest_acked - ack_block_value;
3708
3709 // ack_block_value is the number of packets preceding the
3710 // largest_acked packet which are in the block being acked. Thus,
3711 // its maximum value is largest_acked-1. Test this, reporting an
3712 // error if the value is wrong.
3713 if (ack_block_value + first_sending_packet_number_.ToUint64() >
3714 largest_acked) {
3715 set_detailed_error(QuicStrCat("Underflow with first ack block length ",
3716 ack_block_value + 1, " largest acked is ",
3717 largest_acked, ".")
3718 .c_str());
3719 return false;
3720 }
3721
3722 if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3723 QuicPacketNumber(block_high))) {
3724 // The visitor suppresses further processing of the packet. Although
3725 // this is not a parsing error, returns false as this is in middle
3726 // of processing an ACK frame.
3727 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3728 return false;
3729 }
3730
3731 while (ack_block_count != 0) {
3732 uint64_t gap_block_value;
3733 // Get the sizes of the gap and ack blocks,
3734 if (!reader->ReadVarInt62(&gap_block_value)) {
3735 set_detailed_error("Unable to read gap block value.");
3736 return false;
3737 }
3738 // It's an error if the gap is larger than the space from packet
3739 // number 0 to the start of the block that's just been acked, PLUS
3740 // there must be space for at least 1 packet to be acked. For
3741 // example, if block_low is 10 and gap_block_value is 9, it means
3742 // the gap block is 10 packets long, leaving no room for a packet
3743 // to be acked. Thus, gap_block_value+2 can not be larger than
3744 // block_low.
3745 // The test is written this way to detect wrap-arounds.
3746 if ((gap_block_value + 2) > block_low) {
3747 set_detailed_error(
3748 QuicStrCat("Underflow with gap block length ", gap_block_value + 1,
3749 " previous ack block start is ", block_low, ".")
3750 .c_str());
3751 return false;
3752 }
3753
3754 // Adjust block_high to be the top of the next ack block.
3755 // There is a gap of |gap_block_value| packets between the bottom
3756 // of ack block N and top of block N+1. Note that gap_block_value
3757 // is he size of the gap minus 1 (per the QUIC protocol), and
3758 // block_high is the packet number of the first packet of the gap
3759 // (per the implementation of OnAckRange/AddAckRange, below).
3760 block_high = block_low - 1 - gap_block_value;
3761
3762 if (!reader->ReadVarInt62(&ack_block_value)) {
3763 set_detailed_error("Unable to read ack block value.");
3764 return false;
3765 }
3766 if (ack_block_value + first_sending_packet_number_.ToUint64() >
3767 (block_high - 1)) {
3768 set_detailed_error(
3769 QuicStrCat("Underflow with ack block length ", ack_block_value + 1,
3770 " latest ack block end is ", block_high - 1, ".")
3771 .c_str());
3772 return false;
3773 }
3774 // Calculate the low end of the new nth ack block. The +1 is
3775 // because the encoded value is the blocksize-1.
3776 block_low = block_high - 1 - ack_block_value;
3777 if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3778 QuicPacketNumber(block_high))) {
3779 // The visitor suppresses further processing of the packet. Although
3780 // this is not a parsing error, returns false as this is in middle
3781 // of processing an ACK frame.
3782 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3783 return false;
3784 }
3785
3786 // Another one done.
3787 ack_block_count--;
3788 }
3789
3790 return visitor_->OnAckFrameEnd(QuicPacketNumber(block_low));
3791}
3792
3793bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
3794 const QuicPacketHeader& header,
3795 QuicStopWaitingFrame* stop_waiting) {
3796 uint64_t least_unacked_delta;
3797 if (!reader->ReadBytesToUInt64(header.packet_number_length,
3798 &least_unacked_delta)) {
3799 set_detailed_error("Unable to read least unacked delta.");
3800 return false;
3801 }
3802 if (header.packet_number.ToUint64() <= least_unacked_delta) {
3803 set_detailed_error("Invalid unacked delta.");
3804 return false;
3805 }
3806 stop_waiting->least_unacked = header.packet_number - least_unacked_delta;
3807
3808 return true;
3809}
3810
3811bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader,
3812 QuicRstStreamFrame* frame) {
3813 if (!reader->ReadUInt32(&frame->stream_id)) {
3814 set_detailed_error("Unable to read stream_id.");
3815 return false;
3816 }
3817
3818 if (!reader->ReadUInt64(&frame->byte_offset)) {
3819 set_detailed_error("Unable to read rst stream sent byte offset.");
3820 return false;
3821 }
3822
3823 uint32_t error_code;
3824 if (!reader->ReadUInt32(&error_code)) {
3825 set_detailed_error("Unable to read rst stream error code.");
3826 return false;
3827 }
3828
3829 if (error_code >= QUIC_STREAM_LAST_ERROR) {
3830 // Ignore invalid stream error code if any.
3831 error_code = QUIC_STREAM_LAST_ERROR;
3832 }
3833
3834 frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
3835
3836 return true;
3837}
3838
3839bool QuicFramer::ProcessConnectionCloseFrame(QuicDataReader* reader,
3840 QuicConnectionCloseFrame* frame) {
3841 uint32_t error_code;
fkastenholze9d71a82019-04-09 05:12:13 -07003842 frame->close_type = GOOGLE_QUIC_CONNECTION_CLOSE;
3843
QUICHE teama6ef0a62019-03-07 20:34:33 -05003844 if (!reader->ReadUInt32(&error_code)) {
3845 set_detailed_error("Unable to read connection close error code.");
3846 return false;
3847 }
3848
3849 if (error_code >= QUIC_LAST_ERROR) {
3850 // Ignore invalid QUIC error code if any.
3851 error_code = QUIC_LAST_ERROR;
3852 }
3853
fkastenholze9d71a82019-04-09 05:12:13 -07003854 frame->quic_error_code = static_cast<QuicErrorCode>(error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003855
3856 QuicStringPiece error_details;
3857 if (!reader->ReadStringPiece16(&error_details)) {
3858 set_detailed_error("Unable to read connection close error details.");
3859 return false;
3860 }
vasilvvc48c8712019-03-11 13:38:16 -07003861 frame->error_details = std::string(error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003862
3863 return true;
3864}
3865
3866bool QuicFramer::ProcessGoAwayFrame(QuicDataReader* reader,
3867 QuicGoAwayFrame* frame) {
3868 uint32_t error_code;
3869 if (!reader->ReadUInt32(&error_code)) {
3870 set_detailed_error("Unable to read go away error code.");
3871 return false;
3872 }
3873
3874 if (error_code >= QUIC_LAST_ERROR) {
3875 // Ignore invalid QUIC error code if any.
3876 error_code = QUIC_LAST_ERROR;
3877 }
3878 frame->error_code = static_cast<QuicErrorCode>(error_code);
3879
3880 uint32_t stream_id;
3881 if (!reader->ReadUInt32(&stream_id)) {
3882 set_detailed_error("Unable to read last good stream id.");
3883 return false;
3884 }
3885 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
3886
3887 QuicStringPiece reason_phrase;
3888 if (!reader->ReadStringPiece16(&reason_phrase)) {
3889 set_detailed_error("Unable to read goaway reason.");
3890 return false;
3891 }
vasilvvc48c8712019-03-11 13:38:16 -07003892 frame->reason_phrase = std::string(reason_phrase);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003893
3894 return true;
3895}
3896
3897bool QuicFramer::ProcessWindowUpdateFrame(QuicDataReader* reader,
3898 QuicWindowUpdateFrame* frame) {
3899 if (!reader->ReadUInt32(&frame->stream_id)) {
3900 set_detailed_error("Unable to read stream_id.");
3901 return false;
3902 }
3903
3904 if (!reader->ReadUInt64(&frame->byte_offset)) {
3905 set_detailed_error("Unable to read window byte_offset.");
3906 return false;
3907 }
3908
3909 return true;
3910}
3911
3912bool QuicFramer::ProcessBlockedFrame(QuicDataReader* reader,
3913 QuicBlockedFrame* frame) {
3914 DCHECK_NE(QUIC_VERSION_99, version_.transport_version)
3915 << "Attempt to process non-IETF frames but version is 99";
3916
3917 if (!reader->ReadUInt32(&frame->stream_id)) {
3918 set_detailed_error("Unable to read stream_id.");
3919 return false;
3920 }
3921
3922 return true;
3923}
3924
3925void QuicFramer::ProcessPaddingFrame(QuicDataReader* reader,
3926 QuicPaddingFrame* frame) {
3927 // Type byte has been read.
3928 frame->num_padding_bytes = 1;
3929 uint8_t next_byte;
3930 while (!reader->IsDoneReading() && reader->PeekByte() == 0x00) {
3931 reader->ReadBytes(&next_byte, 1);
3932 DCHECK_EQ(0x00, next_byte);
3933 ++frame->num_padding_bytes;
3934 }
3935}
3936
3937bool QuicFramer::ProcessMessageFrame(QuicDataReader* reader,
3938 bool no_message_length,
3939 QuicMessageFrame* frame) {
3940 if (no_message_length) {
3941 QuicStringPiece remaining(reader->ReadRemainingPayload());
3942 frame->data = remaining.data();
3943 frame->message_length = remaining.length();
3944 return true;
3945 }
3946
3947 uint64_t message_length;
3948 if (!reader->ReadVarInt62(&message_length)) {
3949 set_detailed_error("Unable to read message length");
3950 return false;
3951 }
3952
3953 QuicStringPiece message_piece;
3954 if (!reader->ReadStringPiece(&message_piece, message_length)) {
3955 set_detailed_error("Unable to read message data");
3956 return false;
3957 }
3958
3959 frame->data = message_piece.data();
3960 frame->message_length = message_length;
3961
3962 return true;
3963}
3964
3965// static
3966QuicStringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
3967 QuicTransportVersion version,
3968 const QuicEncryptedPacket& encrypted,
3969 QuicConnectionIdLength destination_connection_id_length,
3970 QuicConnectionIdLength source_connection_id_length,
3971 bool includes_version,
3972 bool includes_diversification_nonce,
3973 QuicPacketNumberLength packet_number_length,
3974 QuicVariableLengthIntegerLength retry_token_length_length,
3975 uint64_t retry_token_length,
3976 QuicVariableLengthIntegerLength length_length) {
3977 // TODO(ianswett): This is identical to QuicData::AssociatedData.
3978 return QuicStringPiece(
3979 encrypted.data(),
3980 GetStartOfEncryptedData(version, destination_connection_id_length,
3981 source_connection_id_length, includes_version,
3982 includes_diversification_nonce,
3983 packet_number_length, retry_token_length_length,
3984 retry_token_length, length_length));
3985}
3986
3987void QuicFramer::SetDecrypter(EncryptionLevel level,
3988 std::unique_ptr<QuicDecrypter> decrypter) {
QUICHE team76086e42019-03-25 15:12:29 -07003989 DCHECK_EQ(alternative_decrypter_level_, NUM_ENCRYPTION_LEVELS);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003990 DCHECK_GE(level, decrypter_level_);
zhongyi546cc452019-04-12 15:27:49 -07003991 DCHECK(!version_.KnowsWhichDecrypterToUse());
QUICHE team76086e42019-03-25 15:12:29 -07003992 decrypter_[decrypter_level_] = nullptr;
3993 decrypter_[level] = std::move(decrypter);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003994 decrypter_level_ = level;
3995}
3996
3997void QuicFramer::SetAlternativeDecrypter(
3998 EncryptionLevel level,
3999 std::unique_ptr<QuicDecrypter> decrypter,
4000 bool latch_once_used) {
QUICHE team76086e42019-03-25 15:12:29 -07004001 DCHECK_NE(level, decrypter_level_);
zhongyi546cc452019-04-12 15:27:49 -07004002 DCHECK(!version_.KnowsWhichDecrypterToUse());
QUICHE team76086e42019-03-25 15:12:29 -07004003 if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
4004 decrypter_[alternative_decrypter_level_] = nullptr;
4005 }
4006 decrypter_[level] = std::move(decrypter);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004007 alternative_decrypter_level_ = level;
4008 alternative_decrypter_latch_ = latch_once_used;
4009}
4010
zhongyi546cc452019-04-12 15:27:49 -07004011void QuicFramer::InstallDecrypter(EncryptionLevel level,
4012 std::unique_ptr<QuicDecrypter> decrypter) {
4013 DCHECK(version_.KnowsWhichDecrypterToUse());
4014 decrypter_[level] = std::move(decrypter);
4015}
4016
4017void QuicFramer::RemoveDecrypter(EncryptionLevel level) {
4018 DCHECK(version_.KnowsWhichDecrypterToUse());
4019 decrypter_[level] = nullptr;
4020}
4021
4022const QuicDecrypter* QuicFramer::GetDecrypter(EncryptionLevel level) const {
4023 DCHECK(version_.KnowsWhichDecrypterToUse());
4024 return decrypter_[level].get();
4025}
4026
QUICHE teama6ef0a62019-03-07 20:34:33 -05004027const QuicDecrypter* QuicFramer::decrypter() const {
QUICHE team76086e42019-03-25 15:12:29 -07004028 return decrypter_[decrypter_level_].get();
QUICHE teama6ef0a62019-03-07 20:34:33 -05004029}
4030
4031const QuicDecrypter* QuicFramer::alternative_decrypter() const {
QUICHE team76086e42019-03-25 15:12:29 -07004032 if (alternative_decrypter_level_ == NUM_ENCRYPTION_LEVELS) {
4033 return nullptr;
4034 }
4035 return decrypter_[alternative_decrypter_level_].get();
QUICHE teama6ef0a62019-03-07 20:34:33 -05004036}
4037
4038void QuicFramer::SetEncrypter(EncryptionLevel level,
4039 std::unique_ptr<QuicEncrypter> encrypter) {
4040 DCHECK_GE(level, 0);
4041 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
4042 encrypter_[level] = std::move(encrypter);
4043}
4044
4045size_t QuicFramer::EncryptInPlace(EncryptionLevel level,
4046 QuicPacketNumber packet_number,
4047 size_t ad_len,
4048 size_t total_len,
4049 size_t buffer_len,
4050 char* buffer) {
4051 DCHECK(packet_number.IsInitialized());
dschinazi2c5386e2019-04-16 16:37:37 -07004052 if (encrypter_[level] == nullptr) {
4053 QUIC_BUG << ENDPOINT
4054 << "Attempted to encrypt in place without encrypter at level "
4055 << QuicUtils::EncryptionLevelToString(level);
4056 RaiseError(QUIC_ENCRYPTION_FAILURE);
4057 return 0;
4058 }
4059
QUICHE teama6ef0a62019-03-07 20:34:33 -05004060 size_t output_length = 0;
4061 if (!encrypter_[level]->EncryptPacket(
4062 packet_number.ToUint64(),
4063 QuicStringPiece(buffer, ad_len), // Associated data
4064 QuicStringPiece(buffer + ad_len, total_len - ad_len), // Plaintext
4065 buffer + ad_len, // Destination buffer
4066 &output_length, buffer_len - ad_len)) {
4067 RaiseError(QUIC_ENCRYPTION_FAILURE);
4068 return 0;
4069 }
nharper55fa6132019-05-07 19:37:21 -07004070 if (version_.HasHeaderProtection() &&
4071 !ApplyHeaderProtection(level, buffer, ad_len + output_length, ad_len)) {
4072 QUIC_DLOG(ERROR) << "Applying header protection failed.";
4073 RaiseError(QUIC_ENCRYPTION_FAILURE);
4074 return 0;
4075 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004076
4077 return ad_len + output_length;
4078}
4079
nharper55fa6132019-05-07 19:37:21 -07004080namespace {
4081
4082const size_t kHPSampleLen = 16;
4083
4084constexpr bool IsLongHeader(uint8_t type_byte) {
4085 return (type_byte & FLAGS_LONG_HEADER) != 0;
4086}
4087
4088} // namespace
4089
4090bool QuicFramer::ApplyHeaderProtection(EncryptionLevel level,
4091 char* buffer,
4092 size_t buffer_len,
4093 size_t ad_len) {
4094 QuicDataReader buffer_reader(buffer, buffer_len);
4095 QuicDataWriter buffer_writer(buffer_len, buffer);
4096 // The sample starts 4 bytes after the start of the packet number.
4097 if (ad_len < last_written_packet_number_length_) {
4098 return false;
4099 }
4100 size_t pn_offset = ad_len - last_written_packet_number_length_;
4101 // Sample the ciphertext and generate the mask to use for header protection.
4102 size_t sample_offset = pn_offset + 4;
4103 QuicDataReader sample_reader(buffer, buffer_len);
4104 QuicStringPiece sample;
4105 if (!sample_reader.Seek(sample_offset) ||
4106 !sample_reader.ReadStringPiece(&sample, kHPSampleLen)) {
4107 QUIC_BUG << "Not enough bytes to sample: sample_offset " << sample_offset
4108 << ", sample len: " << kHPSampleLen
4109 << ", buffer len: " << buffer_len;
4110 return false;
4111 }
4112
4113 std::string mask = encrypter_[level]->GenerateHeaderProtectionMask(sample);
4114 if (mask.empty()) {
4115 QUIC_BUG << "Unable to generate header protection mask.";
4116 return false;
4117 }
4118 QuicDataReader mask_reader(mask.data(), mask.size());
4119
4120 // Apply the mask to the 4 or 5 least significant bits of the first byte.
4121 uint8_t bitmask = 0x1f;
4122 uint8_t type_byte;
4123 if (!buffer_reader.ReadUInt8(&type_byte)) {
4124 return false;
4125 }
4126 QuicLongHeaderType header_type;
4127 if (IsLongHeader(type_byte)) {
4128 bitmask = 0x0f;
4129 if (!GetLongHeaderType(version_.transport_version, type_byte,
4130 &header_type)) {
4131 return false;
4132 }
4133 }
4134 uint8_t mask_byte;
4135 if (!mask_reader.ReadUInt8(&mask_byte) ||
4136 !buffer_writer.WriteUInt8(type_byte ^ (mask_byte & bitmask))) {
4137 return false;
4138 }
4139
4140 // Adjust |pn_offset| to account for the diversification nonce.
4141 if (IsLongHeader(type_byte) && header_type == ZERO_RTT_PROTECTED &&
4142 perspective_ == Perspective::IS_SERVER &&
4143 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
4144 if (pn_offset <= kDiversificationNonceSize) {
4145 QUIC_BUG << "Expected diversification nonce, but not enough bytes";
4146 return false;
4147 }
4148 pn_offset -= kDiversificationNonceSize;
4149 }
4150 // Advance the reader and writer to the packet number. Both the reader and
4151 // writer have each read/written one byte.
4152 if (!buffer_writer.Seek(pn_offset - 1) ||
4153 !buffer_reader.Seek(pn_offset - 1)) {
4154 return false;
4155 }
4156 // Apply the rest of the mask to the packet number.
4157 for (size_t i = 0; i < last_written_packet_number_length_; ++i) {
4158 uint8_t buffer_byte;
4159 uint8_t mask_byte;
4160 if (!mask_reader.ReadUInt8(&mask_byte) ||
4161 !buffer_reader.ReadUInt8(&buffer_byte) ||
4162 !buffer_writer.WriteUInt8(buffer_byte ^ mask_byte)) {
4163 return false;
4164 }
4165 }
4166 return true;
4167}
4168
4169bool QuicFramer::RemoveHeaderProtection(QuicDataReader* reader,
4170 const QuicEncryptedPacket& packet,
4171 QuicPacketHeader* header,
4172 uint64_t* full_packet_number,
4173 std::vector<char>* associated_data) {
4174 EncryptionLevel expected_decryption_level = GetEncryptionLevel(*header);
4175 QuicDecrypter* decrypter = decrypter_[expected_decryption_level].get();
4176 if (decrypter == nullptr) {
4177 QUIC_DVLOG(1)
4178 << "No decrypter available for removing header protection at level "
4179 << expected_decryption_level;
4180 return false;
4181 }
4182
4183 bool has_diversification_nonce =
4184 header->form == IETF_QUIC_LONG_HEADER_PACKET &&
4185 header->long_packet_type == ZERO_RTT_PROTECTED &&
4186 perspective_ == Perspective::IS_CLIENT &&
4187 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO;
4188
4189 // Read a sample from the ciphertext and compute the mask to use for header
4190 // protection.
4191 QuicStringPiece remaining_packet = reader->PeekRemainingPayload();
4192 QuicDataReader sample_reader(remaining_packet);
4193
4194 // The sample starts 4 bytes after the start of the packet number.
4195 QuicStringPiece pn;
4196 if (!sample_reader.ReadStringPiece(&pn, 4)) {
4197 QUIC_DVLOG(1) << "Not enough data to sample";
4198 return false;
4199 }
4200 if (has_diversification_nonce) {
4201 // In Google QUIC, the diversification nonce comes between the packet number
4202 // and the sample.
4203 if (!sample_reader.Seek(kDiversificationNonceSize)) {
4204 QUIC_DVLOG(1) << "No diversification nonce to skip over";
4205 return false;
4206 }
4207 }
4208 std::string mask = decrypter->GenerateHeaderProtectionMask(&sample_reader);
4209 QuicDataReader mask_reader(mask.data(), mask.size());
4210 if (mask.empty()) {
4211 QUIC_DVLOG(1) << "Failed to compute mask";
4212 return false;
4213 }
4214
4215 // Unmask the rest of the type byte.
4216 uint8_t bitmask = 0x1f;
4217 if (IsLongHeader(header->type_byte)) {
4218 bitmask = 0x0f;
4219 }
4220 uint8_t mask_byte;
4221 if (!mask_reader.ReadUInt8(&mask_byte)) {
4222 QUIC_DVLOG(1) << "No first byte to read from mask";
4223 return false;
4224 }
4225 header->type_byte ^= (mask_byte & bitmask);
4226
4227 // Compute the packet number length.
4228 header->packet_number_length =
4229 static_cast<QuicPacketNumberLength>((header->type_byte & 0x03) + 1);
4230
4231 char pn_buffer[IETF_MAX_PACKET_NUMBER_LENGTH] = {};
4232 QuicDataWriter pn_writer(QUIC_ARRAYSIZE(pn_buffer), pn_buffer);
4233
4234 // Read the (protected) packet number from the reader and unmask the packet
4235 // number.
4236 for (size_t i = 0; i < header->packet_number_length; ++i) {
4237 uint8_t protected_pn_byte, mask_byte;
4238 if (!mask_reader.ReadUInt8(&mask_byte) ||
4239 !reader->ReadUInt8(&protected_pn_byte) ||
4240 !pn_writer.WriteUInt8(protected_pn_byte ^ mask_byte)) {
4241 QUIC_DVLOG(1) << "Failed to unmask packet number";
4242 return false;
4243 }
4244 }
4245 QuicDataReader packet_number_reader(pn_writer.data(), pn_writer.length());
4246 QuicPacketNumber base_packet_number;
4247 if (supports_multiple_packet_number_spaces_) {
4248 PacketNumberSpace pn_space = GetPacketNumberSpace(*header);
4249 if (pn_space == NUM_PACKET_NUMBER_SPACES) {
4250 return false;
4251 }
4252 base_packet_number = largest_decrypted_packet_numbers_[pn_space];
4253 } else {
4254 base_packet_number = largest_packet_number_;
4255 }
4256 if (!ProcessAndCalculatePacketNumber(
4257 &packet_number_reader, header->packet_number_length,
4258 base_packet_number, full_packet_number)) {
4259 return false;
4260 }
4261
4262 // Get the associated data, and apply the same unmasking operations to it.
4263 QuicStringPiece ad = GetAssociatedDataFromEncryptedPacket(
4264 version_.transport_version, packet,
4265 GetIncludedDestinationConnectionIdLength(*header),
4266 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
4267 has_diversification_nonce, header->packet_number_length,
4268 header->retry_token_length_length, header->retry_token.length(),
4269 header->length_length);
4270 *associated_data = std::vector<char>(ad.begin(), ad.end());
4271 QuicDataWriter ad_writer(associated_data->size(), associated_data->data());
4272
4273 // Apply the unmasked type byte and packet number to |associated_data|.
4274 if (!ad_writer.WriteUInt8(header->type_byte)) {
4275 return false;
4276 }
4277 // Put the packet number at the end of the AD, or if there's a diversification
4278 // nonce, before that (which is at the end of the AD).
4279 size_t seek_len = ad_writer.remaining() - header->packet_number_length;
4280 if (has_diversification_nonce) {
4281 seek_len -= kDiversificationNonceSize;
4282 }
4283 if (!ad_writer.Seek(seek_len) ||
4284 !ad_writer.WriteBytes(pn_writer.data(), pn_writer.length())) {
4285 QUIC_DVLOG(1) << "Failed to apply unmasking operations to AD";
4286 return false;
4287 }
4288
4289 return true;
4290}
4291
QUICHE teama6ef0a62019-03-07 20:34:33 -05004292size_t QuicFramer::EncryptPayload(EncryptionLevel level,
4293 QuicPacketNumber packet_number,
4294 const QuicPacket& packet,
4295 char* buffer,
4296 size_t buffer_len) {
4297 DCHECK(packet_number.IsInitialized());
dschinazi2c5386e2019-04-16 16:37:37 -07004298 if (encrypter_[level] == nullptr) {
4299 QUIC_BUG << ENDPOINT << "Attempted to encrypt without encrypter at level "
4300 << QuicUtils::EncryptionLevelToString(level);
4301 RaiseError(QUIC_ENCRYPTION_FAILURE);
4302 return 0;
4303 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004304
4305 QuicStringPiece associated_data =
4306 packet.AssociatedData(version_.transport_version);
4307 // Copy in the header, because the encrypter only populates the encrypted
4308 // plaintext content.
4309 const size_t ad_len = associated_data.length();
4310 memmove(buffer, associated_data.data(), ad_len);
4311 // Encrypt the plaintext into the buffer.
4312 size_t output_length = 0;
4313 if (!encrypter_[level]->EncryptPacket(
4314 packet_number.ToUint64(), associated_data,
4315 packet.Plaintext(version_.transport_version), buffer + ad_len,
4316 &output_length, buffer_len - ad_len)) {
4317 RaiseError(QUIC_ENCRYPTION_FAILURE);
4318 return 0;
4319 }
nharper55fa6132019-05-07 19:37:21 -07004320 if (version_.HasHeaderProtection() &&
4321 !ApplyHeaderProtection(level, buffer, ad_len + output_length, ad_len)) {
4322 QUIC_DLOG(ERROR) << "Applying header protection failed.";
4323 RaiseError(QUIC_ENCRYPTION_FAILURE);
4324 return 0;
4325 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004326
4327 return ad_len + output_length;
4328}
4329
4330size_t QuicFramer::GetCiphertextSize(EncryptionLevel level,
4331 size_t plaintext_size) const {
4332 return encrypter_[level]->GetCiphertextSize(plaintext_size);
4333}
4334
4335size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
4336 // In order to keep the code simple, we don't have the current encryption
4337 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
4338 size_t min_plaintext_size = ciphertext_size;
4339
QUICHE team6987b4a2019-03-15 16:23:04 -07004340 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; i++) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004341 if (encrypter_[i] != nullptr) {
4342 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
4343 if (size < min_plaintext_size) {
4344 min_plaintext_size = size;
4345 }
4346 }
4347 }
4348
4349 return min_plaintext_size;
4350}
4351
4352bool QuicFramer::DecryptPayload(QuicStringPiece encrypted,
4353 QuicStringPiece associated_data,
4354 const QuicPacketHeader& header,
4355 char* decrypted_buffer,
4356 size_t buffer_length,
QUICHE team10b22a12019-03-21 15:31:42 -07004357 size_t* decrypted_length,
4358 EncryptionLevel* decrypted_level) {
nharper855d2172019-05-02 16:17:46 -07004359 if (!EncryptionLevelIsValid(decrypter_level_)) {
4360 QUIC_BUG << "Attempted to decrypt with bad decrypter_level_";
4361 return false;
4362 }
zhongyi546cc452019-04-12 15:27:49 -07004363 EncryptionLevel level = decrypter_level_;
4364 QuicDecrypter* decrypter = decrypter_[level].get();
QUICHE team76086e42019-03-25 15:12:29 -07004365 QuicDecrypter* alternative_decrypter = nullptr;
zhongyi546cc452019-04-12 15:27:49 -07004366 if (version().KnowsWhichDecrypterToUse()) {
nharper855d2172019-05-02 16:17:46 -07004367 if (header.form == GOOGLE_QUIC_PACKET) {
4368 QUIC_BUG << "Attempted to decrypt GOOGLE_QUIC_PACKET with a version that "
4369 "knows which decrypter to use";
4370 return false;
4371 }
zhongyi546cc452019-04-12 15:27:49 -07004372 level = GetEncryptionLevel(header);
nharper855d2172019-05-02 16:17:46 -07004373 if (!EncryptionLevelIsValid(level)) {
4374 QUIC_BUG << "Attempted to decrypt with bad level";
4375 return false;
4376 }
zhongyi546cc452019-04-12 15:27:49 -07004377 decrypter = decrypter_[level].get();
4378 if (decrypter == nullptr) {
4379 return false;
4380 }
4381 if (level == ENCRYPTION_ZERO_RTT &&
4382 perspective_ == Perspective::IS_CLIENT && header.nonce != nullptr) {
4383 decrypter->SetDiversificationNonce(*header.nonce);
4384 }
4385 } else if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
nharper855d2172019-05-02 16:17:46 -07004386 if (!EncryptionLevelIsValid(alternative_decrypter_level_)) {
4387 QUIC_BUG << "Attempted to decrypt with bad alternative_decrypter_level_";
4388 return false;
4389 }
QUICHE team76086e42019-03-25 15:12:29 -07004390 alternative_decrypter = decrypter_[alternative_decrypter_level_].get();
4391 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004392
nharper855d2172019-05-02 16:17:46 -07004393 if (decrypter == nullptr) {
ianswettf919fb22019-05-13 06:42:11 -07004394 QUIC_BUG << "Attempting to decrypt without decrypter, encryption level:"
4395 << level << " version:" << version();
nharper855d2172019-05-02 16:17:46 -07004396 return false;
4397 }
zhongyi546cc452019-04-12 15:27:49 -07004398
4399 bool success = decrypter->DecryptPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05004400 header.packet_number.ToUint64(), associated_data, encrypted,
4401 decrypted_buffer, decrypted_length, buffer_length);
4402 if (success) {
zhongyi546cc452019-04-12 15:27:49 -07004403 visitor_->OnDecryptedPacket(level);
4404 *decrypted_level = level;
QUICHE team76086e42019-03-25 15:12:29 -07004405 } else if (alternative_decrypter != nullptr) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004406 if (header.nonce != nullptr) {
4407 DCHECK_EQ(perspective_, Perspective::IS_CLIENT);
QUICHE team76086e42019-03-25 15:12:29 -07004408 alternative_decrypter->SetDiversificationNonce(*header.nonce);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004409 }
4410 bool try_alternative_decryption = true;
4411 if (alternative_decrypter_level_ == ENCRYPTION_ZERO_RTT) {
4412 if (perspective_ == Perspective::IS_CLIENT) {
4413 if (header.nonce == nullptr) {
4414 // Can not use INITIAL decryption without a diversification nonce.
4415 try_alternative_decryption = false;
4416 }
4417 } else {
4418 DCHECK(header.nonce == nullptr);
4419 }
4420 }
4421
4422 if (try_alternative_decryption) {
QUICHE team76086e42019-03-25 15:12:29 -07004423 success = alternative_decrypter->DecryptPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05004424 header.packet_number.ToUint64(), associated_data, encrypted,
4425 decrypted_buffer, decrypted_length, buffer_length);
4426 }
4427 if (success) {
4428 visitor_->OnDecryptedPacket(alternative_decrypter_level_);
QUICHE team10b22a12019-03-21 15:31:42 -07004429 *decrypted_level = decrypter_level_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004430 if (alternative_decrypter_latch_) {
nharper855d2172019-05-02 16:17:46 -07004431 if (!EncryptionLevelIsValid(alternative_decrypter_level_)) {
4432 QUIC_BUG << "Attempted to latch alternate decrypter with bad "
4433 "alternative_decrypter_level_";
4434 return false;
4435 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004436 // Switch to the alternative decrypter and latch so that we cannot
4437 // switch back.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004438 decrypter_level_ = alternative_decrypter_level_;
QUICHE team76086e42019-03-25 15:12:29 -07004439 alternative_decrypter_level_ = NUM_ENCRYPTION_LEVELS;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004440 } else {
4441 // Switch the alternative decrypter so that we use it first next time.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004442 EncryptionLevel level = alternative_decrypter_level_;
4443 alternative_decrypter_level_ = decrypter_level_;
4444 decrypter_level_ = level;
4445 }
4446 }
4447 }
4448
4449 if (!success) {
dschinazi965ce092019-05-23 06:29:01 -07004450 QUIC_DVLOG(1) << ENDPOINT << "DecryptPacket failed for: " << header;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004451 return false;
4452 }
4453
4454 return true;
4455}
4456
4457size_t QuicFramer::GetIetfAckFrameSize(const QuicAckFrame& frame) {
4458 // Type byte, largest_acked, and delay_time are straight-forward.
4459 size_t ack_frame_size = kQuicFrameTypeSize;
4460 QuicPacketNumber largest_acked = LargestAcked(frame);
4461 ack_frame_size += QuicDataWriter::GetVarInt62Len(largest_acked.ToUint64());
4462 uint64_t ack_delay_time_us;
4463 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
4464 ack_delay_time_us = ack_delay_time_us >> kIetfAckTimestampShift;
4465 ack_frame_size += QuicDataWriter::GetVarInt62Len(ack_delay_time_us);
4466
4467 // If |ecn_counters_populated| is true and any of the ecn counters is non-0
4468 // then the ecn counters are included...
4469 if (frame.ecn_counters_populated &&
4470 (frame.ect_0_count || frame.ect_1_count || frame.ecn_ce_count)) {
4471 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ect_0_count);
4472 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ect_1_count);
4473 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ecn_ce_count);
4474 }
4475
4476 // The rest (ack_block_count, first_ack_block, and additional ack
4477 // blocks, if any) depends:
4478 uint64_t ack_block_count = frame.packets.NumIntervals();
4479 if (ack_block_count == 0) {
4480 // If the QuicAckFrame has no Intervals, then it is interpreted
4481 // as an ack of a single packet at QuicAckFrame.largest_acked.
4482 // The resulting ack will consist of only the frame's
4483 // largest_ack & first_ack_block fields. The first ack block will be 0
4484 // (indicating a single packet) and the ack block_count will be 0.
4485 // Each 0 takes 1 byte when VarInt62 encoded.
4486 ack_frame_size += 2;
4487 return ack_frame_size;
4488 }
4489
4490 auto itr = frame.packets.rbegin();
4491 QuicPacketNumber ack_block_largest = largest_acked;
4492 QuicPacketNumber ack_block_smallest;
4493 if ((itr->max() - 1) == largest_acked) {
4494 // If largest_acked + 1 is equal to the Max() of the first Interval
4495 // in the QuicAckFrame then the first Interval is the first ack block of the
4496 // frame; remaining Intervals are additional ack blocks. The QuicAckFrame's
4497 // first Interval is encoded in the frame's largest_acked/first_ack_block,
4498 // the remaining Intervals are encoded in additional ack blocks in the
4499 // frame, and the packet's ack_block_count is the number of QuicAckFrame
4500 // Intervals - 1.
4501 ack_block_smallest = itr->min();
4502 itr++;
4503 ack_block_count--;
4504 } else {
4505 // If QuicAckFrame.largest_acked is NOT equal to the Max() of
4506 // the first Interval then it is interpreted as acking a single
4507 // packet at QuicAckFrame.largest_acked, with additional
4508 // Intervals indicating additional ack blocks. The encoding is
4509 // a) The packet's largest_acked is the QuicAckFrame's largest
4510 // acked,
4511 // b) the first ack block size is 0,
4512 // c) The packet's ack_block_count is the number of QuicAckFrame
4513 // Intervals, and
4514 // d) The QuicAckFrame Intervals are encoded in additional ack
4515 // blocks in the packet.
4516 ack_block_smallest = largest_acked;
4517 }
4518 size_t ack_block_count_size = QuicDataWriter::GetVarInt62Len(ack_block_count);
4519 ack_frame_size += ack_block_count_size;
4520
4521 uint64_t first_ack_block = ack_block_largest - ack_block_smallest;
4522 size_t first_ack_block_size = QuicDataWriter::GetVarInt62Len(first_ack_block);
4523 ack_frame_size += first_ack_block_size;
4524
4525 // Account for the remaining Intervals, if any.
4526 while (ack_block_count != 0) {
4527 uint64_t gap_size = ack_block_smallest - itr->max();
4528 // Decrement per the protocol specification
4529 size_t size_of_gap_size = QuicDataWriter::GetVarInt62Len(gap_size - 1);
4530 ack_frame_size += size_of_gap_size;
4531
4532 uint64_t block_size = itr->max() - itr->min();
4533 // Decrement per the protocol specification
4534 size_t size_of_block_size = QuicDataWriter::GetVarInt62Len(block_size - 1);
4535 ack_frame_size += size_of_block_size;
4536
4537 ack_block_smallest = itr->min();
4538 itr++;
4539 ack_block_count--;
4540 }
4541
4542 return ack_frame_size;
4543}
4544
4545size_t QuicFramer::GetAckFrameSize(
4546 const QuicAckFrame& ack,
4547 QuicPacketNumberLength packet_number_length) {
4548 DCHECK(!ack.packets.Empty());
4549 size_t ack_size = 0;
4550
4551 if (version_.transport_version == QUIC_VERSION_99) {
4552 return GetIetfAckFrameSize(ack);
4553 }
4554 AckFrameInfo ack_info = GetAckFrameInfo(ack);
4555 QuicPacketNumberLength largest_acked_length =
4556 GetMinPacketNumberLength(version_.transport_version, LargestAcked(ack));
4557 QuicPacketNumberLength ack_block_length = GetMinPacketNumberLength(
4558 version_.transport_version, QuicPacketNumber(ack_info.max_block_length));
4559
4560 ack_size =
4561 GetMinAckFrameSize(version_.transport_version, largest_acked_length);
4562 // First ack block length.
4563 ack_size += ack_block_length;
4564 if (ack_info.num_ack_blocks != 0) {
4565 ack_size += kNumberOfAckBlocksSize;
4566 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) *
4567 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
4568 }
4569
4570 // Include timestamps.
4571 if (process_timestamps_) {
4572 ack_size += GetAckFrameTimeStampSize(ack);
4573 }
4574
4575 return ack_size;
4576}
4577
4578size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) {
4579 if (ack.received_packet_times.empty()) {
4580 return 0;
4581 }
4582
4583 return kQuicNumTimestampsLength + kQuicFirstTimestampLength +
4584 (kQuicTimestampLength + kQuicTimestampPacketNumberGapLength) *
4585 (ack.received_packet_times.size() - 1);
4586}
4587
4588size_t QuicFramer::ComputeFrameLength(
4589 const QuicFrame& frame,
4590 bool last_frame_in_packet,
4591 QuicPacketNumberLength packet_number_length) {
4592 switch (frame.type) {
4593 case STREAM_FRAME:
4594 return GetMinStreamFrameSize(
4595 version_.transport_version, frame.stream_frame.stream_id,
4596 frame.stream_frame.offset, last_frame_in_packet,
4597 frame.stream_frame.data_length) +
4598 frame.stream_frame.data_length;
4599 case CRYPTO_FRAME:
4600 return GetMinCryptoFrameSize(frame.crypto_frame->offset,
4601 frame.crypto_frame->data_length) +
4602 frame.crypto_frame->data_length;
4603 case ACK_FRAME: {
4604 return GetAckFrameSize(*frame.ack_frame, packet_number_length);
4605 }
4606 case STOP_WAITING_FRAME:
4607 return GetStopWaitingFrameSize(version_.transport_version,
4608 packet_number_length);
4609 case MTU_DISCOVERY_FRAME:
4610 // MTU discovery frames are serialized as ping frames.
4611 return kQuicFrameTypeSize;
4612 case MESSAGE_FRAME:
4613 return GetMessageFrameSize(version_.transport_version,
4614 last_frame_in_packet,
4615 frame.message_frame->message_length);
4616 case PADDING_FRAME:
4617 DCHECK(false);
4618 return 0;
4619 default:
4620 return GetRetransmittableControlFrameSize(version_.transport_version,
4621 frame);
4622 }
4623}
4624
4625bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
4626 bool last_frame_in_packet,
4627 QuicDataWriter* writer) {
4628 if (version_.transport_version == QUIC_VERSION_99) {
4629 return AppendIetfTypeByte(frame, last_frame_in_packet, writer);
4630 }
4631 uint8_t type_byte = 0;
4632 switch (frame.type) {
4633 case STREAM_FRAME:
4634 type_byte =
4635 GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4636 break;
4637 case ACK_FRAME:
4638 return true;
4639 case MTU_DISCOVERY_FRAME:
4640 type_byte = static_cast<uint8_t>(PING_FRAME);
4641 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004642 case NEW_CONNECTION_ID_FRAME:
4643 set_detailed_error(
4644 "Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
4645 return RaiseError(QUIC_INTERNAL_ERROR);
4646 case RETIRE_CONNECTION_ID_FRAME:
4647 set_detailed_error(
4648 "Attempt to append RETIRE_CONNECTION_ID frame and not in version "
4649 "99.");
4650 return RaiseError(QUIC_INTERNAL_ERROR);
4651 case NEW_TOKEN_FRAME:
4652 set_detailed_error(
4653 "Attempt to append NEW_TOKEN frame and not in version 99.");
4654 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07004655 case MAX_STREAMS_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05004656 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07004657 "Attempt to append MAX_STREAMS frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05004658 return RaiseError(QUIC_INTERNAL_ERROR);
fkastenholz3c4eabf2019-04-22 07:49:59 -07004659 case STREAMS_BLOCKED_FRAME:
QUICHE teama6ef0a62019-03-07 20:34:33 -05004660 set_detailed_error(
fkastenholz3c4eabf2019-04-22 07:49:59 -07004661 "Attempt to append STREAMS_BLOCKED frame and not in version 99.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05004662 return RaiseError(QUIC_INTERNAL_ERROR);
4663 case PATH_RESPONSE_FRAME:
4664 set_detailed_error(
4665 "Attempt to append PATH_RESPONSE frame and not in version 99.");
4666 return RaiseError(QUIC_INTERNAL_ERROR);
4667 case PATH_CHALLENGE_FRAME:
4668 set_detailed_error(
4669 "Attempt to append PATH_CHALLENGE frame and not in version 99.");
4670 return RaiseError(QUIC_INTERNAL_ERROR);
4671 case STOP_SENDING_FRAME:
4672 set_detailed_error(
4673 "Attempt to append STOP_SENDING frame and not in version 99.");
4674 return RaiseError(QUIC_INTERNAL_ERROR);
4675 case MESSAGE_FRAME:
4676 return true;
4677
4678 default:
4679 type_byte = static_cast<uint8_t>(frame.type);
4680 break;
4681 }
4682
4683 return writer->WriteUInt8(type_byte);
4684}
4685
4686bool QuicFramer::AppendIetfTypeByte(const QuicFrame& frame,
4687 bool last_frame_in_packet,
4688 QuicDataWriter* writer) {
4689 uint8_t type_byte = 0;
4690 switch (frame.type) {
4691 case PADDING_FRAME:
4692 type_byte = IETF_PADDING;
4693 break;
4694 case RST_STREAM_FRAME:
4695 type_byte = IETF_RST_STREAM;
4696 break;
4697 case CONNECTION_CLOSE_FRAME:
fkastenholz72f509b2019-04-10 09:17:49 -07004698 switch (frame.connection_close_frame->close_type) {
4699 case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
4700 type_byte = IETF_APPLICATION_CLOSE;
4701 break;
4702 case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
4703 type_byte = IETF_CONNECTION_CLOSE;
4704 break;
4705 default:
4706 set_detailed_error("Invalid QuicConnectionCloseFrame type.");
4707 return RaiseError(QUIC_INTERNAL_ERROR);
4708 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004709 break;
4710 case GOAWAY_FRAME:
4711 set_detailed_error(
4712 "Attempt to create non-version-99 GOAWAY frame in version 99.");
4713 return RaiseError(QUIC_INTERNAL_ERROR);
4714 case WINDOW_UPDATE_FRAME:
4715 // Depending on whether there is a stream ID or not, will be either a
4716 // MAX_STREAM_DATA frame or a MAX_DATA frame.
4717 if (frame.window_update_frame->stream_id ==
4718 QuicUtils::GetInvalidStreamId(transport_version())) {
4719 type_byte = IETF_MAX_DATA;
4720 } else {
4721 type_byte = IETF_MAX_STREAM_DATA;
4722 }
4723 break;
4724 case BLOCKED_FRAME:
4725 if (frame.blocked_frame->stream_id ==
4726 QuicUtils::GetInvalidStreamId(transport_version())) {
4727 type_byte = IETF_BLOCKED;
4728 } else {
4729 type_byte = IETF_STREAM_BLOCKED;
4730 }
4731 break;
4732 case STOP_WAITING_FRAME:
4733 set_detailed_error(
4734 "Attempt to append type byte of STOP WAITING frame in version 99.");
4735 return RaiseError(QUIC_INTERNAL_ERROR);
4736 case PING_FRAME:
4737 type_byte = IETF_PING;
4738 break;
4739 case STREAM_FRAME:
4740 type_byte =
4741 GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4742 break;
4743 case ACK_FRAME:
4744 // Do nothing here, AppendIetfAckFrameAndTypeByte() will put the type byte
4745 // in the buffer.
4746 return true;
4747 case MTU_DISCOVERY_FRAME:
4748 // The path MTU discovery frame is encoded as a PING frame on the wire.
4749 type_byte = IETF_PING;
4750 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004751 case NEW_CONNECTION_ID_FRAME:
4752 type_byte = IETF_NEW_CONNECTION_ID;
4753 break;
4754 case RETIRE_CONNECTION_ID_FRAME:
4755 type_byte = IETF_RETIRE_CONNECTION_ID;
4756 break;
4757 case NEW_TOKEN_FRAME:
4758 type_byte = IETF_NEW_TOKEN;
4759 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004760 case MAX_STREAMS_FRAME:
4761 if (frame.max_streams_frame.unidirectional) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004762 type_byte = IETF_MAX_STREAMS_UNIDIRECTIONAL;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004763 } else {
4764 type_byte = IETF_MAX_STREAMS_BIDIRECTIONAL;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004765 }
4766 break;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004767 case STREAMS_BLOCKED_FRAME:
4768 if (frame.streams_blocked_frame.unidirectional) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004769 type_byte = IETF_STREAMS_BLOCKED_UNIDIRECTIONAL;
fkastenholz3c4eabf2019-04-22 07:49:59 -07004770 } else {
4771 type_byte = IETF_STREAMS_BLOCKED_BIDIRECTIONAL;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004772 }
4773 break;
4774 case PATH_RESPONSE_FRAME:
4775 type_byte = IETF_PATH_RESPONSE;
4776 break;
4777 case PATH_CHALLENGE_FRAME:
4778 type_byte = IETF_PATH_CHALLENGE;
4779 break;
4780 case STOP_SENDING_FRAME:
4781 type_byte = IETF_STOP_SENDING;
4782 break;
4783 case MESSAGE_FRAME:
4784 return true;
4785 case CRYPTO_FRAME:
4786 type_byte = IETF_CRYPTO;
4787 break;
4788 default:
4789 QUIC_BUG << "Attempt to generate a frame type for an unsupported value: "
4790 << frame.type;
4791 return false;
4792 }
4793 return writer->WriteUInt8(type_byte);
4794}
4795
4796// static
4797bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length,
4798 QuicPacketNumber packet_number,
4799 QuicDataWriter* writer) {
4800 DCHECK(packet_number.IsInitialized());
4801 if (!IsValidPacketNumberLength(packet_number_length)) {
4802 QUIC_BUG << "Invalid packet_number_length: " << packet_number_length;
4803 return false;
4804 }
4805 return writer->WriteBytesToUInt64(packet_number_length,
4806 packet_number.ToUint64());
4807}
4808
4809// static
4810bool QuicFramer::AppendStreamId(size_t stream_id_length,
4811 QuicStreamId stream_id,
4812 QuicDataWriter* writer) {
4813 if (stream_id_length == 0 || stream_id_length > 4) {
4814 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length;
4815 return false;
4816 }
4817 return writer->WriteBytesToUInt64(stream_id_length, stream_id);
4818}
4819
4820// static
4821bool QuicFramer::AppendStreamOffset(size_t offset_length,
4822 QuicStreamOffset offset,
4823 QuicDataWriter* writer) {
4824 if (offset_length == 1 || offset_length > 8) {
4825 QUIC_BUG << "Invalid stream_offset_length: " << offset_length;
4826 return false;
4827 }
4828
4829 return writer->WriteBytesToUInt64(offset_length, offset);
4830}
4831
4832// static
4833bool QuicFramer::AppendAckBlock(uint8_t gap,
4834 QuicPacketNumberLength length_length,
4835 uint64_t length,
4836 QuicDataWriter* writer) {
4837 if (length == 0) {
4838 if (!IsValidPacketNumberLength(length_length)) {
4839 QUIC_BUG << "Invalid packet_number_length: " << length_length;
4840 return false;
4841 }
4842 return writer->WriteUInt8(gap) &&
4843 writer->WriteBytesToUInt64(length_length, length);
4844 }
4845 return writer->WriteUInt8(gap) &&
4846 AppendPacketNumber(length_length, QuicPacketNumber(length), writer);
4847}
4848
4849bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
4850 bool no_stream_frame_length,
4851 QuicDataWriter* writer) {
4852 if (version_.transport_version == QUIC_VERSION_99) {
4853 return AppendIetfStreamFrame(frame, no_stream_frame_length, writer);
4854 }
4855 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
4856 writer)) {
4857 QUIC_BUG << "Writing stream id size failed.";
4858 return false;
4859 }
4860 if (!AppendStreamOffset(
4861 GetStreamOffsetSize(version_.transport_version, frame.offset),
4862 frame.offset, writer)) {
4863 QUIC_BUG << "Writing offset size failed.";
4864 return false;
4865 }
4866 if (!no_stream_frame_length) {
4867 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) ||
4868 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) {
4869 QUIC_BUG << "Writing stream frame length failed";
4870 return false;
4871 }
4872 }
4873
4874 if (data_producer_ != nullptr) {
4875 DCHECK_EQ(nullptr, frame.data_buffer);
4876 if (frame.data_length == 0) {
4877 return true;
4878 }
4879 if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
4880 frame.data_length,
4881 writer) != WRITE_SUCCESS) {
4882 QUIC_BUG << "Writing frame data failed.";
4883 return false;
4884 }
4885 return true;
4886 }
4887
4888 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4889 QUIC_BUG << "Writing frame data failed.";
4890 return false;
4891 }
4892 return true;
4893}
4894
QUICHE teama6ef0a62019-03-07 20:34:33 -05004895bool QuicFramer::AppendNewTokenFrame(const QuicNewTokenFrame& frame,
4896 QuicDataWriter* writer) {
4897 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.token.length()))) {
4898 set_detailed_error("Writing token length failed.");
4899 return false;
4900 }
4901 if (!writer->WriteBytes(frame.token.data(), frame.token.length())) {
4902 set_detailed_error("Writing token buffer failed.");
4903 return false;
4904 }
4905 return true;
4906}
4907
4908bool QuicFramer::ProcessNewTokenFrame(QuicDataReader* reader,
4909 QuicNewTokenFrame* frame) {
4910 uint64_t length;
4911 if (!reader->ReadVarInt62(&length)) {
4912 set_detailed_error("Unable to read new token length.");
4913 return false;
4914 }
4915 if (length > kMaxNewTokenTokenLength) {
4916 set_detailed_error("Token length larger than maximum.");
4917 return false;
4918 }
4919
4920 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
4921 QuicStringPiece data;
4922 if (!reader->ReadStringPiece(&data, length)) {
4923 set_detailed_error("Unable to read new token data.");
4924 return false;
4925 }
vasilvvc48c8712019-03-11 13:38:16 -07004926 frame->token = std::string(data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004927 return true;
4928}
4929
4930// Add a new ietf-format stream frame.
4931// Bits controlling whether there is a frame-length and frame-offset
4932// are in the QuicStreamFrame.
4933bool QuicFramer::AppendIetfStreamFrame(const QuicStreamFrame& frame,
4934 bool last_frame_in_packet,
4935 QuicDataWriter* writer) {
4936 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
4937 set_detailed_error("Writing stream id failed.");
4938 return false;
4939 }
4940
4941 if (frame.offset != 0) {
4942 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
4943 set_detailed_error("Writing data offset failed.");
4944 return false;
4945 }
4946 }
4947
4948 if (!last_frame_in_packet) {
4949 if (!writer->WriteVarInt62(frame.data_length)) {
4950 set_detailed_error("Writing data length failed.");
4951 return false;
4952 }
4953 }
4954
4955 if (frame.data_length == 0) {
4956 return true;
4957 }
4958 if (data_producer_ == nullptr) {
4959 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4960 set_detailed_error("Writing frame data failed.");
4961 return false;
4962 }
4963 } else {
4964 DCHECK_EQ(nullptr, frame.data_buffer);
4965
4966 if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
4967 frame.data_length,
4968 writer) != WRITE_SUCCESS) {
4969 set_detailed_error("Writing frame data failed.");
4970 return false;
4971 }
4972 }
4973 return true;
4974}
4975
4976bool QuicFramer::AppendCryptoFrame(const QuicCryptoFrame& frame,
4977 QuicDataWriter* writer) {
4978 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
4979 set_detailed_error("Writing data offset failed.");
4980 return false;
4981 }
4982 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.data_length))) {
4983 set_detailed_error("Writing data length failed.");
4984 return false;
4985 }
4986 if (data_producer_ == nullptr) {
4987 if (frame.data_buffer == nullptr ||
4988 !writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4989 set_detailed_error("Writing frame data failed.");
4990 return false;
4991 }
4992 } else {
4993 DCHECK_EQ(nullptr, frame.data_buffer);
4994 if (!data_producer_->WriteCryptoData(frame.level, frame.offset,
4995 frame.data_length, writer)) {
4996 return false;
4997 }
4998 }
4999 return true;
5000}
5001
5002void QuicFramer::set_version(const ParsedQuicVersion version) {
5003 DCHECK(IsSupportedVersion(version)) << ParsedQuicVersionToString(version);
5004 version_ = version;
5005}
5006
5007bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
5008 QuicDataWriter* writer) {
5009 if (transport_version() == QUIC_VERSION_99) {
5010 return AppendIetfAckFrameAndTypeByte(frame, writer);
5011 }
5012
5013 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame);
5014 QuicPacketNumber largest_acked = LargestAcked(frame);
5015 QuicPacketNumberLength largest_acked_length =
5016 GetMinPacketNumberLength(version_.transport_version, largest_acked);
5017 QuicPacketNumberLength ack_block_length =
5018 GetMinPacketNumberLength(version_.transport_version,
5019 QuicPacketNumber(new_ack_info.max_block_length));
5020 // Calculate available bytes for timestamps and ack blocks.
5021 int32_t available_timestamp_and_ack_block_bytes =
5022 writer->capacity() - writer->length() - ack_block_length -
5023 GetMinAckFrameSize(version_.transport_version, largest_acked_length) -
5024 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0);
5025 DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
5026
5027 // Write out the type byte by setting the low order bits and doing shifts
5028 // to make room for the next bit flags to be set.
5029 // Whether there are multiple ack blocks.
5030 uint8_t type_byte = 0;
5031 SetBit(&type_byte, new_ack_info.num_ack_blocks != 0,
5032 kQuicHasMultipleAckBlocksOffset);
5033
5034 SetBits(&type_byte, GetPacketNumberFlags(largest_acked_length),
5035 kQuicSequenceNumberLengthNumBits, kLargestAckedOffset);
5036
5037 SetBits(&type_byte, GetPacketNumberFlags(ack_block_length),
5038 kQuicSequenceNumberLengthNumBits, kActBlockLengthOffset);
5039
5040 type_byte |= kQuicFrameTypeAckMask;
5041
5042 if (!writer->WriteUInt8(type_byte)) {
5043 return false;
5044 }
5045
5046 size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes /
5047 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
5048
5049 // Number of ack blocks.
5050 size_t num_ack_blocks =
5051 std::min(new_ack_info.num_ack_blocks, max_num_ack_blocks);
5052 if (num_ack_blocks > std::numeric_limits<uint8_t>::max()) {
5053 num_ack_blocks = std::numeric_limits<uint8_t>::max();
5054 }
5055
5056 // Largest acked.
5057 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) {
5058 return false;
5059 }
5060
5061 // Largest acked delta time.
5062 uint64_t ack_delay_time_us = kUFloat16MaxValue;
5063 if (!frame.ack_delay_time.IsInfinite()) {
5064 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
5065 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
5066 }
5067 if (!writer->WriteUFloat16(ack_delay_time_us)) {
5068 return false;
5069 }
5070
5071 if (num_ack_blocks > 0) {
5072 if (!writer->WriteBytes(&num_ack_blocks, 1)) {
5073 return false;
5074 }
5075 }
5076
5077 // First ack block length.
5078 if (!AppendPacketNumber(ack_block_length,
5079 QuicPacketNumber(new_ack_info.first_block_length),
5080 writer)) {
5081 return false;
5082 }
5083
5084 // Ack blocks.
5085 if (num_ack_blocks > 0) {
5086 size_t num_ack_blocks_written = 0;
5087 // Append, in descending order from the largest ACKed packet, a series of
5088 // ACK blocks that represents the successfully acknoweldged packets. Each
5089 // appended gap/block length represents a descending delta from the previous
5090 // block. i.e.:
5091 // |--- length ---|--- gap ---|--- length ---|--- gap ---|--- largest ---|
5092 // For gaps larger than can be represented by a single encoded gap, a 0
5093 // length gap of the maximum is used, i.e.:
5094 // |--- length ---|--- gap ---|- 0 -|--- gap ---|--- largest ---|
5095 auto itr = frame.packets.rbegin();
5096 QuicPacketNumber previous_start = itr->min();
5097 ++itr;
5098
5099 for (;
5100 itr != frame.packets.rend() && num_ack_blocks_written < num_ack_blocks;
5101 previous_start = itr->min(), ++itr) {
5102 const auto& interval = *itr;
5103 const uint64_t total_gap = previous_start - interval.max();
5104 const size_t num_encoded_gaps =
5105 (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
5106 std::numeric_limits<uint8_t>::max();
5107 DCHECK_LE(0u, num_encoded_gaps);
5108
5109 // Append empty ACK blocks because the gap is longer than a single gap.
5110 for (size_t i = 1;
5111 i < num_encoded_gaps && num_ack_blocks_written < num_ack_blocks;
5112 ++i) {
5113 if (!AppendAckBlock(std::numeric_limits<uint8_t>::max(),
5114 ack_block_length, 0, writer)) {
5115 return false;
5116 }
5117 ++num_ack_blocks_written;
5118 }
5119 if (num_ack_blocks_written >= num_ack_blocks) {
5120 if (QUIC_PREDICT_FALSE(num_ack_blocks_written != num_ack_blocks)) {
5121 QUIC_BUG << "Wrote " << num_ack_blocks_written
5122 << ", expected to write " << num_ack_blocks;
5123 }
5124 break;
5125 }
5126
5127 const uint8_t last_gap =
5128 total_gap -
5129 (num_encoded_gaps - 1) * std::numeric_limits<uint8_t>::max();
5130 // Append the final ACK block with a non-empty size.
5131 if (!AppendAckBlock(last_gap, ack_block_length,
5132 PacketNumberIntervalLength(interval), writer)) {
5133 return false;
5134 }
5135 ++num_ack_blocks_written;
5136 }
5137 DCHECK_EQ(num_ack_blocks, num_ack_blocks_written);
5138 }
5139 // Timestamps.
5140 // If we don't process timestamps or if we don't have enough available space
5141 // to append all the timestamps, don't append any of them.
5142 if (process_timestamps_ && writer->capacity() - writer->length() >=
5143 GetAckFrameTimeStampSize(frame)) {
5144 if (!AppendTimestampsToAckFrame(frame, writer)) {
5145 return false;
5146 }
5147 } else {
5148 uint8_t num_received_packets = 0;
5149 if (!writer->WriteBytes(&num_received_packets, 1)) {
5150 return false;
5151 }
5152 }
5153
5154 return true;
5155}
5156
5157bool QuicFramer::AppendTimestampsToAckFrame(const QuicAckFrame& frame,
5158 QuicDataWriter* writer) {
5159 DCHECK_GE(std::numeric_limits<uint8_t>::max(),
5160 frame.received_packet_times.size());
5161 // num_received_packets is only 1 byte.
5162 if (frame.received_packet_times.size() >
5163 std::numeric_limits<uint8_t>::max()) {
5164 return false;
5165 }
5166
5167 uint8_t num_received_packets = frame.received_packet_times.size();
5168 if (!writer->WriteBytes(&num_received_packets, 1)) {
5169 return false;
5170 }
5171 if (num_received_packets == 0) {
5172 return true;
5173 }
5174
5175 auto it = frame.received_packet_times.begin();
5176 QuicPacketNumber packet_number = it->first;
5177 uint64_t delta_from_largest_observed = LargestAcked(frame) - packet_number;
5178
5179 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed);
5180 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
5181 return false;
5182 }
5183
5184 if (!writer->WriteUInt8(delta_from_largest_observed)) {
5185 return false;
5186 }
5187
5188 // Use the lowest 4 bytes of the time delta from the creation_time_.
5189 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32;
5190 uint32_t time_delta_us =
5191 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() &
5192 (time_epoch_delta_us - 1));
5193 if (!writer->WriteUInt32(time_delta_us)) {
5194 return false;
5195 }
5196
5197 QuicTime prev_time = it->second;
5198
5199 for (++it; it != frame.received_packet_times.end(); ++it) {
5200 packet_number = it->first;
5201 delta_from_largest_observed = LargestAcked(frame) - packet_number;
5202
5203 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
5204 return false;
5205 }
5206
5207 if (!writer->WriteUInt8(delta_from_largest_observed)) {
5208 return false;
5209 }
5210
5211 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds();
5212 prev_time = it->second;
5213 if (!writer->WriteUFloat16(frame_time_delta_us)) {
5214 return false;
5215 }
5216 }
5217 return true;
5218}
5219
5220bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header,
5221 const QuicStopWaitingFrame& frame,
5222 QuicDataWriter* writer) {
5223 DCHECK_GE(QUIC_VERSION_43, version_.transport_version);
5224 DCHECK(frame.least_unacked.IsInitialized() &&
5225 header.packet_number >= frame.least_unacked);
5226 const uint64_t least_unacked_delta =
5227 header.packet_number - frame.least_unacked;
5228 const uint64_t length_shift = header.packet_number_length * 8;
5229
5230 if (least_unacked_delta >> length_shift > 0) {
5231 QUIC_BUG << "packet_number_length " << header.packet_number_length
5232 << " is too small for least_unacked_delta: " << least_unacked_delta
5233 << " packet_number:" << header.packet_number
5234 << " least_unacked:" << frame.least_unacked
5235 << " version:" << version_.transport_version;
5236 return false;
5237 }
5238 if (least_unacked_delta == 0) {
5239 return writer->WriteBytesToUInt64(header.packet_number_length,
5240 least_unacked_delta);
5241 }
5242 if (!AppendPacketNumber(header.packet_number_length,
5243 QuicPacketNumber(least_unacked_delta), writer)) {
5244 QUIC_BUG << " seq failed: " << header.packet_number_length;
5245 return false;
5246 }
5247
5248 return true;
5249}
5250
5251int QuicFramer::CalculateIetfAckBlockCount(const QuicAckFrame& frame,
5252 QuicDataWriter* writer,
5253 size_t available_space) {
5254 // Number of blocks requested in the frame
5255 uint64_t ack_block_count = frame.packets.NumIntervals();
5256
5257 auto itr = frame.packets.rbegin();
5258
5259 int actual_block_count = 1;
5260 uint64_t block_length = itr->max() - itr->min();
5261 size_t encoded_size = QuicDataWriter::GetVarInt62Len(block_length);
5262 if (encoded_size > available_space) {
5263 return 0;
5264 }
5265 available_space -= encoded_size;
5266 QuicPacketNumber previous_ack_end = itr->min();
5267 ack_block_count--;
5268
5269 while (ack_block_count) {
5270 // Each block is a gap followed by another ACK. Calculate each value,
5271 // determine the encoded lengths, and check against the available space.
5272 itr++;
5273 size_t gap = previous_ack_end - itr->max() - 1;
5274 encoded_size = QuicDataWriter::GetVarInt62Len(gap);
5275
5276 // Add the ACK block.
5277 block_length = itr->max() - itr->min();
5278 encoded_size += QuicDataWriter::GetVarInt62Len(block_length);
5279
5280 if (encoded_size > available_space) {
5281 // No room for this block, so what we've
5282 // done up to now is all that can be done.
5283 return actual_block_count;
5284 }
5285 available_space -= encoded_size;
5286 actual_block_count++;
5287 previous_ack_end = itr->min();
5288 ack_block_count--;
5289 }
5290 // Ran through the whole thing! We can do all blocks.
5291 return actual_block_count;
5292}
5293
5294bool QuicFramer::AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
5295 QuicDataWriter* writer) {
5296 // Assume frame is an IETF_ACK frame. If |ecn_counters_populated| is true and
5297 // any of the ECN counters is non-0 then turn it into an IETF_ACK+ECN frame.
5298 uint8_t type = IETF_ACK;
5299 if (frame.ecn_counters_populated &&
5300 (frame.ect_0_count || frame.ect_1_count || frame.ecn_ce_count)) {
5301 type = IETF_ACK_ECN;
5302 }
5303
5304 if (!writer->WriteUInt8(type)) {
5305 set_detailed_error("No room for frame-type");
5306 return false;
5307 }
5308
5309 QuicPacketNumber largest_acked = LargestAcked(frame);
5310 if (!writer->WriteVarInt62(largest_acked.ToUint64())) {
5311 set_detailed_error("No room for largest-acked in ack frame");
5312 return false;
5313 }
5314
5315 uint64_t ack_delay_time_us = kVarInt62MaxValue;
5316 if (!frame.ack_delay_time.IsInfinite()) {
5317 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
5318 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
5319 // TODO(fkastenholz): Use the shift from TLS transport parameters.
5320 ack_delay_time_us = ack_delay_time_us >> kIetfAckTimestampShift;
5321 }
5322
5323 if (!writer->WriteVarInt62(ack_delay_time_us)) {
5324 set_detailed_error("No room for ack-delay in ack frame");
5325 return false;
5326 }
5327 if (type == IETF_ACK_ECN) {
5328 // Encode the ACK ECN fields
5329 if (!writer->WriteVarInt62(frame.ect_0_count)) {
5330 set_detailed_error("No room for ect_0_count in ack frame");
5331 return false;
5332 }
5333 if (!writer->WriteVarInt62(frame.ect_1_count)) {
5334 set_detailed_error("No room for ect_1_count in ack frame");
5335 return false;
5336 }
5337 if (!writer->WriteVarInt62(frame.ecn_ce_count)) {
5338 set_detailed_error("No room for ecn_ce_count in ack frame");
5339 return false;
5340 }
5341 }
5342
5343 uint64_t ack_block_count = frame.packets.NumIntervals();
5344 if (ack_block_count == 0) {
5345 // If the QuicAckFrame has no Intervals, then it is interpreted
5346 // as an ack of a single packet at QuicAckFrame.largest_acked.
5347 // The resulting ack will consist of only the frame's
5348 // largest_ack & first_ack_block fields. The first ack block will be 0
5349 // (indicating a single packet) and the ack block_count will be 0.
5350 if (!writer->WriteVarInt62(0)) {
5351 set_detailed_error("No room for ack block count in ack frame");
5352 return false;
5353 }
5354 // size of the first block is 1 packet
5355 if (!writer->WriteVarInt62(0)) {
5356 set_detailed_error("No room for first ack block in ack frame");
5357 return false;
5358 }
5359 return true;
5360 }
5361 // Case 2 or 3
5362 auto itr = frame.packets.rbegin();
5363
5364 QuicPacketNumber ack_block_largest(largest_acked);
5365 QuicPacketNumber ack_block_smallest;
5366 if ((itr->max() - 1) == QuicPacketNumber(largest_acked)) {
5367 // If largest_acked + 1 is equal to the Max() of the first Interval
5368 // in the QuicAckFrame then the first Interval is the first ack block of the
5369 // frame; remaining Intervals are additional ack blocks. The QuicAckFrame's
5370 // first Interval is encoded in the frame's largest_acked/first_ack_block,
5371 // the remaining Intervals are encoded in additional ack blocks in the
5372 // frame, and the packet's ack_block_count is the number of QuicAckFrame
5373 // Intervals - 1.
5374 ack_block_smallest = itr->min();
5375 itr++;
5376 ack_block_count--;
5377 } else {
5378 // If QuicAckFrame.largest_acked is NOT equal to the Max() of
5379 // the first Interval then it is interpreted as acking a single
5380 // packet at QuicAckFrame.largest_acked, with additional
5381 // Intervals indicating additional ack blocks. The encoding is
5382 // a) The packet's largest_acked is the QuicAckFrame's largest
5383 // acked,
5384 // b) the first ack block size is 0,
5385 // c) The packet's ack_block_count is the number of QuicAckFrame
5386 // Intervals, and
5387 // d) The QuicAckFrame Intervals are encoded in additional ack
5388 // blocks in the packet.
5389 ack_block_smallest = largest_acked;
5390 }
5391
5392 if (!writer->WriteVarInt62(ack_block_count)) {
5393 set_detailed_error("No room for ack block count in ack frame");
5394 return false;
5395 }
5396
5397 uint64_t first_ack_block = ack_block_largest - ack_block_smallest;
5398 if (!writer->WriteVarInt62(first_ack_block)) {
5399 set_detailed_error("No room for first ack block in ack frame");
5400 return false;
5401 }
5402
5403 // For the remaining QuicAckFrame Intervals, if any
5404 while (ack_block_count != 0) {
5405 uint64_t gap_size = ack_block_smallest - itr->max();
5406 if (!writer->WriteVarInt62(gap_size - 1)) {
5407 set_detailed_error("No room for gap block in ack frame");
5408 return false;
5409 }
5410
5411 uint64_t block_size = itr->max() - itr->min();
5412 if (!writer->WriteVarInt62(block_size - 1)) {
5413 set_detailed_error("No room for nth ack block in ack frame");
5414 return false;
5415 }
5416
5417 ack_block_smallest = itr->min();
5418 itr++;
5419 ack_block_count--;
5420 }
5421 return true;
5422}
5423
5424bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame,
5425 QuicDataWriter* writer) {
5426 if (version_.transport_version == QUIC_VERSION_99) {
5427 return AppendIetfResetStreamFrame(frame, writer);
5428 }
5429 if (!writer->WriteUInt32(frame.stream_id)) {
5430 return false;
5431 }
5432
5433 if (!writer->WriteUInt64(frame.byte_offset)) {
5434 return false;
5435 }
5436
5437 uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5438 if (!writer->WriteUInt32(error_code)) {
5439 return false;
5440 }
5441
5442 return true;
5443}
5444
5445bool QuicFramer::AppendConnectionCloseFrame(
5446 const QuicConnectionCloseFrame& frame,
5447 QuicDataWriter* writer) {
5448 if (version_.transport_version == QUIC_VERSION_99) {
5449 return AppendIetfConnectionCloseFrame(frame, writer);
5450 }
fkastenholze9d71a82019-04-09 05:12:13 -07005451 uint32_t error_code = static_cast<uint32_t>(frame.quic_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005452 if (!writer->WriteUInt32(error_code)) {
5453 return false;
5454 }
5455 if (!writer->WriteStringPiece16(TruncateErrorString(frame.error_details))) {
5456 return false;
5457 }
5458 return true;
5459}
5460
5461bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame,
5462 QuicDataWriter* writer) {
5463 uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5464 if (!writer->WriteUInt32(error_code)) {
5465 return false;
5466 }
5467 uint32_t stream_id = static_cast<uint32_t>(frame.last_good_stream_id);
5468 if (!writer->WriteUInt32(stream_id)) {
5469 return false;
5470 }
5471 if (!writer->WriteStringPiece16(TruncateErrorString(frame.reason_phrase))) {
5472 return false;
5473 }
5474 return true;
5475}
5476
5477bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
5478 QuicDataWriter* writer) {
5479 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5480 if (!writer->WriteUInt32(stream_id)) {
5481 return false;
5482 }
5483 if (!writer->WriteUInt64(frame.byte_offset)) {
5484 return false;
5485 }
5486 return true;
5487}
5488
5489bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame,
5490 QuicDataWriter* writer) {
5491 if (version_.transport_version == QUIC_VERSION_99) {
5492 if (frame.stream_id == QuicUtils::GetInvalidStreamId(transport_version())) {
5493 return AppendIetfBlockedFrame(frame, writer);
5494 }
5495 return AppendStreamBlockedFrame(frame, writer);
5496 }
5497 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5498 if (!writer->WriteUInt32(stream_id)) {
5499 return false;
5500 }
5501 return true;
5502}
5503
5504bool QuicFramer::AppendPaddingFrame(const QuicPaddingFrame& frame,
5505 QuicDataWriter* writer) {
5506 if (frame.num_padding_bytes == 0) {
5507 return false;
5508 }
5509 if (frame.num_padding_bytes < 0) {
5510 QUIC_BUG_IF(frame.num_padding_bytes != -1);
5511 writer->WritePadding();
5512 return true;
5513 }
5514 // Please note, num_padding_bytes includes type byte which has been written.
5515 return writer->WritePaddingBytes(frame.num_padding_bytes - 1);
5516}
5517
5518bool QuicFramer::AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
5519 bool last_frame_in_packet,
5520 QuicDataWriter* writer) {
5521 uint8_t type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH
5522 : IETF_EXTENSION_MESSAGE;
5523 if (!writer->WriteUInt8(type_byte)) {
5524 return false;
5525 }
5526 if (!last_frame_in_packet && !writer->WriteVarInt62(frame.message_length)) {
5527 return false;
5528 }
5529 for (const auto& slice : frame.message_data) {
5530 if (!writer->WriteBytes(slice.data(), slice.length())) {
5531 return false;
5532 }
5533 }
5534 return true;
5535}
5536
5537bool QuicFramer::RaiseError(QuicErrorCode error) {
5538 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error)
5539 << " detail: " << detailed_error_;
5540 set_error(error);
nharper55fa6132019-05-07 19:37:21 -07005541 if (visitor_) {
5542 visitor_->OnError(this);
5543 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005544 return false;
5545}
5546
5547bool QuicFramer::IsVersionNegotiation(
5548 const QuicPacketHeader& header,
5549 bool packet_has_ietf_packet_header) const {
5550 if (perspective_ == Perspective::IS_SERVER) {
dschinazi072da7c2019-05-07 17:57:42 -07005551 if (!GetQuicRestartFlag(quic_server_drop_version_negotiation)) {
5552 return false;
5553 }
5554 QUIC_RESTART_FLAG_COUNT_N(quic_server_drop_version_negotiation, 2, 2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005555 }
dschinazi072da7c2019-05-07 17:57:42 -07005556 if (!packet_has_ietf_packet_header &&
5557 perspective_ == Perspective::IS_CLIENT) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005558 return header.version_flag;
5559 }
5560 if (header.form == IETF_QUIC_SHORT_HEADER_PACKET) {
5561 return false;
5562 }
5563 return header.long_packet_type == VERSION_NEGOTIATION;
5564}
5565
QUICHE teama6ef0a62019-03-07 20:34:33 -05005566bool QuicFramer::AppendIetfConnectionCloseFrame(
5567 const QuicConnectionCloseFrame& frame,
5568 QuicDataWriter* writer) {
fkastenholz72f509b2019-04-10 09:17:49 -07005569 if (frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE &&
5570 frame.close_type != IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
5571 QUIC_BUG << "Invalid close_type for writing IETF CONNECTION CLOSE.";
5572 set_detailed_error("Invalid close_type for writing IETF CONNECTION CLOSE.");
5573 return false;
5574 }
5575
fkastenholze9d71a82019-04-09 05:12:13 -07005576 if (!writer->WriteUInt16(frame.application_error_code)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005577 set_detailed_error("Can not write connection close frame error code");
5578 return false;
5579 }
fkastenholze9d71a82019-04-09 05:12:13 -07005580
fkastenholz72f509b2019-04-10 09:17:49 -07005581 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5582 // Write the frame-type of the frame causing the error only
5583 // if it's a CONNECTION_CLOSE/Transport.
5584 if (!writer->WriteVarInt62(frame.transport_close_frame_type)) {
5585 set_detailed_error("Writing frame type failed.");
5586 return false;
5587 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005588 }
5589
fkastenholz72f509b2019-04-10 09:17:49 -07005590 // TODO(fkastenholz): For full IETF CONNECTION CLOSE support,
5591 // if this is a Transport CONNECTION_CLOSE and the extended
5592 // error is not QUIC_IETF_GQUIC_ERROR_MISSING then append the extended
5593 // "QuicErrorCode: #" string to the phrase.
QUICHE teama6ef0a62019-03-07 20:34:33 -05005594 if (!writer->WriteStringPieceVarInt62(
5595 TruncateErrorString(frame.error_details))) {
5596 set_detailed_error("Can not write connection close phrase");
5597 return false;
5598 }
5599 return true;
5600}
5601
QUICHE teama6ef0a62019-03-07 20:34:33 -05005602bool QuicFramer::ProcessIetfConnectionCloseFrame(
5603 QuicDataReader* reader,
fkastenholze9d71a82019-04-09 05:12:13 -07005604 QuicConnectionCloseType type,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005605 QuicConnectionCloseFrame* frame) {
fkastenholze9d71a82019-04-09 05:12:13 -07005606 frame->close_type = type;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005607 uint16_t code;
5608 if (!reader->ReadUInt16(&code)) {
5609 set_detailed_error("Unable to read connection close error code.");
5610 return false;
5611 }
fkastenholze9d71a82019-04-09 05:12:13 -07005612 frame->transport_error_code = static_cast<QuicIetfTransportErrorCodes>(code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005613
fkastenholz72f509b2019-04-10 09:17:49 -07005614 if (type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5615 // The frame-type of the frame causing the error is present only
5616 // if it's a CONNECTION_CLOSE/Transport.
5617 if (!reader->ReadVarInt62(&frame->transport_close_frame_type)) {
5618 set_detailed_error("Unable to read connection close frame type.");
5619 return false;
5620 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005621 }
5622
5623 uint64_t phrase_length;
5624 if (!reader->ReadVarInt62(&phrase_length)) {
5625 set_detailed_error("Unable to read connection close error details.");
5626 return false;
5627 }
5628 QuicStringPiece phrase;
5629 if (!reader->ReadStringPiece(&phrase, static_cast<size_t>(phrase_length))) {
5630 set_detailed_error("Unable to read connection close error details.");
5631 return false;
5632 }
fkastenholz72f509b2019-04-10 09:17:49 -07005633 // TODO(fkastenholz): when full support is done, add code here
5634 // to extract the extended error code from the reason phrase
5635 // and set it into frame->extracted_error_code.
vasilvvc48c8712019-03-11 13:38:16 -07005636 frame->error_details = std::string(phrase);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005637
5638 return true;
5639}
5640
5641// IETF Quic Path Challenge/Response frames.
5642bool QuicFramer::ProcessPathChallengeFrame(QuicDataReader* reader,
5643 QuicPathChallengeFrame* frame) {
5644 if (!reader->ReadBytes(frame->data_buffer.data(),
5645 frame->data_buffer.size())) {
5646 set_detailed_error("Can not read path challenge data.");
5647 return false;
5648 }
5649 return true;
5650}
5651
5652bool QuicFramer::ProcessPathResponseFrame(QuicDataReader* reader,
5653 QuicPathResponseFrame* frame) {
5654 if (!reader->ReadBytes(frame->data_buffer.data(),
5655 frame->data_buffer.size())) {
5656 set_detailed_error("Can not read path response data.");
5657 return false;
5658 }
5659 return true;
5660}
5661
5662bool QuicFramer::AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
5663 QuicDataWriter* writer) {
5664 if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5665 set_detailed_error("Writing Path Challenge data failed.");
5666 return false;
5667 }
5668 return true;
5669}
5670
5671bool QuicFramer::AppendPathResponseFrame(const QuicPathResponseFrame& frame,
5672 QuicDataWriter* writer) {
5673 if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5674 set_detailed_error("Writing Path Response data failed.");
5675 return false;
5676 }
5677 return true;
5678}
5679
5680// Add a new ietf-format stream reset frame.
5681// General format is
5682// stream id
5683// application error code
5684// final offset
5685bool QuicFramer::AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
5686 QuicDataWriter* writer) {
5687 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
5688 set_detailed_error("Writing reset-stream stream id failed.");
5689 return false;
5690 }
5691 if (!writer->WriteUInt16(frame.ietf_error_code)) {
5692 set_detailed_error("Writing reset-stream error code failed.");
5693 return false;
5694 }
5695 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.byte_offset))) {
5696 set_detailed_error("Writing reset-stream final-offset failed.");
5697 return false;
5698 }
5699 return true;
5700}
5701
5702bool QuicFramer::ProcessIetfResetStreamFrame(QuicDataReader* reader,
5703 QuicRstStreamFrame* frame) {
5704 // Get Stream ID from frame. ReadVarIntStreamID returns false
5705 // if either A) there is a read error or B) the resulting value of
5706 // the Stream ID is larger than the maximum allowed value.
fkastenholz3c4eabf2019-04-22 07:49:59 -07005707 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005708 set_detailed_error("Unable to read rst stream stream id.");
5709 return false;
5710 }
5711
5712 if (!reader->ReadUInt16(&frame->ietf_error_code)) {
5713 set_detailed_error("Unable to read rst stream error code.");
5714 return false;
5715 }
5716
5717 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5718 set_detailed_error("Unable to read rst stream sent byte offset.");
5719 return false;
5720 }
5721 return true;
5722}
5723
5724bool QuicFramer::ProcessStopSendingFrame(
5725 QuicDataReader* reader,
5726 QuicStopSendingFrame* stop_sending_frame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005727 if (!reader->ReadVarIntU32(&stop_sending_frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005728 set_detailed_error("Unable to read stop sending stream id.");
5729 return false;
5730 }
5731
5732 if (!reader->ReadUInt16(&stop_sending_frame->application_error_code)) {
5733 set_detailed_error("Unable to read stop sending application error code.");
5734 return false;
5735 }
5736 return true;
5737}
5738
5739bool QuicFramer::AppendStopSendingFrame(
5740 const QuicStopSendingFrame& stop_sending_frame,
5741 QuicDataWriter* writer) {
5742 if (!writer->WriteVarInt62(stop_sending_frame.stream_id)) {
5743 set_detailed_error("Can not write stop sending stream id");
5744 return false;
5745 }
5746 if (!writer->WriteUInt16(stop_sending_frame.application_error_code)) {
5747 set_detailed_error("Can not write application error code");
5748 return false;
5749 }
5750 return true;
5751}
5752
5753// Append/process IETF-Format MAX_DATA Frame
5754bool QuicFramer::AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
5755 QuicDataWriter* writer) {
5756 if (!writer->WriteVarInt62(frame.byte_offset)) {
5757 set_detailed_error("Can not write MAX_DATA byte-offset");
5758 return false;
5759 }
5760 return true;
5761}
5762
5763bool QuicFramer::ProcessMaxDataFrame(QuicDataReader* reader,
5764 QuicWindowUpdateFrame* frame) {
5765 frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
5766 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5767 set_detailed_error("Can not read MAX_DATA byte-offset");
5768 return false;
5769 }
5770 return true;
5771}
5772
5773// Append/process IETF-Format MAX_STREAM_DATA Frame
5774bool QuicFramer::AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
5775 QuicDataWriter* writer) {
5776 if (!writer->WriteVarInt62(frame.stream_id)) {
5777 set_detailed_error("Can not write MAX_STREAM_DATA stream id");
5778 return false;
5779 }
5780 if (!writer->WriteVarInt62(frame.byte_offset)) {
5781 set_detailed_error("Can not write MAX_STREAM_DATA byte-offset");
5782 return false;
5783 }
5784 return true;
5785}
5786
5787bool QuicFramer::ProcessMaxStreamDataFrame(QuicDataReader* reader,
5788 QuicWindowUpdateFrame* frame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005789 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005790 set_detailed_error("Can not read MAX_STREAM_DATA stream id");
5791 return false;
5792 }
5793 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5794 set_detailed_error("Can not read MAX_STREAM_DATA byte-count");
5795 return false;
5796 }
5797 return true;
5798}
5799
fkastenholz3c4eabf2019-04-22 07:49:59 -07005800bool QuicFramer::AppendMaxStreamsFrame(const QuicMaxStreamsFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005801 QuicDataWriter* writer) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005802 if (!writer->WriteVarInt62(frame.stream_count)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005803 set_detailed_error("Can not write MAX_STREAMS stream count");
5804 return false;
5805 }
5806 return true;
5807}
5808
5809bool QuicFramer::ProcessMaxStreamsFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -07005810 QuicMaxStreamsFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005811 uint64_t frame_type) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005812 if (!reader->ReadVarIntU32(&frame->stream_count)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005813 set_detailed_error("Can not read MAX_STREAMS stream count.");
5814 return false;
5815 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07005816 frame->unidirectional = (frame_type == IETF_MAX_STREAMS_UNIDIRECTIONAL);
5817 return true;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005818}
5819
5820bool QuicFramer::AppendIetfBlockedFrame(const QuicBlockedFrame& frame,
5821 QuicDataWriter* writer) {
5822 if (!writer->WriteVarInt62(frame.offset)) {
5823 set_detailed_error("Can not write blocked offset.");
5824 return false;
5825 }
5826 return true;
5827}
5828
5829bool QuicFramer::ProcessIetfBlockedFrame(QuicDataReader* reader,
5830 QuicBlockedFrame* frame) {
5831 // Indicates that it is a BLOCKED frame (as opposed to STREAM_BLOCKED).
5832 frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
5833 if (!reader->ReadVarInt62(&frame->offset)) {
5834 set_detailed_error("Can not read blocked offset.");
5835 return false;
5836 }
5837 return true;
5838}
5839
5840bool QuicFramer::AppendStreamBlockedFrame(const QuicBlockedFrame& frame,
5841 QuicDataWriter* writer) {
5842 if (!writer->WriteVarInt62(frame.stream_id)) {
5843 set_detailed_error("Can not write stream blocked stream id.");
5844 return false;
5845 }
5846 if (!writer->WriteVarInt62(frame.offset)) {
5847 set_detailed_error("Can not write stream blocked offset.");
5848 return false;
5849 }
5850 return true;
5851}
5852
5853bool QuicFramer::ProcessStreamBlockedFrame(QuicDataReader* reader,
5854 QuicBlockedFrame* frame) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005855 if (!reader->ReadVarIntU32(&frame->stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005856 set_detailed_error("Can not read stream blocked stream id.");
5857 return false;
5858 }
5859 if (!reader->ReadVarInt62(&frame->offset)) {
5860 set_detailed_error("Can not read stream blocked offset.");
5861 return false;
5862 }
5863 return true;
5864}
5865
fkastenholz3c4eabf2019-04-22 07:49:59 -07005866bool QuicFramer::AppendStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
5867 QuicDataWriter* writer) {
5868 if (!writer->WriteVarInt62(frame.stream_count)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005869 set_detailed_error("Can not write STREAMS_BLOCKED stream count");
5870 return false;
5871 }
5872 return true;
5873}
5874
5875bool QuicFramer::ProcessStreamsBlockedFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -07005876 QuicStreamsBlockedFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005877 uint64_t frame_type) {
fkastenholz3c4eabf2019-04-22 07:49:59 -07005878 if (!reader->ReadVarIntU32(&frame->stream_count)) {
5879 set_detailed_error("Can not read STREAMS_BLOCKED stream count.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05005880 return false;
5881 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07005882 frame->unidirectional = (frame_type == IETF_STREAMS_BLOCKED_UNIDIRECTIONAL);
5883
QUICHE teama6ef0a62019-03-07 20:34:33 -05005884 // TODO(fkastenholz): handle properly when the STREAMS_BLOCKED
5885 // frame is implemented and passed up to the stream ID manager.
fkastenholz3c4eabf2019-04-22 07:49:59 -07005886 if (frame->stream_count >
5887 QuicUtils::GetMaxStreamCount(
5888 (frame_type == IETF_STREAMS_BLOCKED_UNIDIRECTIONAL),
5889 ((perspective_ == Perspective::IS_CLIENT)
5890 ? Perspective::IS_SERVER
5891 : Perspective::IS_CLIENT))) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005892 // If stream count is such that the resulting stream ID would exceed our
5893 // implementation limit, generate an error.
5894 set_detailed_error(
5895 "STREAMS_BLOCKED stream count exceeds implementation limit.");
5896 return false;
5897 }
fkastenholz3c4eabf2019-04-22 07:49:59 -07005898 return true;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005899}
5900
5901bool QuicFramer::AppendNewConnectionIdFrame(
5902 const QuicNewConnectionIdFrame& frame,
5903 QuicDataWriter* writer) {
5904 if (!writer->WriteVarInt62(frame.sequence_number)) {
5905 set_detailed_error("Can not write New Connection ID sequence number");
5906 return false;
5907 }
5908 if (!writer->WriteUInt8(frame.connection_id.length())) {
5909 set_detailed_error(
5910 "Can not write New Connection ID frame connection ID Length");
5911 return false;
5912 }
5913 if (!writer->WriteConnectionId(frame.connection_id)) {
5914 set_detailed_error("Can not write New Connection ID frame connection ID");
5915 return false;
5916 }
5917
5918 if (!writer->WriteBytes(
5919 static_cast<const void*>(&frame.stateless_reset_token),
5920 sizeof(frame.stateless_reset_token))) {
5921 set_detailed_error("Can not write New Connection ID Reset Token");
5922 return false;
5923 }
5924 return true;
5925}
5926
5927bool QuicFramer::ProcessNewConnectionIdFrame(QuicDataReader* reader,
5928 QuicNewConnectionIdFrame* frame) {
5929 if (!reader->ReadVarInt62(&frame->sequence_number)) {
5930 set_detailed_error(
5931 "Unable to read new connection ID frame sequence number.");
5932 return false;
5933 }
5934
5935 uint8_t connection_id_length;
5936 if (!reader->ReadUInt8(&connection_id_length)) {
5937 set_detailed_error(
5938 "Unable to read new connection ID frame connection id length.");
5939 return false;
5940 }
5941
QUICHE team0131a5b2019-03-20 15:23:27 -07005942 if (connection_id_length > kQuicMaxConnectionIdLength) {
5943 set_detailed_error("New connection ID length too high.");
5944 return false;
5945 }
5946
QUICHE team8e2e4532019-03-14 14:37:56 -07005947 if (connection_id_length != kQuicDefaultConnectionIdLength &&
5948 !QuicUtils::VariableLengthConnectionIdAllowedForVersion(
5949 transport_version())) {
QUICHE team0131a5b2019-03-20 15:23:27 -07005950 set_detailed_error("Invalid new connection ID length for version.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05005951 return false;
5952 }
5953
5954 if (!reader->ReadConnectionId(&frame->connection_id, connection_id_length)) {
5955 set_detailed_error("Unable to read new connection ID frame connection id.");
5956 return false;
5957 }
5958
5959 if (!reader->ReadBytes(&frame->stateless_reset_token,
5960 sizeof(frame->stateless_reset_token))) {
5961 set_detailed_error("Can not read new connection ID frame reset token.");
5962 return false;
5963 }
5964 return true;
5965}
5966
5967bool QuicFramer::AppendRetireConnectionIdFrame(
5968 const QuicRetireConnectionIdFrame& frame,
5969 QuicDataWriter* writer) {
5970 if (!writer->WriteVarInt62(frame.sequence_number)) {
5971 set_detailed_error("Can not write Retire Connection ID sequence number");
5972 return false;
5973 }
5974 return true;
5975}
5976
5977bool QuicFramer::ProcessRetireConnectionIdFrame(
5978 QuicDataReader* reader,
5979 QuicRetireConnectionIdFrame* frame) {
5980 if (!reader->ReadVarInt62(&frame->sequence_number)) {
5981 set_detailed_error(
5982 "Unable to read retire connection ID frame sequence number.");
5983 return false;
5984 }
5985 return true;
5986}
5987
5988uint8_t QuicFramer::GetStreamFrameTypeByte(const QuicStreamFrame& frame,
5989 bool last_frame_in_packet) const {
5990 if (version_.transport_version == QUIC_VERSION_99) {
5991 return GetIetfStreamFrameTypeByte(frame, last_frame_in_packet);
5992 }
5993 uint8_t type_byte = 0;
5994 // Fin bit.
5995 type_byte |= frame.fin ? kQuicStreamFinMask : 0;
5996
5997 // Data Length bit.
5998 type_byte <<= kQuicStreamDataLengthShift;
5999 type_byte |= last_frame_in_packet ? 0 : kQuicStreamDataLengthMask;
6000
6001 // Offset 3 bits.
6002 type_byte <<= kQuicStreamShift;
6003 const size_t offset_len =
6004 GetStreamOffsetSize(version_.transport_version, frame.offset);
6005 if (offset_len > 0) {
6006 type_byte |= offset_len - 1;
6007 }
6008
6009 // stream id 2 bits.
6010 type_byte <<= kQuicStreamIdShift;
6011 type_byte |= GetStreamIdSize(frame.stream_id) - 1;
6012 type_byte |= kQuicFrameTypeStreamMask; // Set Stream Frame Type to 1.
6013
6014 return type_byte;
6015}
6016
6017uint8_t QuicFramer::GetIetfStreamFrameTypeByte(
6018 const QuicStreamFrame& frame,
6019 bool last_frame_in_packet) const {
6020 DCHECK_EQ(QUIC_VERSION_99, version_.transport_version);
6021 uint8_t type_byte = IETF_STREAM;
6022 if (!last_frame_in_packet) {
6023 type_byte |= IETF_STREAM_FRAME_LEN_BIT;
6024 }
6025 if (frame.offset != 0) {
6026 type_byte |= IETF_STREAM_FRAME_OFF_BIT;
6027 }
6028 if (frame.fin) {
6029 type_byte |= IETF_STREAM_FRAME_FIN_BIT;
6030 }
6031 return type_byte;
6032}
6033
6034void QuicFramer::InferPacketHeaderTypeFromVersion() {
6035 // This function should only be called when server connection negotiates the
6036 // version.
6037 DCHECK(perspective_ == Perspective::IS_SERVER &&
6038 !infer_packet_header_type_from_version_);
6039 infer_packet_header_type_from_version_ = true;
6040}
6041
QUICHE team10b22a12019-03-21 15:31:42 -07006042void QuicFramer::EnableMultiplePacketNumberSpacesSupport() {
6043 if (supports_multiple_packet_number_spaces_) {
6044 QUIC_BUG << "Multiple packet number spaces has already been enabled";
6045 return;
6046 }
6047 if (largest_packet_number_.IsInitialized()) {
6048 QUIC_BUG << "Try to enable multiple packet number spaces support after any "
6049 "packet has been received.";
6050 return;
6051 }
6052
6053 supports_multiple_packet_number_spaces_ = true;
6054}
6055
fayangccbab732019-05-13 10:11:25 -07006056// static
6057QuicErrorCode QuicFramer::ProcessPacketDispatcher(
6058 const QuicEncryptedPacket& packet,
dschinazib42a8c52019-05-30 09:45:01 -07006059 uint8_t expected_destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -07006060 PacketHeaderFormat* format,
6061 bool* version_flag,
6062 QuicVersionLabel* version_label,
fayangccbab732019-05-13 10:11:25 -07006063 QuicConnectionId* destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -07006064 QuicConnectionId* source_connection_id,
fayangccbab732019-05-13 10:11:25 -07006065 std::string* detailed_error) {
6066 QuicDataReader reader(packet.data(), packet.length());
6067
dschinazib42a8c52019-05-30 09:45:01 -07006068 *source_connection_id = EmptyQuicConnectionId();
fayangccbab732019-05-13 10:11:25 -07006069 uint8_t first_byte;
6070 if (!reader.ReadBytes(&first_byte, 1)) {
6071 *detailed_error = "Unable to read first byte.";
6072 return QUIC_INVALID_PACKET_HEADER;
6073 }
dschinazib42a8c52019-05-30 09:45:01 -07006074 uint8_t destination_connection_id_length = 0, source_connection_id_length = 0;
fayangccbab732019-05-13 10:11:25 -07006075 if (!QuicUtils::IsIetfPacketHeader(first_byte)) {
6076 *format = GOOGLE_QUIC_PACKET;
6077 *version_flag = (first_byte & PACKET_PUBLIC_FLAGS_VERSION) != 0;
dschinazib42a8c52019-05-30 09:45:01 -07006078 destination_connection_id_length =
fayangccbab732019-05-13 10:11:25 -07006079 first_byte & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID;
dschinazib42a8c52019-05-30 09:45:01 -07006080 if (destination_connection_id_length == 0 ||
fayangccbab732019-05-13 10:11:25 -07006081 !reader.ReadConnectionId(destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -07006082 destination_connection_id_length)) {
fayangccbab732019-05-13 10:11:25 -07006083 *detailed_error = "Unable to read ConnectionId.";
6084 return QUIC_INVALID_PACKET_HEADER;
6085 }
6086 if (*version_flag && !ProcessVersionLabel(&reader, version_label)) {
6087 *detailed_error = "Unable to read protocol version.";
6088 return QUIC_INVALID_PACKET_HEADER;
6089 }
6090 return QUIC_NO_ERROR;
6091 }
6092
6093 *format = GetIetfPacketHeaderFormat(first_byte);
6094 QUIC_DVLOG(1) << "Dispatcher: Processing IETF QUIC packet, format: "
6095 << *format;
6096 *version_flag = *format == IETF_QUIC_LONG_HEADER_PACKET;
6097 if (*format == IETF_QUIC_LONG_HEADER_PACKET) {
6098 if (!ProcessVersionLabel(&reader, version_label)) {
6099 *detailed_error = "Unable to read protocol version.";
6100 return QUIC_INVALID_PACKET_HEADER;
6101 }
dschinazi8ff74822019-05-28 16:37:20 -07006102 // Set should_update_expected_server_connection_id_length to true to bypass
fayangccbab732019-05-13 10:11:25 -07006103 // connection ID lengths validation.
dschinazi8ff74822019-05-28 16:37:20 -07006104 uint8_t unused_expected_server_connection_id_length = 0;
fayangccbab732019-05-13 10:11:25 -07006105 if (!ProcessAndValidateIetfConnectionIdLength(
6106 &reader, ParseQuicVersionLabel(*version_label),
dschinazi334f0232019-05-29 16:08:53 -07006107 Perspective::IS_SERVER,
dschinazi8ff74822019-05-28 16:37:20 -07006108 /*should_update_expected_server_connection_id_length=*/true,
6109 &unused_expected_server_connection_id_length,
dschinazib42a8c52019-05-30 09:45:01 -07006110 &destination_connection_id_length, &source_connection_id_length,
6111 detailed_error)) {
fayangccbab732019-05-13 10:11:25 -07006112 return QUIC_INVALID_PACKET_HEADER;
6113 }
6114 } else {
dschinazib42a8c52019-05-30 09:45:01 -07006115 // For short header packets, expected_destination_connection_id_length
6116 // is used to determine the destination_connection_id_length.
6117 destination_connection_id_length =
6118 expected_destination_connection_id_length;
6119 DCHECK_EQ(0, source_connection_id_length);
fayangccbab732019-05-13 10:11:25 -07006120 }
6121 // Read destination connection ID.
6122 if (!reader.ReadConnectionId(destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -07006123 destination_connection_id_length)) {
6124 *detailed_error = "Unable to read destination connection ID.";
6125 return QUIC_INVALID_PACKET_HEADER;
6126 }
6127 // Read source connection ID.
6128 if (GetQuicRestartFlag(quic_do_not_override_connection_id) &&
6129 !reader.ReadConnectionId(source_connection_id,
6130 source_connection_id_length)) {
6131 *detailed_error = "Unable to read source connection ID.";
fayangccbab732019-05-13 10:11:25 -07006132 return QUIC_INVALID_PACKET_HEADER;
6133 }
6134 return QUIC_NO_ERROR;
6135}
6136
dschinazide0f6dc2019-05-15 16:10:11 -07006137// static
6138bool QuicFramer::WriteClientVersionNegotiationProbePacket(
6139 char* packet_bytes,
6140 QuicByteCount packet_length,
6141 const char* destination_connection_id_bytes,
6142 uint8_t destination_connection_id_length) {
6143 if (packet_bytes == nullptr) {
6144 QUIC_BUG << "Invalid packet_bytes";
6145 return false;
6146 }
6147 if (packet_length < kMinPacketSizeForVersionNegotiation ||
6148 packet_length > 65535) {
6149 QUIC_BUG << "Invalid packet_length";
6150 return false;
6151 }
6152 if (destination_connection_id_length > kQuicMaxConnectionIdLength ||
6153 (destination_connection_id_length > 0 &&
6154 destination_connection_id_length < 4)) {
6155 QUIC_BUG << "Invalid connection_id_length";
6156 return false;
6157 }
6158 // clang-format off
6159 static const unsigned char packet_start_bytes[] = {
6160 // IETF long header with fixed bit set, type initial, all-0 encrypted bits.
6161 0xc0,
6162 // Version, part of the IETF space reserved for negotiation.
6163 // This intentionally differs from QuicVersionReservedForNegotiation()
6164 // to allow differentiating them over the wire.
6165 0xca, 0xba, 0xda, 0xba,
6166 };
6167 // clang-format on
6168 static_assert(sizeof(packet_start_bytes) == 5, "bad packet_start_bytes size");
6169 QuicDataWriter writer(packet_length, packet_bytes);
6170 if (!writer.WriteBytes(packet_start_bytes, sizeof(packet_start_bytes))) {
6171 QUIC_BUG << "Failed to write packet start";
6172 return false;
6173 }
6174
6175 QuicConnectionId destination_connection_id(destination_connection_id_bytes,
6176 destination_connection_id_length);
6177 if (!AppendIetfConnectionIds(/*version_flag=*/true, destination_connection_id,
6178 EmptyQuicConnectionId(), &writer)) {
6179 QUIC_BUG << "Failed to write connection IDs";
6180 return false;
6181 }
6182 // Add 8 bytes of zeroes followed by 8 bytes of ones to ensure that this does
6183 // not parse with any known version. The zeroes make sure that packet numbers,
6184 // retry token lengths and payload lengths are parsed as zero, and if the
6185 // zeroes are treated as padding frames, 0xff is known to not parse as a
6186 // valid frame type.
6187 if (!writer.WriteUInt64(0) ||
6188 !writer.WriteUInt64(std::numeric_limits<uint64_t>::max())) {
6189 QUIC_BUG << "Failed to write 18 bytes";
6190 return false;
6191 }
6192 // Make sure the polite greeting below is padded to a 16-byte boundary to
6193 // make it easier to read in tcpdump.
6194 while (writer.length() % 16 != 0) {
6195 if (!writer.WriteUInt8(0)) {
6196 QUIC_BUG << "Failed to write padding byte";
6197 return false;
6198 }
6199 }
6200 // Add a polite greeting in case a human sees this in tcpdump.
6201 static const char polite_greeting[] =
6202 "This packet only exists to trigger IETF QUIC version negotiation. "
6203 "Please respond with a Version Negotiation packet indicating what "
6204 "versions you support. Thank you and have a nice day.";
6205 if (!writer.WriteBytes(polite_greeting, sizeof(polite_greeting))) {
6206 QUIC_BUG << "Failed to write polite greeting";
6207 return false;
6208 }
6209 // Fill the rest of the packet with zeroes.
6210 writer.WritePadding();
6211 DCHECK_EQ(0u, writer.remaining());
6212 return true;
6213}
6214
6215// static
6216bool QuicFramer::ParseServerVersionNegotiationProbeResponse(
6217 const char* packet_bytes,
6218 QuicByteCount packet_length,
6219 char* source_connection_id_bytes,
6220 uint8_t* source_connection_id_length_out,
6221 std::string* detailed_error) {
6222 if (detailed_error == nullptr) {
6223 QUIC_BUG << "Invalid error_details";
6224 return false;
6225 }
6226 *detailed_error = "";
6227 if (packet_bytes == nullptr) {
6228 *detailed_error = "Invalid packet_bytes";
6229 return false;
6230 }
6231 if (packet_length < 6) {
6232 *detailed_error = "Invalid packet_length";
6233 return false;
6234 }
6235 if (source_connection_id_bytes == nullptr) {
6236 *detailed_error = "Invalid source_connection_id_bytes";
6237 return false;
6238 }
6239 if (source_connection_id_length_out == nullptr) {
6240 *detailed_error = "Invalid source_connection_id_length_out";
6241 return false;
6242 }
6243 QuicDataReader reader(packet_bytes, packet_length);
6244 uint8_t type_byte = 0;
6245 if (!reader.ReadUInt8(&type_byte)) {
6246 *detailed_error = "Failed to read type byte";
6247 return false;
6248 }
6249 if ((type_byte & 0x80) == 0) {
6250 *detailed_error = "Packet does not have long header";
6251 return false;
6252 }
6253 uint32_t version = 0;
6254 if (!reader.ReadUInt32(&version)) {
6255 *detailed_error = "Failed to read version";
6256 return false;
6257 }
6258 if (version != 0) {
6259 *detailed_error = "Packet is not a version negotiation packet";
6260 return false;
6261 }
dschinazi8ff74822019-05-28 16:37:20 -07006262 uint8_t expected_server_connection_id_length = 0,
dschinazide0f6dc2019-05-15 16:10:11 -07006263 destination_connection_id_length = 0, source_connection_id_length = 0;
6264 if (!ProcessAndValidateIetfConnectionIdLength(
dschinazi334f0232019-05-29 16:08:53 -07006265 &reader, UnsupportedQuicVersion(), Perspective::IS_CLIENT,
dschinazi8ff74822019-05-28 16:37:20 -07006266 /*should_update_expected_server_connection_id_length=*/true,
6267 &expected_server_connection_id_length,
6268 &destination_connection_id_length, &source_connection_id_length,
6269 detailed_error)) {
dschinazide0f6dc2019-05-15 16:10:11 -07006270 return false;
6271 }
6272 if (destination_connection_id_length != 0) {
6273 *detailed_error = "Received unexpected destination connection ID length";
6274 return false;
6275 }
6276 QuicConnectionId destination_connection_id, source_connection_id;
6277 if (!reader.ReadConnectionId(&destination_connection_id,
6278 destination_connection_id_length)) {
6279 *detailed_error = "Failed to read destination connection ID";
6280 return false;
6281 }
6282 if (!reader.ReadConnectionId(&source_connection_id,
6283 source_connection_id_length)) {
6284 *detailed_error = "Failed to read source connection ID";
6285 return false;
6286 }
6287
6288 memcpy(source_connection_id_bytes, source_connection_id.data(),
6289 source_connection_id_length);
6290 *source_connection_id_length_out = source_connection_id_length;
6291
6292 return true;
6293}
6294
QUICHE teama6ef0a62019-03-07 20:34:33 -05006295#undef ENDPOINT // undef for jumbo builds
6296} // namespace quic