| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |