| 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/containers/hash_tables.h" | 7 #include "base/containers/hash_tables.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/quic/crypto/crypto_framer.h" | 9 #include "net/quic/crypto/crypto_framer.h" |
| 10 #include "net/quic/crypto/crypto_handshake_message.h" | 10 #include "net/quic/crypto/crypto_handshake_message.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 // Mask to select the lowest 48 bits of a sequence number. | 31 // Mask to select the lowest 48 bits of a sequence number. |
| 32 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = | 32 const QuicPacketSequenceNumber k6ByteSequenceNumberMask = |
| 33 GG_UINT64_C(0x0000FFFFFFFFFFFF); | 33 GG_UINT64_C(0x0000FFFFFFFFFFFF); |
| 34 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = | 34 const QuicPacketSequenceNumber k4ByteSequenceNumberMask = |
| 35 GG_UINT64_C(0x00000000FFFFFFFF); | 35 GG_UINT64_C(0x00000000FFFFFFFF); |
| 36 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = | 36 const QuicPacketSequenceNumber k2ByteSequenceNumberMask = |
| 37 GG_UINT64_C(0x000000000000FFFF); | 37 GG_UINT64_C(0x000000000000FFFF); |
| 38 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = | 38 const QuicPacketSequenceNumber k1ByteSequenceNumberMask = |
| 39 GG_UINT64_C(0x00000000000000FF); | 39 GG_UINT64_C(0x00000000000000FF); |
| 40 | 40 |
| 41 const QuicGuid k1ByteGuidMask = GG_UINT64_C(0x00000000000000FF); | 41 const QuicConnectionId k1ByteConnectionIdMask = GG_UINT64_C(0x00000000000000FF); |
| 42 const QuicGuid k4ByteGuidMask = GG_UINT64_C(0x00000000FFFFFFFF); | 42 const QuicConnectionId k4ByteConnectionIdMask = GG_UINT64_C(0x00000000FFFFFFFF); |
| 43 | 43 |
| 44 // Number of bits the sequence number length bits are shifted from the right | 44 // Number of bits the sequence number length bits are shifted from the right |
| 45 // edge of the public header. | 45 // edge of the public header. |
| 46 const uint8 kPublicHeaderSequenceNumberShift = 4; | 46 const uint8 kPublicHeaderSequenceNumberShift = 4; |
| 47 | 47 |
| 48 // New Frame Types, QUIC v. >= 10: | 48 // New Frame Types, QUIC v. >= 10: |
| 49 // There are two interpretations for the Frame Type byte in the QUIC protocol, | 49 // There are two interpretations for the Frame Type byte in the QUIC protocol, |
| 50 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. | 50 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. |
| 51 // | 51 // |
| 52 // Regular Frame Types use the Frame Type byte simply. Currently defined | 52 // Regular Frame Types use the Frame Type byte simply. Currently defined |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 } | 156 } |
| 157 | 157 |
| 158 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 158 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
| 159 QuicTime creation_time, | 159 QuicTime creation_time, |
| 160 bool is_server) | 160 bool is_server) |
| 161 : visitor_(NULL), | 161 : visitor_(NULL), |
| 162 fec_builder_(NULL), | 162 fec_builder_(NULL), |
| 163 entropy_calculator_(NULL), | 163 entropy_calculator_(NULL), |
| 164 error_(QUIC_NO_ERROR), | 164 error_(QUIC_NO_ERROR), |
| 165 last_sequence_number_(0), | 165 last_sequence_number_(0), |
| 166 last_serialized_guid_(0), | 166 last_serialized_connection_id_(0), |
| 167 supported_versions_(supported_versions), | 167 supported_versions_(supported_versions), |
| 168 alternative_decrypter_latch_(false), | 168 alternative_decrypter_latch_(false), |
| 169 is_server_(is_server), | 169 is_server_(is_server), |
| 170 creation_time_(creation_time) { | 170 creation_time_(creation_time) { |
| 171 DCHECK(!supported_versions.empty()); | 171 DCHECK(!supported_versions.empty()); |
| 172 quic_version_ = supported_versions_[0]; | 172 quic_version_ = supported_versions_[0]; |
| 173 decrypter_.reset(QuicDecrypter::Create(kNULL)); | 173 decrypter_.reset(QuicDecrypter::Create(kNULL)); |
| 174 encrypter_[ENCRYPTION_NONE].reset( | 174 encrypter_[ENCRYPTION_NONE].reset( |
| 175 QuicEncrypter::Create(kNULL)); | 175 QuicEncrypter::Create(kNULL)); |
| 176 } | 176 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 if (offset == 0) { | 263 if (offset == 0) { |
| 264 return i; | 264 return i; |
| 265 } | 265 } |
| 266 } | 266 } |
| 267 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; | 267 LOG(DFATAL) << "Failed to determine StreamOffsetSize."; |
| 268 return 8; | 268 return 8; |
| 269 } | 269 } |
| 270 | 270 |
| 271 // static | 271 // static |
| 272 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | 272 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
| 273 return kPublicFlagsSize + PACKET_8BYTE_GUID + | 273 return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + |
| 274 number_versions * kQuicVersionSize; | 274 number_versions * kQuicVersionSize; |
| 275 } | 275 } |
| 276 | 276 |
| 277 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { | 277 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const { |
| 278 for (size_t i = 0; i < supported_versions_.size(); ++i) { | 278 for (size_t i = 0; i < supported_versions_.size(); ++i) { |
| 279 if (version == supported_versions_[i]) { | 279 if (version == supported_versions_[i]) { |
| 280 return true; | 280 return true; |
| 281 } | 281 } |
| 282 } | 282 } |
| 283 return false; | 283 return false; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 return kNoPacket; | 448 return kNoPacket; |
| 449 } | 449 } |
| 450 } | 450 } |
| 451 | 451 |
| 452 // Save the length before writing, because take clears it. | 452 // Save the length before writing, because take clears it. |
| 453 const size_t len = writer.length(); | 453 const size_t len = writer.length(); |
| 454 // Less than or equal because truncated acks end up with max_plaintex_size | 454 // Less than or equal because truncated acks end up with max_plaintex_size |
| 455 // length, even though they're typically slightly shorter. | 455 // length, even though they're typically slightly shorter. |
| 456 DCHECK_LE(len, packet_size); | 456 DCHECK_LE(len, packet_size); |
| 457 QuicPacket* packet = QuicPacket::NewDataPacket( | 457 QuicPacket* packet = QuicPacket::NewDataPacket( |
| 458 writer.take(), len, true, header.public_header.guid_length, | 458 writer.take(), len, true, header.public_header.connection_id_length, |
| 459 header.public_header.version_flag, | 459 header.public_header.version_flag, |
| 460 header.public_header.sequence_number_length); | 460 header.public_header.sequence_number_length); |
| 461 | 461 |
| 462 if (fec_builder_) { | 462 if (fec_builder_) { |
| 463 fec_builder_->OnBuiltFecProtectedPayload(header, | 463 fec_builder_->OnBuiltFecProtectedPayload(header, |
| 464 packet->FecProtectedData()); | 464 packet->FecProtectedData()); |
| 465 } | 465 } |
| 466 | 466 |
| 467 return SerializedPacket(header.packet_sequence_number, | 467 return SerializedPacket(header.packet_sequence_number, |
| 468 header.public_header.sequence_number_length, packet, | 468 header.public_header.sequence_number_length, packet, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 486 | 486 |
| 487 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { | 487 if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) { |
| 488 LOG(DFATAL) << "Failed to add FEC"; | 488 LOG(DFATAL) << "Failed to add FEC"; |
| 489 return kNoPacket; | 489 return kNoPacket; |
| 490 } | 490 } |
| 491 | 491 |
| 492 return SerializedPacket( | 492 return SerializedPacket( |
| 493 header.packet_sequence_number, | 493 header.packet_sequence_number, |
| 494 header.public_header.sequence_number_length, | 494 header.public_header.sequence_number_length, |
| 495 QuicPacket::NewFecPacket(writer.take(), len, true, | 495 QuicPacket::NewFecPacket(writer.take(), len, true, |
| 496 header.public_header.guid_length, | 496 header.public_header.connection_id_length, |
| 497 header.public_header.version_flag, | 497 header.public_header.version_flag, |
| 498 header.public_header.sequence_number_length), | 498 header.public_header.sequence_number_length), |
| 499 GetPacketEntropyHash(header), NULL); | 499 GetPacketEntropyHash(header), NULL); |
| 500 } | 500 } |
| 501 | 501 |
| 502 // static | 502 // static |
| 503 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( | 503 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket( |
| 504 const QuicPublicResetPacket& packet) { | 504 const QuicPublicResetPacket& packet) { |
| 505 DCHECK(packet.public_header.reset_flag); | 505 DCHECK(packet.public_header.reset_flag); |
| 506 | 506 |
| 507 CryptoHandshakeMessage reset; | 507 CryptoHandshakeMessage reset; |
| 508 reset.set_tag(kPRST); | 508 reset.set_tag(kPRST); |
| 509 reset.SetValue(kRNON, packet.nonce_proof); | 509 reset.SetValue(kRNON, packet.nonce_proof); |
| 510 reset.SetValue(kRSEQ, packet.rejected_sequence_number); | 510 reset.SetValue(kRSEQ, packet.rejected_sequence_number); |
| 511 if (!packet.client_address.address().empty()) { | 511 if (!packet.client_address.address().empty()) { |
| 512 // packet.client_address is non-empty. | 512 // packet.client_address is non-empty. |
| 513 QuicSocketAddressCoder address_coder(packet.client_address); | 513 QuicSocketAddressCoder address_coder(packet.client_address); |
| 514 string serialized_address = address_coder.Encode(); | 514 string serialized_address = address_coder.Encode(); |
| 515 if (serialized_address.empty()) { | 515 if (serialized_address.empty()) { |
| 516 return NULL; | 516 return NULL; |
| 517 } | 517 } |
| 518 reset.SetStringPiece(kCADR, serialized_address); | 518 reset.SetStringPiece(kCADR, serialized_address); |
| 519 } | 519 } |
| 520 const QuicData& reset_serialized = reset.GetSerialized(); | 520 const QuicData& reset_serialized = reset.GetSerialized(); |
| 521 | 521 |
| 522 size_t len = kPublicFlagsSize + PACKET_8BYTE_GUID + reset_serialized.length(); | 522 size_t len = |
| 523 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
| 523 QuicDataWriter writer(len); | 524 QuicDataWriter writer(len); |
| 524 | 525 |
| 525 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | | 526 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST | |
| 526 PACKET_PUBLIC_FLAGS_8BYTE_GUID); | 527 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 527 if (!writer.WriteUInt8(flags)) { | 528 if (!writer.WriteUInt8(flags)) { |
| 528 return NULL; | 529 return NULL; |
| 529 } | 530 } |
| 530 | 531 |
| 531 if (!writer.WriteUInt64(packet.public_header.guid)) { | 532 if (!writer.WriteUInt64(packet.public_header.connection_id)) { |
| 532 return NULL; | 533 return NULL; |
| 533 } | 534 } |
| 534 | 535 |
| 535 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 536 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
| 536 return NULL; | 537 return NULL; |
| 537 } | 538 } |
| 538 | 539 |
| 539 return new QuicEncryptedPacket(writer.take(), len, true); | 540 return new QuicEncryptedPacket(writer.take(), len, true); |
| 540 } | 541 } |
| 541 | 542 |
| 542 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( | 543 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket( |
| 543 const QuicPacketPublicHeader& header, | 544 const QuicPacketPublicHeader& header, |
| 544 const QuicVersionVector& supported_versions) { | 545 const QuicVersionVector& supported_versions) { |
| 545 DCHECK(header.version_flag); | 546 DCHECK(header.version_flag); |
| 546 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); | 547 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); |
| 547 QuicDataWriter writer(len); | 548 QuicDataWriter writer(len); |
| 548 | 549 |
| 549 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | | 550 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION | |
| 550 PACKET_PUBLIC_FLAGS_8BYTE_GUID); | 551 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 551 if (!writer.WriteUInt8(flags)) { | 552 if (!writer.WriteUInt8(flags)) { |
| 552 return NULL; | 553 return NULL; |
| 553 } | 554 } |
| 554 | 555 |
| 555 if (!writer.WriteUInt64(header.guid)) { | 556 if (!writer.WriteUInt64(header.connection_id)) { |
| 556 return NULL; | 557 return NULL; |
| 557 } | 558 } |
| 558 | 559 |
| 559 for (size_t i = 0; i < supported_versions.size(); ++i) { | 560 for (size_t i = 0; i < supported_versions.size(); ++i) { |
| 560 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { | 561 if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) { |
| 561 return NULL; | 562 return NULL; |
| 562 } | 563 } |
| 563 } | 564 } |
| 564 | 565 |
| 565 return new QuicEncryptedPacket(writer.take(), len, true); | 566 return new QuicEncryptedPacket(writer.take(), len, true); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 761 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| 761 } | 762 } |
| 762 if (header.public_header.version_flag) { | 763 if (header.public_header.version_flag) { |
| 763 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 764 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 764 } | 765 } |
| 765 | 766 |
| 766 public_flags |= | 767 public_flags |= |
| 767 GetSequenceNumberFlags(header.public_header.sequence_number_length) | 768 GetSequenceNumberFlags(header.public_header.sequence_number_length) |
| 768 << kPublicHeaderSequenceNumberShift; | 769 << kPublicHeaderSequenceNumberShift; |
| 769 | 770 |
| 770 switch (header.public_header.guid_length) { | 771 switch (header.public_header.connection_id_length) { |
| 771 case PACKET_0BYTE_GUID: | 772 case PACKET_0BYTE_CONNECTION_ID: |
| 772 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_0BYTE_GUID)) { | 773 if (!writer->WriteUInt8( |
| 774 public_flags | PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { |
| 773 return false; | 775 return false; |
| 774 } | 776 } |
| 775 break; | 777 break; |
| 776 case PACKET_1BYTE_GUID: | 778 case PACKET_1BYTE_CONNECTION_ID: |
| 777 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_1BYTE_GUID)) { | 779 if (!writer->WriteUInt8( |
| 780 public_flags | PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) { |
| 778 return false; | 781 return false; |
| 779 } | 782 } |
| 780 if (!writer->WriteUInt8(header.public_header.guid & k1ByteGuidMask)) { | 783 if (!writer->WriteUInt8( |
| 784 header.public_header.connection_id & k1ByteConnectionIdMask)) { |
| 781 return false; | 785 return false; |
| 782 } | 786 } |
| 783 break; | 787 break; |
| 784 case PACKET_4BYTE_GUID: | 788 case PACKET_4BYTE_CONNECTION_ID: |
| 785 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_4BYTE_GUID)) { | 789 if (!writer->WriteUInt8( |
| 790 public_flags | PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) { |
| 786 return false; | 791 return false; |
| 787 } | 792 } |
| 788 if (!writer->WriteUInt32(header.public_header.guid & k4ByteGuidMask)) { | 793 if (!writer->WriteUInt32( |
| 794 header.public_header.connection_id & k4ByteConnectionIdMask)) { |
| 789 return false; | 795 return false; |
| 790 } | 796 } |
| 791 break; | 797 break; |
| 792 case PACKET_8BYTE_GUID: | 798 case PACKET_8BYTE_CONNECTION_ID: |
| 793 if (!writer->WriteUInt8(public_flags | PACKET_PUBLIC_FLAGS_8BYTE_GUID)) { | 799 if (!writer->WriteUInt8( |
| 800 public_flags | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) { |
| 794 return false; | 801 return false; |
| 795 } | 802 } |
| 796 if (!writer->WriteUInt64(header.public_header.guid)) { | 803 if (!writer->WriteUInt64(header.public_header.connection_id)) { |
| 797 return false; | 804 return false; |
| 798 } | 805 } |
| 799 break; | 806 break; |
| 800 } | 807 } |
| 801 last_serialized_guid_ = header.public_header.guid; | 808 last_serialized_connection_id_ = header.public_header.connection_id; |
| 802 | 809 |
| 803 if (header.public_header.version_flag) { | 810 if (header.public_header.version_flag) { |
| 804 DCHECK(!is_server_); | 811 DCHECK(!is_server_); |
| 805 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); | 812 writer->WriteUInt32(QuicVersionToQuicTag(quic_version_)); |
| 806 } | 813 } |
| 807 | 814 |
| 808 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, | 815 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, |
| 809 header.packet_sequence_number, writer)) { | 816 header.packet_sequence_number, writer)) { |
| 810 return false; | 817 return false; |
| 811 } | 818 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 888 if (!public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
| 882 set_detailed_error("Illegal public flags value."); | 889 set_detailed_error("Illegal public flags value."); |
| 883 return false; | 890 return false; |
| 884 } | 891 } |
| 885 | 892 |
| 886 if (public_header->reset_flag && public_header->version_flag) { | 893 if (public_header->reset_flag && public_header->version_flag) { |
| 887 set_detailed_error("Got version flag in reset packet"); | 894 set_detailed_error("Got version flag in reset packet"); |
| 888 return false; | 895 return false; |
| 889 } | 896 } |
| 890 | 897 |
| 891 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_GUID) { | 898 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) { |
| 892 case PACKET_PUBLIC_FLAGS_8BYTE_GUID: | 899 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID: |
| 893 if (!reader_->ReadUInt64(&public_header->guid)) { | 900 if (!reader_->ReadUInt64(&public_header->connection_id)) { |
| 894 set_detailed_error("Unable to read GUID."); | 901 set_detailed_error("Unable to read ConnectionId."); |
| 895 return false; | 902 return false; |
| 896 } | 903 } |
| 897 public_header->guid_length = PACKET_8BYTE_GUID; | 904 public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID; |
| 898 break; | 905 break; |
| 899 case PACKET_PUBLIC_FLAGS_4BYTE_GUID: | 906 case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID: |
| 900 // If the guid is truncated, expect to read the last serialized guid. | 907 // If the connection_id is truncated, expect to read the last serialized |
| 901 if (!reader_->ReadBytes(&public_header->guid, PACKET_4BYTE_GUID)) { | 908 // connection_id. |
| 902 set_detailed_error("Unable to read GUID."); | 909 if (!reader_->ReadBytes(&public_header->connection_id, |
| 910 PACKET_4BYTE_CONNECTION_ID)) { |
| 911 set_detailed_error("Unable to read ConnectionId."); |
| 903 return false; | 912 return false; |
| 904 } | 913 } |
| 905 if ((public_header->guid & k4ByteGuidMask) != | 914 if ((public_header->connection_id & k4ByteConnectionIdMask) != |
| 906 (last_serialized_guid_ & k4ByteGuidMask)) { | 915 (last_serialized_connection_id_ & k4ByteConnectionIdMask)) { |
| 907 set_detailed_error( | 916 set_detailed_error("Truncated 4 byte ConnectionId does not match " |
| 908 "Truncated 4 byte GUID does not match previous guid."); | 917 "previous connection_id."); |
| 909 return false; | 918 return false; |
| 910 } | 919 } |
| 911 public_header->guid_length = PACKET_4BYTE_GUID; | 920 public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID; |
| 912 public_header->guid = last_serialized_guid_; | 921 public_header->connection_id = last_serialized_connection_id_; |
| 913 break; | 922 break; |
| 914 case PACKET_PUBLIC_FLAGS_1BYTE_GUID: | 923 case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID: |
| 915 if (!reader_->ReadBytes(&public_header->guid, PACKET_1BYTE_GUID)) { | 924 if (!reader_->ReadBytes(&public_header->connection_id, |
| 916 set_detailed_error("Unable to read GUID."); | 925 PACKET_1BYTE_CONNECTION_ID)) { |
| 926 set_detailed_error("Unable to read ConnectionId."); |
| 917 return false; | 927 return false; |
| 918 } | 928 } |
| 919 if ((public_header->guid & k1ByteGuidMask) != | 929 if ((public_header->connection_id & k1ByteConnectionIdMask) != |
| 920 (last_serialized_guid_ & k1ByteGuidMask)) { | 930 (last_serialized_connection_id_ & k1ByteConnectionIdMask)) { |
| 921 set_detailed_error( | 931 set_detailed_error("Truncated 1 byte ConnectionId does not match " |
| 922 "Truncated 1 byte GUID does not match previous guid."); | 932 "previous connection_id."); |
| 923 return false; | 933 return false; |
| 924 } | 934 } |
| 925 public_header->guid_length = PACKET_1BYTE_GUID; | 935 public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID; |
| 926 public_header->guid = last_serialized_guid_; | 936 public_header->connection_id = last_serialized_connection_id_; |
| 927 break; | 937 break; |
| 928 case PACKET_PUBLIC_FLAGS_0BYTE_GUID: | 938 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID: |
| 929 public_header->guid_length = PACKET_0BYTE_GUID; | 939 public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID; |
| 930 public_header->guid = last_serialized_guid_; | 940 public_header->connection_id = last_serialized_connection_id_; |
| 931 break; | 941 break; |
| 932 } | 942 } |
| 933 | 943 |
| 934 public_header->sequence_number_length = | 944 public_header->sequence_number_length = |
| 935 ReadSequenceNumberLength( | 945 ReadSequenceNumberLength( |
| 936 public_flags >> kPublicHeaderSequenceNumberShift); | 946 public_flags >> kPublicHeaderSequenceNumberShift); |
| 937 | 947 |
| 938 // Read the version only if the packet is from the client. | 948 // Read the version only if the packet is from the client. |
| 939 // version flag from the server means version negotiation packet. | 949 // version flag from the server means version negotiation packet. |
| 940 if (public_header->version_flag && is_server_) { | 950 if (public_header->version_flag && is_server_) { |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1681 set_detailed_error("Unable to read stream_id."); | 1691 set_detailed_error("Unable to read stream_id."); |
| 1682 return false; | 1692 return false; |
| 1683 } | 1693 } |
| 1684 | 1694 |
| 1685 return true; | 1695 return true; |
| 1686 } | 1696 } |
| 1687 | 1697 |
| 1688 // static | 1698 // static |
| 1689 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( | 1699 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 1690 const QuicEncryptedPacket& encrypted, | 1700 const QuicEncryptedPacket& encrypted, |
| 1691 QuicGuidLength guid_length, | 1701 QuicConnectionIdLength connection_id_length, |
| 1692 bool includes_version, | 1702 bool includes_version, |
| 1693 QuicSequenceNumberLength sequence_number_length) { | 1703 QuicSequenceNumberLength sequence_number_length) { |
| 1694 return StringPiece(encrypted.data() + kStartOfHashData, | 1704 return StringPiece( |
| 1695 GetStartOfEncryptedData( | 1705 encrypted.data() + kStartOfHashData, GetStartOfEncryptedData( |
| 1696 guid_length, includes_version, sequence_number_length) | 1706 connection_id_length, includes_version, sequence_number_length) |
| 1697 - kStartOfHashData); | 1707 - kStartOfHashData); |
| 1698 } | 1708 } |
| 1699 | 1709 |
| 1700 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) { | 1710 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) { |
| 1701 DCHECK(alternative_decrypter_.get() == NULL); | 1711 DCHECK(alternative_decrypter_.get() == NULL); |
| 1702 decrypter_.reset(decrypter); | 1712 decrypter_.reset(decrypter); |
| 1703 } | 1713 } |
| 1704 | 1714 |
| 1705 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, | 1715 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter, |
| 1706 bool latch_once_used) { | 1716 bool latch_once_used) { |
| 1707 alternative_decrypter_.reset(decrypter); | 1717 alternative_decrypter_.reset(decrypter); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1784 const QuicEncryptedPacket& packet) { | 1794 const QuicEncryptedPacket& packet) { |
| 1785 StringPiece encrypted; | 1795 StringPiece encrypted; |
| 1786 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { | 1796 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { |
| 1787 return false; | 1797 return false; |
| 1788 } | 1798 } |
| 1789 DCHECK(decrypter_.get() != NULL); | 1799 DCHECK(decrypter_.get() != NULL); |
| 1790 decrypted_.reset(decrypter_->DecryptPacket( | 1800 decrypted_.reset(decrypter_->DecryptPacket( |
| 1791 header.packet_sequence_number, | 1801 header.packet_sequence_number, |
| 1792 GetAssociatedDataFromEncryptedPacket( | 1802 GetAssociatedDataFromEncryptedPacket( |
| 1793 packet, | 1803 packet, |
| 1794 header.public_header.guid_length, | 1804 header.public_header.connection_id_length, |
| 1795 header.public_header.version_flag, | 1805 header.public_header.version_flag, |
| 1796 header.public_header.sequence_number_length), | 1806 header.public_header.sequence_number_length), |
| 1797 encrypted)); | 1807 encrypted)); |
| 1798 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { | 1808 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { |
| 1799 decrypted_.reset(alternative_decrypter_->DecryptPacket( | 1809 decrypted_.reset(alternative_decrypter_->DecryptPacket( |
| 1800 header.packet_sequence_number, | 1810 header.packet_sequence_number, |
| 1801 GetAssociatedDataFromEncryptedPacket( | 1811 GetAssociatedDataFromEncryptedPacket( |
| 1802 packet, | 1812 packet, |
| 1803 header.public_header.guid_length, | 1813 header.public_header.connection_id_length, |
| 1804 header.public_header.version_flag, | 1814 header.public_header.version_flag, |
| 1805 header.public_header.sequence_number_length), | 1815 header.public_header.sequence_number_length), |
| 1806 encrypted)); | 1816 encrypted)); |
| 1807 if (decrypted_.get() != NULL) { | 1817 if (decrypted_.get() != NULL) { |
| 1808 if (alternative_decrypter_latch_) { | 1818 if (alternative_decrypter_latch_) { |
| 1809 // Switch to the alternative decrypter and latch so that we cannot | 1819 // Switch to the alternative decrypter and latch so that we cannot |
| 1810 // switch back. | 1820 // switch back. |
| 1811 decrypter_.reset(alternative_decrypter_.release()); | 1821 decrypter_.reset(alternative_decrypter_.release()); |
| 1812 } else { | 1822 } else { |
| 1813 // Switch the alternative decrypter so that we use it first next time. | 1823 // Switch the alternative decrypter so that we use it first next time. |
| (...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2386 | 2396 |
| 2387 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2397 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2388 DVLOG(1) << "Error detail: " << detailed_error_; | 2398 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2389 set_error(error); | 2399 set_error(error); |
| 2390 visitor_->OnError(this); | 2400 visitor_->OnError(this); |
| 2391 reader_.reset(NULL); | 2401 reader_.reset(NULL); |
| 2392 return false; | 2402 return false; |
| 2393 } | 2403 } |
| 2394 | 2404 |
| 2395 } // namespace net | 2405 } // namespace net |
| OLD | NEW |