Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Side by Side Diff: net/quic/quic_framer.cc

Issue 15937012: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Small bug fixes Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include "base/hash_tables.h" 7 #include "base/hash_tables.h"
8 #include "net/quic/crypto/quic_decrypter.h" 8 #include "net/quic/crypto/quic_decrypter.h"
9 #include "net/quic/crypto/quic_encrypter.h" 9 #include "net/quic/crypto/quic_encrypter.h"
10 #include "net/quic/quic_data_reader.h" 10 #include "net/quic/quic_data_reader.h"
11 #include "net/quic/quic_data_writer.h" 11 #include "net/quic/quic_data_writer.h"
12 #include "net/quic/quic_utils.h" 12 #include "net/quic/quic_utils.h"
13 13
14 using base::StringPiece; 14 using base::StringPiece;
15 using std::make_pair; 15 using std::make_pair;
16 using std::map; 16 using std::map;
17 using std::numeric_limits; 17 using std::numeric_limits;
18 using std::string; 18 using std::string;
19 19
20 namespace net { 20 namespace net {
21 21
22 namespace { 22 namespace {
23 23
24 // Mask to select the lowest 48 bits of a sequence number. 24 // Mask to select the lowest 48 bits of a sequence number.
25 const QuicPacketSequenceNumber kSequenceNumberMask = 25 const QuicPacketSequenceNumber kSequenceNumberMask =
26 GG_UINT64_C(0x0000FFFFFFFFFFFF); 26 GG_UINT64_C(0x0000FFFFFFFFFFFF);
27 27
28 const QuicGuid k1ByteGuidMask = GG_UINT64_C(0x00000000000000FF);
29 const QuicGuid k4ByteGuidMask = GG_UINT64_C(0x00000000FFFFFFFF);
30
28 const uint32 kInvalidDeltaTime = 0xffffffff; 31 const uint32 kInvalidDeltaTime = 0xffffffff;
29 32
30 // Returns the absolute value of the difference between |a| and |b|. 33 // Returns the absolute value of the difference between |a| and |b|.
31 QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a, 34 QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a,
32 QuicPacketSequenceNumber b) { 35 QuicPacketSequenceNumber b) {
33 // Since these are unsigned numbers, we can't just return abs(a - b) 36 // Since these are unsigned numbers, we can't just return abs(a - b)
34 if (a < b) { 37 if (a < b) {
35 return b - a; 38 return b - a;
36 } 39 }
37 return a - b; 40 return a - b;
38 } 41 }
39 42
40 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, 43 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target,
41 QuicPacketSequenceNumber a, 44 QuicPacketSequenceNumber a,
42 QuicPacketSequenceNumber b) { 45 QuicPacketSequenceNumber b) {
43 return (Delta(target, a) < Delta(target, b)) ? a : b; 46 return (Delta(target, a) < Delta(target, b)) ? a : b;
44 } 47 }
45 48
46 } // namespace 49 } // namespace
47 50
48 QuicFramer::QuicFramer(QuicTag version, 51 QuicFramer::QuicFramer(QuicTag version,
49 QuicTime creation_time, 52 QuicTime creation_time,
50 bool is_server) 53 bool is_server)
51 : visitor_(NULL), 54 : visitor_(NULL),
52 fec_builder_(NULL), 55 fec_builder_(NULL),
53 error_(QUIC_NO_ERROR), 56 error_(QUIC_NO_ERROR),
54 last_sequence_number_(0), 57 last_sequence_number_(0),
58 last_serialized_guid_(0),
55 quic_version_(version), 59 quic_version_(version),
56 decrypter_(QuicDecrypter::Create(kNULL)), 60 decrypter_(QuicDecrypter::Create(kNULL)),
57 alternative_decrypter_latch_(false), 61 alternative_decrypter_latch_(false),
58 is_server_(is_server), 62 is_server_(is_server),
59 creation_time_(creation_time) { 63 creation_time_(creation_time) {
60 DCHECK(IsSupportedVersion(version)); 64 DCHECK(IsSupportedVersion(version));
61 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); 65 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL));
62 } 66 }
63 67
64 QuicFramer::~QuicFramer() {} 68 QuicFramer::~QuicFramer() {}
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 size_t QuicFramer::GetMinGoAwayFrameSize() { 104 size_t QuicFramer::GetMinGoAwayFrameSize() {
101 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + 105 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
102 kQuicStreamIdSize; 106 kQuicStreamIdSize;
103 } 107 }
104 108
105 // static 109 // static
106 // TODO(satyamshekhar): 16 - Crypto hash for integrity. Not a static value. Use 110 // TODO(satyamshekhar): 16 - Crypto hash for integrity. Not a static value. Use
107 // QuicEncrypter::GetMaxPlaintextSize. 111 // QuicEncrypter::GetMaxPlaintextSize.
108 // 16 is a conservative estimate in the case of AEAD_AES_128_GCM_12, which uses 112 // 16 is a conservative estimate in the case of AEAD_AES_128_GCM_12, which uses
109 // 12-byte tags. 113 // 12-byte tags.
110 size_t QuicFramer::GetMaxUnackedPackets(bool include_version) { 114 size_t QuicFramer::GetMaxUnackedPackets(QuicPacketHeader header) {
111 return (kMaxPacketSize - GetPacketHeaderSize(include_version) - 115 return (kMaxPacketSize - GetPacketHeaderSize(header) -
112 GetMinAckFrameSize() - 16) / kSequenceNumberSize; 116 GetMinAckFrameSize() - 16) / kSequenceNumberSize;
113 } 117 }
114 118
115 bool QuicFramer::IsSupportedVersion(QuicTag version) { 119 bool QuicFramer::IsSupportedVersion(QuicTag version) {
116 return version == kQuicVersion1; 120 return version == kQuicVersion1;
117 } 121 }
118 122
119 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { 123 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
120 return kPublicFlagsSize + kQuicGuidSize + 124 return kPublicFlagsSize + PACKET_8BYTE_GUID +
121 number_versions * kQuicVersionSize; 125 number_versions * kQuicVersionSize;
122 } 126 }
123 127
124 size_t QuicFramer::GetSerializedFrameLength( 128 size_t QuicFramer::GetSerializedFrameLength(
125 const QuicFrame& frame, size_t free_bytes, bool first_frame) { 129 const QuicFrame& frame, size_t free_bytes, bool first_frame) {
126 if (frame.type == PADDING_FRAME) { 130 if (frame.type == PADDING_FRAME) {
127 // PADDING implies end of packet. 131 // PADDING implies end of packet.
128 return free_bytes; 132 return free_bytes;
129 } 133 }
130 size_t frame_len = ComputeFrameLength(frame); 134 size_t frame_len = ComputeFrameLength(frame);
(...skipping 23 matching lines...) Expand all
154 // is not a constant). 158 // is not a constant).
155 return 0; 159 return 0;
156 } 160 }
157 return 1 << (header.packet_sequence_number % 8); 161 return 1 << (header.packet_sequence_number % 8);
158 } 162 }
159 163
160 SerializedPacket QuicFramer::ConstructFrameDataPacket( 164 SerializedPacket QuicFramer::ConstructFrameDataPacket(
161 const QuicPacketHeader& header, 165 const QuicPacketHeader& header,
162 const QuicFrames& frames) { 166 const QuicFrames& frames) {
163 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize); 167 const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize);
164 size_t packet_size = GetPacketHeaderSize(header.public_header.version_flag); 168 size_t packet_size = GetPacketHeaderSize(header);
165 for (size_t i = 0; i < frames.size(); ++i) { 169 for (size_t i = 0; i < frames.size(); ++i) {
166 DCHECK_LE(packet_size, max_plaintext_size); 170 DCHECK_LE(packet_size, max_plaintext_size);
167 const size_t frame_size = GetSerializedFrameLength( 171 const size_t frame_size = GetSerializedFrameLength(
168 frames[i], max_plaintext_size - packet_size, i == 0); 172 frames[i], max_plaintext_size - packet_size, i == 0);
169 DCHECK(frame_size); 173 DCHECK(frame_size);
170 packet_size += frame_size; 174 packet_size += frame_size;
171 } 175 }
172 return ConstructFrameDataPacket(header, frames, packet_size); 176 return ConstructFrameDataPacket(header, frames, packet_size);
173 } 177 }
174 178
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 return kNoPacket; 233 return kNoPacket;
230 } 234 }
231 } 235 }
232 236
233 // Save the length before writing, because take clears it. 237 // Save the length before writing, because take clears it.
234 const size_t len = writer.length(); 238 const size_t len = writer.length();
235 // Less than or equal because truncated acks end up with max_plaintex_size 239 // Less than or equal because truncated acks end up with max_plaintex_size
236 // length, even though they're typically slightly shorter. 240 // length, even though they're typically slightly shorter.
237 DCHECK_LE(len, packet_size); 241 DCHECK_LE(len, packet_size);
238 QuicPacket* packet = QuicPacket::NewDataPacket( 242 QuicPacket* packet = QuicPacket::NewDataPacket(
239 writer.take(), len, true, header.public_header.version_flag); 243 writer.take(), len, true, header.public_header.guid_length,
244 header.public_header.version_flag);
240 245
241 if (fec_builder_) { 246 if (fec_builder_) {
242 fec_builder_->OnBuiltFecProtectedPayload(header, 247 fec_builder_->OnBuiltFecProtectedPayload(header,
243 packet->FecProtectedData()); 248 packet->FecProtectedData());
244 } 249 }
245 250
246 return SerializedPacket(header.packet_sequence_number, packet, 251 return SerializedPacket(header.packet_sequence_number, packet,
247 GetPacketEntropyHash(header), NULL); 252 GetPacketEntropyHash(header), NULL);
248 } 253 }
249 254
250 SerializedPacket QuicFramer::ConstructFecPacket(const QuicPacketHeader& header, 255 SerializedPacket QuicFramer::ConstructFecPacket(
251 const QuicFecData& fec) { 256 const QuicPacketHeader& header,
252 size_t len = GetPacketHeaderSize(header.public_header.version_flag); 257 const QuicFecData& fec) {
258 DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
259 DCHECK_NE(0u, header.fec_group);
260 size_t len = GetPacketHeaderSize(header);
253 len += fec.redundancy.length(); 261 len += fec.redundancy.length();
254 262
255 QuicDataWriter writer(len); 263 QuicDataWriter writer(len);
256 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL); 264 SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL);
257 if (!WritePacketHeader(header, &writer)) { 265 if (!WritePacketHeader(header, &writer)) {
258 return kNoPacket; 266 return kNoPacket;
259 } 267 }
260 268
261 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { 269 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
262 return kNoPacket; 270 return kNoPacket;
263 } 271 }
264 272
265 return SerializedPacket(header.packet_sequence_number, 273 return SerializedPacket(
266 QuicPacket::NewFecPacket( 274 header.packet_sequence_number,
267 writer.take(), len, true, 275 QuicPacket::NewFecPacket(writer.take(), len, true,
268 header.public_header.version_flag), 276 header.public_header.guid_length,
269 GetPacketEntropyHash(header), NULL); 277 header.public_header.version_flag),
278 GetPacketEntropyHash(header), NULL);
270 } 279 }
271 280
272 // static 281 // static
273 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket( 282 QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket(
274 const QuicPublicResetPacket& packet) { 283 const QuicPublicResetPacket& packet) {
275 DCHECK(packet.public_header.reset_flag); 284 DCHECK(packet.public_header.reset_flag);
276 size_t len = GetPublicResetPacketSize(); 285 size_t len = GetPublicResetPacketSize();
277 QuicDataWriter writer(len); 286 QuicDataWriter writer(len);
278 287
279 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | 288 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 return true; 401 return true;
393 } 402 }
394 403
395 if (packet.length() > kMaxPacketSize) { 404 if (packet.length() > kMaxPacketSize) {
396 DLOG(WARNING) << "Packet too large: " << packet.length(); 405 DLOG(WARNING) << "Packet too large: " << packet.length();
397 return RaiseError(QUIC_PACKET_TOO_LARGE); 406 return RaiseError(QUIC_PACKET_TOO_LARGE);
398 } 407 }
399 408
400 // Handle the payload. 409 // Handle the payload.
401 if (!header.fec_flag) { 410 if (!header.fec_flag) {
402 if (header.fec_group != 0) { 411 if (header.is_in_fec_group == IN_FEC_GROUP) {
403 StringPiece payload = reader_->PeekRemainingPayload(); 412 StringPiece payload = reader_->PeekRemainingPayload();
404 visitor_->OnFecProtectedPayload(payload); 413 visitor_->OnFecProtectedPayload(payload);
405 } 414 }
406 if (!ProcessFrameData()) { 415 if (!ProcessFrameData()) {
407 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error. 416 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
408 DLOG(WARNING) << "Unable to process frame data."; 417 DLOG(WARNING) << "Unable to process frame data.";
409 return false; 418 return false;
410 } 419 }
411 } else { 420 } else {
412 QuicFecData fec_data; 421 QuicFecData fec_data;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 return false; 469 return false;
461 } 470 }
462 471
463 visitor_->OnPacketComplete(); 472 visitor_->OnPacketComplete();
464 reader_.reset(NULL); 473 reader_.reset(NULL);
465 return true; 474 return true;
466 } 475 }
467 476
468 bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header, 477 bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header,
469 QuicDataWriter* writer) { 478 QuicDataWriter* writer) {
470 uint8 flags = 0; 479 DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP);
480 uint8 public_flags = 0;
471 if (header.public_header.reset_flag) { 481 if (header.public_header.reset_flag) {
472 flags |= PACKET_PUBLIC_FLAGS_RST; 482 public_flags |= PACKET_PUBLIC_FLAGS_RST;
473 } 483 }
474 if (header.public_header.version_flag) { 484 if (header.public_header.version_flag) {
475 flags |= PACKET_PUBLIC_FLAGS_VERSION; 485 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
476 } 486 }
477 flags |= PACKET_PUBLIC_FLAGS_8BYTE_GUID; 487 switch (header.public_header.guid_length) {
478 if (!writer->WriteUInt8(flags)) { 488 case PACKET_0BYTE_GUID:
479 return false; 489 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_0BYTE_GUID)) {
490 return false;
491 }
492 break;
493 case PACKET_1BYTE_GUID:
494 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_1BYTE_GUID)) {
495 return false;
496 }
497 if (!writer->WriteUInt8(header.public_header.guid & k1ByteGuidMask)) {
498 return false;
499 }
500 break;
501 case PACKET_4BYTE_GUID:
502 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_4BYTE_GUID)) {
503 return false;
504 }
505 if (!writer->WriteUInt32(header.public_header.guid & k4ByteGuidMask)) {
506 return false;
507 }
508 break;
509 case PACKET_8BYTE_GUID:
510 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_8BYTE_GUID)) {
511 return false;
512 }
513 if (!writer->WriteUInt64(header.public_header.guid)) {
514 return false;
515 }
516 break;
480 } 517 }
481 518 last_serialized_guid_ = header.public_header.guid;
482 if (!writer->WriteUInt64(header.public_header.guid)) {
483 return false;
484 }
485 519
486 if (header.public_header.version_flag) { 520 if (header.public_header.version_flag) {
487 DCHECK(!is_server_); 521 DCHECK(!is_server_);
488 writer->WriteUInt32(quic_version_); 522 writer->WriteUInt32(quic_version_);
489 } 523 }
490 524
491 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) { 525 if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) {
492 return false; 526 return false;
493 } 527 }
494 528
495 flags = 0; 529 uint8 private_flags = 0;
530 if (header.entropy_flag) {
531 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
532 }
533 if (header.is_in_fec_group == IN_FEC_GROUP) {
534 private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP;
535 }
496 if (header.fec_flag) { 536 if (header.fec_flag) {
497 flags |= PACKET_PRIVATE_FLAGS_FEC; 537 private_flags |= PACKET_PRIVATE_FLAGS_FEC;
498 } 538 }
499 if (header.entropy_flag) { 539 if (!writer->WriteUInt8(private_flags)) {
500 flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
501 }
502 if (header.fec_entropy_flag) {
503 flags |= PACKET_PRIVATE_FLAGS_FEC_ENTROPY;
504 }
505 if (!writer->WriteUInt8(flags)) {
506 return false; 540 return false;
507 } 541 }
508 542
509 // Offset from the current packet sequence number to the first fec
510 // protected packet, or kNoFecOffset to signal no FEC protection.
511 uint8 first_fec_protected_packet_offset = kNoFecOffset;
512
513 // The FEC group number is the sequence number of the first fec 543 // The FEC group number is the sequence number of the first fec
514 // protected packet, or 0 if this packet is not protected. 544 // protected packet, or 0 if this packet is not protected.
515 if (header.fec_group != 0) { 545 if (header.is_in_fec_group == IN_FEC_GROUP) {
516 DCHECK_GE(header.packet_sequence_number, header.fec_group); 546 DCHECK_GE(header.packet_sequence_number, header.fec_group);
517 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group); 547 DCHECK_GT(255u, header.packet_sequence_number - header.fec_group);
518 first_fec_protected_packet_offset = 548 // Offset from the current packet sequence number to the first fec
549 // protected packet.
550 uint8 first_fec_protected_packet_offset =
519 header.packet_sequence_number - header.fec_group; 551 header.packet_sequence_number - header.fec_group;
520 } 552 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
521 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { 553 return false;
522 return false; 554 }
523 } 555 }
524 556
525 return true; 557 return true;
526 } 558 }
527 559
528 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( 560 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
529 QuicPacketSequenceNumber packet_sequence_number) const { 561 QuicPacketSequenceNumber packet_sequence_number) const {
530 // The new sequence number might have wrapped to the next epoch, or 562 // The new sequence number might have wrapped to the next epoch, or
531 // it might have reverse wrapped to the previous epoch, or it might 563 // it might have reverse wrapped to the previous epoch, or it might
532 // remain in the same epoch. Select the sequence number closest to the 564 // remain in the same epoch. Select the sequence number closest to the
(...skipping 14 matching lines...) Expand all
547 if (!reader_->ReadBytes(&public_flags, 1)) { 579 if (!reader_->ReadBytes(&public_flags, 1)) {
548 set_detailed_error("Unable to read public flags."); 580 set_detailed_error("Unable to read public flags.");
549 return false; 581 return false;
550 } 582 }
551 583
552 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) { 584 if (public_flags > PACKET_PUBLIC_FLAGS_MAX) {
553 set_detailed_error("Illegal public flags value."); 585 set_detailed_error("Illegal public flags value.");
554 return false; 586 return false;
555 } 587 }
556 588
557 if ((public_flags & PACKET_PUBLIC_FLAGS_8BYTE_GUID) !=
558 PACKET_PUBLIC_FLAGS_8BYTE_GUID) {
559 set_detailed_error("Only full length guids (8 bytes) currently supported.");
560 return false;
561 }
562
563 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; 589 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
564 public_header->version_flag = 590 public_header->version_flag =
565 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; 591 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
566 592
567 if (public_header->reset_flag && public_header->version_flag) { 593 if (public_header->reset_flag && public_header->version_flag) {
568 set_detailed_error("Got version flag in reset packet"); 594 set_detailed_error("Got version flag in reset packet");
569 return false; 595 return false;
570 } 596 }
571 597
572 if (!reader_->ReadUInt64(&public_header->guid)) { 598 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_GUID) {
573 set_detailed_error("Unable to read GUID."); 599 case PACKET_PUBLIC_FLAGS_8BYTE_GUID:
574 return false; 600 if (!reader_->ReadUInt64(&public_header->guid)) {
601 set_detailed_error("Unable to read GUID.");
602 return false;
603 }
604 public_header->guid_length = PACKET_8BYTE_GUID;
605 break;
606 case PACKET_PUBLIC_FLAGS_4BYTE_GUID:
607 // If the guid is truncated, expect to read the last serialized guid.
608 if (!reader_->ReadBytes(&public_header->guid, PACKET_4BYTE_GUID)) {
609 set_detailed_error("Unable to read GUID.");
610 return false;
611 }
612 if ((public_header->guid & k4ByteGuidMask) !=
613 (last_serialized_guid_ & k4ByteGuidMask)) {
614 set_detailed_error(
615 "Truncated 4 byte GUID does not match previous guid.");
616 return false;
617 }
618 public_header->guid_length = PACKET_4BYTE_GUID;
619 public_header->guid = last_serialized_guid_;
620 break;
621 case PACKET_PUBLIC_FLAGS_1BYTE_GUID:
622 if (!reader_->ReadBytes(&public_header->guid, PACKET_1BYTE_GUID)) {
623 set_detailed_error("Unable to read GUID.");
624 return false;
625 }
626 if ((public_header->guid & k1ByteGuidMask) !=
627 (last_serialized_guid_ & k1ByteGuidMask)) {
628 set_detailed_error(
629 "Truncated 1 byte GUID does not match previous guid.");
630 return false;
631 }
632 public_header->guid_length = PACKET_1BYTE_GUID;
633 public_header->guid = last_serialized_guid_;
634 break;
635 case PACKET_PUBLIC_FLAGS_0BYTE_GUID:
636 public_header->guid_length = PACKET_0BYTE_GUID;
637 public_header->guid = last_serialized_guid_;
638 break;
575 } 639 }
576 640
577 if (public_header->version_flag && is_server_) { 641 if (public_header->version_flag && is_server_) {
578 QuicTag version; 642 QuicTag version;
579 if (!reader_->ReadUInt32(&version)) { 643 if (!reader_->ReadUInt32(&version)) {
580 // Read the version only if the packet is from the client. 644 // Read the version only if the packet is from the client.
581 // version flag from the server means version negotiation packet. 645 // version flag from the server means version negotiation packet.
582 set_detailed_error("Unable to read protocol version."); 646 set_detailed_error("Unable to read protocol version.");
583 return false; 647 return false;
584 } 648 }
(...skipping 26 matching lines...) Expand all
611 set_detailed_error("Unable to read sequence number."); 675 set_detailed_error("Unable to read sequence number.");
612 return RaiseError(QUIC_INVALID_PACKET_HEADER); 676 return RaiseError(QUIC_INVALID_PACKET_HEADER);
613 } 677 }
614 678
615 if (header->packet_sequence_number == 0u) { 679 if (header->packet_sequence_number == 0u) {
616 set_detailed_error("Packet sequence numbers cannot be 0."); 680 set_detailed_error("Packet sequence numbers cannot be 0.");
617 return RaiseError(QUIC_INVALID_PACKET_HEADER); 681 return RaiseError(QUIC_INVALID_PACKET_HEADER);
618 } 682 }
619 683
620 if (!DecryptPayload(header->packet_sequence_number, 684 if (!DecryptPayload(header->packet_sequence_number,
685 header->public_header.guid_length,
621 header->public_header.version_flag, 686 header->public_header.version_flag,
622 packet)) { 687 packet)) {
623 set_detailed_error("Unable to decrypt payload."); 688 set_detailed_error("Unable to decrypt payload.");
624 return RaiseError(QUIC_DECRYPTION_FAILURE); 689 return RaiseError(QUIC_DECRYPTION_FAILURE);
625 } 690 }
626 691
627 uint8 private_flags; 692 uint8 private_flags;
628 if (!reader_->ReadBytes(&private_flags, 1)) { 693 if (!reader_->ReadBytes(&private_flags, 1)) {
629 set_detailed_error("Unable to read private flags."); 694 set_detailed_error("Unable to read private flags.");
630 return RaiseError(QUIC_INVALID_PACKET_HEADER); 695 return RaiseError(QUIC_INVALID_PACKET_HEADER);
631 } 696 }
632 697
633 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { 698 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) {
634 set_detailed_error("Illegal private flags value."); 699 set_detailed_error("Illegal private flags value.");
635 return RaiseError(QUIC_INVALID_PACKET_HEADER); 700 return RaiseError(QUIC_INVALID_PACKET_HEADER);
636 } 701 }
637 702
703 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0;
638 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; 704 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0;
639 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0;
640 header->fec_entropy_flag =
641 (private_flags & PACKET_PRIVATE_FLAGS_FEC_ENTROPY) != 0;
642 705
643 uint8 first_fec_protected_packet_offset; 706 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) {
644 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { 707 header->is_in_fec_group = IN_FEC_GROUP;
645 set_detailed_error("Unable to read first fec protected packet offset."); 708 uint8 first_fec_protected_packet_offset;
646 return RaiseError(QUIC_INVALID_PACKET_HEADER); 709 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) {
710 set_detailed_error("Unable to read first fec protected packet offset.");
711 return RaiseError(QUIC_INVALID_PACKET_HEADER);
712 }
713 header->fec_group =
714 header->packet_sequence_number - first_fec_protected_packet_offset;
647 } 715 }
648 header->fec_group = first_fec_protected_packet_offset == kNoFecOffset ? 0 :
649 header->packet_sequence_number - first_fec_protected_packet_offset;
650 716
651 header->entropy_hash = GetPacketEntropyHash(*header); 717 header->entropy_hash = GetPacketEntropyHash(*header);
652 // Set the last sequence number after we have decrypted the packet 718 // Set the last sequence number after we have decrypted the packet
653 // so we are confident is not attacker controlled. 719 // so we are confident is not attacker controlled.
654 last_sequence_number_ = header->packet_sequence_number; 720 last_sequence_number_ = header->packet_sequence_number;
655 return true; 721 return true;
656 } 722 }
657 723
658 bool QuicFramer::ProcessPacketSequenceNumber( 724 bool QuicFramer::ProcessPacketSequenceNumber(
659 QuicPacketSequenceNumber* sequence_number) { 725 QuicPacketSequenceNumber* sequence_number) {
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 set_detailed_error("Unable to read goaway reason."); 1121 set_detailed_error("Unable to read goaway reason.");
1056 return false; 1122 return false;
1057 } 1123 }
1058 frame->reason_phrase = reason_phrase.as_string(); 1124 frame->reason_phrase = reason_phrase.as_string();
1059 1125
1060 return true; 1126 return true;
1061 } 1127 }
1062 1128
1063 // static 1129 // static
1064 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( 1130 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
1065 const QuicEncryptedPacket& encrypted, bool includes_version) { 1131 const QuicEncryptedPacket& encrypted,
1132 QuicGuidLength guid_length,
1133 bool includes_version) {
1066 return StringPiece(encrypted.data() + kStartOfHashData, 1134 return StringPiece(encrypted.data() + kStartOfHashData,
1067 GetStartOfEncryptedData(includes_version) - 1135 GetStartOfEncryptedData(
1068 kStartOfHashData); 1136 guid_length, includes_version) - kStartOfHashData);
1069 } 1137 }
1070 1138
1071 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) { 1139 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) {
1072 DCHECK(alternative_decrypter_.get() == NULL); 1140 DCHECK(alternative_decrypter_.get() == NULL);
1073 decrypter_.reset(decrypter); 1141 decrypter_.reset(decrypter);
1074 } 1142 }
1075 1143
1076 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, 1144 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter,
1077 bool latch_once_used) { 1145 bool latch_once_used) {
1078 alternative_decrypter_.reset(decrypter); 1146 alternative_decrypter_.reset(decrypter);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 if (size < min_plaintext_size) { 1215 if (size < min_plaintext_size) {
1148 min_plaintext_size = size; 1216 min_plaintext_size = size;
1149 } 1217 }
1150 } 1218 }
1151 } 1219 }
1152 1220
1153 return min_plaintext_size; 1221 return min_plaintext_size;
1154 } 1222 }
1155 1223
1156 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number, 1224 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
1225 QuicGuidLength guid_length,
1157 bool version_flag, 1226 bool version_flag,
1158 const QuicEncryptedPacket& packet) { 1227 const QuicEncryptedPacket& packet) {
1159 StringPiece encrypted; 1228 StringPiece encrypted;
1160 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { 1229 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
1161 return false; 1230 return false;
1162 } 1231 }
1163 DCHECK(decrypter_.get() != NULL); 1232 DCHECK(decrypter_.get() != NULL);
1164 decrypted_.reset(decrypter_->DecryptPacket( 1233 decrypted_.reset(decrypter_->DecryptPacket(
1165 sequence_number, 1234 sequence_number,
1166 GetAssociatedDataFromEncryptedPacket(packet, version_flag), 1235 GetAssociatedDataFromEncryptedPacket(packet, guid_length, version_flag),
1167 encrypted)); 1236 encrypted));
1168 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { 1237 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) {
1169 decrypted_.reset(alternative_decrypter_->DecryptPacket( 1238 decrypted_.reset(alternative_decrypter_->DecryptPacket(
1170 sequence_number, 1239 sequence_number,
1171 GetAssociatedDataFromEncryptedPacket(packet, version_flag), 1240 GetAssociatedDataFromEncryptedPacket(packet, guid_length, version_flag),
1172 encrypted)); 1241 encrypted));
1173 if (decrypted_.get() != NULL) { 1242 if (decrypted_.get() != NULL) {
1174 if (alternative_decrypter_latch_) { 1243 if (alternative_decrypter_latch_) {
1175 // Switch to the alternative decrypter and latch so that we cannot 1244 // Switch to the alternative decrypter and latch so that we cannot
1176 // switch back. 1245 // switch back.
1177 decrypter_.reset(alternative_decrypter_.release()); 1246 decrypter_.reset(alternative_decrypter_.release());
1178 } else { 1247 } else {
1179 // Switch the alternative decrypter so that we use it first next time. 1248 // Switch the alternative decrypter so that we use it first next time.
1180 decrypter_.swap(alternative_decrypter_); 1249 decrypter_.swap(alternative_decrypter_);
1181 } 1250 }
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
1517 1586
1518 bool QuicFramer::RaiseError(QuicErrorCode error) { 1587 bool QuicFramer::RaiseError(QuicErrorCode error) {
1519 DLOG(INFO) << detailed_error_; 1588 DLOG(INFO) << detailed_error_;
1520 set_error(error); 1589 set_error(error);
1521 visitor_->OnError(this); 1590 visitor_->OnError(this);
1522 reader_.reset(NULL); 1591 reader_.reset(NULL);
1523 return false; 1592 return false;
1524 } 1593 }
1525 1594
1526 } // namespace net 1595 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698