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

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

Issue 1904213002: QUIC: support diversified keys with version 33. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@hkdf
Patch Set: Rebase Created 4 years, 8 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
« no previous file with comments | « net/quic/quic_protocol.h ('k') | net/quic/reliable_quic_stream_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_protocol.h" 5 #include "net/quic/quic_protocol.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "base/strings/string_number_conversions.h"
8 #include "net/quic/quic_flags.h" 9 #include "net/quic/quic_flags.h"
9 #include "net/quic/quic_utils.h" 10 #include "net/quic/quic_utils.h"
10 11
11 using base::StringPiece; 12 using base::StringPiece;
12 using std::map; 13 using std::map;
13 using std::numeric_limits; 14 using std::numeric_limits;
14 using std::ostream; 15 using std::ostream;
15 using std::string; 16 using std::string;
16 17
17 namespace net { 18 namespace net {
18 19
19 const char* const kFinalOffsetHeaderKey = ":final-offset"; 20 const char* const kFinalOffsetHeaderKey = ":final-offset";
20 21
21 size_t GetPacketHeaderSize(const QuicPacketHeader& header) { 22 size_t GetPacketHeaderSize(const QuicPacketHeader& header) {
22 return GetPacketHeaderSize(header.public_header.connection_id_length, 23 return GetPacketHeaderSize(header.public_header.connection_id_length,
23 header.public_header.version_flag, 24 header.public_header.version_flag,
24 header.public_header.multipath_flag, 25 header.public_header.multipath_flag,
26 header.public_header.nonce != nullptr,
25 header.public_header.packet_number_length); 27 header.public_header.packet_number_length);
26 } 28 }
27 29
28 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length, 30 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length,
29 bool include_version, 31 bool include_version,
30 bool include_path_id, 32 bool include_path_id,
33 bool include_diversification_nonce,
31 QuicPacketNumberLength packet_number_length) { 34 QuicPacketNumberLength packet_number_length) {
32 return kPublicFlagsSize + connection_id_length + 35 return kPublicFlagsSize + connection_id_length +
33 (include_version ? kQuicVersionSize : 0) + 36 (include_version ? kQuicVersionSize : 0) +
34 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + 37 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length +
38 (include_diversification_nonce ? kDiversificationNonceSize : 0) +
35 kPrivateFlagsSize; 39 kPrivateFlagsSize;
36 } 40 }
37 41
38 size_t GetStartOfEncryptedData(const QuicPacketHeader& header) { 42 size_t GetStartOfEncryptedData(const QuicPacketHeader& header) {
39 return GetPacketHeaderSize(header) - kPrivateFlagsSize; 43 return GetPacketHeaderSize(header) - kPrivateFlagsSize;
40 } 44 }
41 45
42 size_t GetStartOfEncryptedData(QuicConnectionIdLength connection_id_length, 46 size_t GetStartOfEncryptedData(QuicConnectionIdLength connection_id_length,
43 bool include_version, 47 bool include_version,
44 bool include_path_id, 48 bool include_path_id,
49 bool include_diversification_nonce,
45 QuicPacketNumberLength packet_number_length) { 50 QuicPacketNumberLength packet_number_length) {
46 // Encryption starts before private flags. 51 // Encryption starts before private flags.
47 return GetPacketHeaderSize(connection_id_length, include_version, 52 return GetPacketHeaderSize(connection_id_length, include_version,
48 include_path_id, packet_number_length) - 53 include_path_id, include_diversification_nonce,
54 packet_number_length) -
49 kPrivateFlagsSize; 55 kPrivateFlagsSize;
50 } 56 }
51 57
52 QuicPacketPublicHeader::QuicPacketPublicHeader() 58 QuicPacketPublicHeader::QuicPacketPublicHeader()
53 : connection_id(0), 59 : connection_id(0),
54 connection_id_length(PACKET_8BYTE_CONNECTION_ID), 60 connection_id_length(PACKET_8BYTE_CONNECTION_ID),
55 multipath_flag(false), 61 multipath_flag(false),
56 reset_flag(false), 62 reset_flag(false),
57 version_flag(false), 63 version_flag(false),
58 packet_number_length(PACKET_6BYTE_PACKET_NUMBER) {} 64 packet_number_length(PACKET_6BYTE_PACKET_NUMBER),
65 nonce(nullptr) {}
59 66
60 QuicPacketPublicHeader::QuicPacketPublicHeader( 67 QuicPacketPublicHeader::QuicPacketPublicHeader(
61 const QuicPacketPublicHeader& other) 68 const QuicPacketPublicHeader& other) = default;
62 : connection_id(other.connection_id),
63 connection_id_length(other.connection_id_length),
64 multipath_flag(other.multipath_flag),
65 reset_flag(other.reset_flag),
66 version_flag(other.version_flag),
67 packet_number_length(other.packet_number_length),
68 versions(other.versions) {}
69 69
70 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} 70 QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
71 71
72 QuicPacketHeader::QuicPacketHeader() 72 QuicPacketHeader::QuicPacketHeader()
73 : packet_number(0), 73 : packet_number(0),
74 path_id(kDefaultPathId), 74 path_id(kDefaultPathId),
75 entropy_flag(false), 75 entropy_flag(false),
76 entropy_hash(0), 76 entropy_hash(0),
77 fec_flag(false), 77 fec_flag(false),
78 is_in_fec_group(NOT_IN_FEC_GROUP), 78 is_in_fec_group(NOT_IN_FEC_GROUP),
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 case QUIC_VERSION_28: 189 case QUIC_VERSION_28:
190 return MakeQuicTag('Q', '0', '2', '8'); 190 return MakeQuicTag('Q', '0', '2', '8');
191 case QUIC_VERSION_29: 191 case QUIC_VERSION_29:
192 return MakeQuicTag('Q', '0', '2', '9'); 192 return MakeQuicTag('Q', '0', '2', '9');
193 case QUIC_VERSION_30: 193 case QUIC_VERSION_30:
194 return MakeQuicTag('Q', '0', '3', '0'); 194 return MakeQuicTag('Q', '0', '3', '0');
195 case QUIC_VERSION_31: 195 case QUIC_VERSION_31:
196 return MakeQuicTag('Q', '0', '3', '1'); 196 return MakeQuicTag('Q', '0', '3', '1');
197 case QUIC_VERSION_32: 197 case QUIC_VERSION_32:
198 return MakeQuicTag('Q', '0', '3', '2'); 198 return MakeQuicTag('Q', '0', '3', '2');
199 case QUIC_VERSION_33:
200 return MakeQuicTag('Q', '0', '3', '3');
199 default: 201 default:
200 // This shold be an ERROR because we should never attempt to convert an 202 // This shold be an ERROR because we should never attempt to convert an
201 // invalid QuicVersion to be written to the wire. 203 // invalid QuicVersion to be written to the wire.
202 LOG(ERROR) << "Unsupported QuicVersion: " << version; 204 LOG(ERROR) << "Unsupported QuicVersion: " << version;
203 return 0; 205 return 0;
204 } 206 }
205 } 207 }
206 208
207 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { 209 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
208 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { 210 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
(...skipping 14 matching lines...) Expand all
223 string QuicVersionToString(const QuicVersion version) { 225 string QuicVersionToString(const QuicVersion version) {
224 switch (version) { 226 switch (version) {
225 RETURN_STRING_LITERAL(QUIC_VERSION_25); 227 RETURN_STRING_LITERAL(QUIC_VERSION_25);
226 RETURN_STRING_LITERAL(QUIC_VERSION_26); 228 RETURN_STRING_LITERAL(QUIC_VERSION_26);
227 RETURN_STRING_LITERAL(QUIC_VERSION_27); 229 RETURN_STRING_LITERAL(QUIC_VERSION_27);
228 RETURN_STRING_LITERAL(QUIC_VERSION_28); 230 RETURN_STRING_LITERAL(QUIC_VERSION_28);
229 RETURN_STRING_LITERAL(QUIC_VERSION_29); 231 RETURN_STRING_LITERAL(QUIC_VERSION_29);
230 RETURN_STRING_LITERAL(QUIC_VERSION_30); 232 RETURN_STRING_LITERAL(QUIC_VERSION_30);
231 RETURN_STRING_LITERAL(QUIC_VERSION_31); 233 RETURN_STRING_LITERAL(QUIC_VERSION_31);
232 RETURN_STRING_LITERAL(QUIC_VERSION_32); 234 RETURN_STRING_LITERAL(QUIC_VERSION_32);
235 RETURN_STRING_LITERAL(QUIC_VERSION_33);
233 default: 236 default:
234 return "QUIC_VERSION_UNSUPPORTED"; 237 return "QUIC_VERSION_UNSUPPORTED";
235 } 238 }
236 } 239 }
237 240
238 string QuicVersionVectorToString(const QuicVersionVector& versions) { 241 string QuicVersionVectorToString(const QuicVersionVector& versions) {
239 string result = ""; 242 string result = "";
240 for (size_t i = 0; i < versions.size(); ++i) { 243 for (size_t i = 0; i < versions.size(); ++i) {
241 if (i != 0) { 244 if (i != 0) {
242 result.append(","); 245 result.append(",");
(...skipping 18 matching lines...) Expand all
261 << ", packet_number_length:" << header.public_header.packet_number_length 264 << ", packet_number_length:" << header.public_header.packet_number_length
262 << ", multipath_flag: " << header.public_header.multipath_flag 265 << ", multipath_flag: " << header.public_header.multipath_flag
263 << ", reset_flag: " << header.public_header.reset_flag 266 << ", reset_flag: " << header.public_header.reset_flag
264 << ", version_flag: " << header.public_header.version_flag; 267 << ", version_flag: " << header.public_header.version_flag;
265 if (header.public_header.version_flag) { 268 if (header.public_header.version_flag) {
266 os << " version: "; 269 os << " version: ";
267 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { 270 for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
268 os << header.public_header.versions[i] << " "; 271 os << header.public_header.versions[i] << " ";
269 } 272 }
270 } 273 }
274 os << ", diversification_nonce: "
275 << (header.public_header.nonce == nullptr
276 ? "none"
277 : "0x" + base::HexEncode(*header.public_header.nonce,
278 kDiversificationNonceSize));
271 os << ", fec_flag: " << header.fec_flag 279 os << ", fec_flag: " << header.fec_flag
272 << ", entropy_flag: " << header.entropy_flag 280 << ", entropy_flag: " << header.entropy_flag
273 << ", entropy hash: " << static_cast<int>(header.entropy_hash) 281 << ", entropy hash: " << static_cast<int>(header.entropy_hash)
274 << ", path_id: " << header.path_id 282 << ", path_id: " << header.path_id
275 << ", packet_number: " << header.packet_number 283 << ", packet_number: " << header.packet_number
276 << ", is_in_fec_group:" << header.is_in_fec_group 284 << ", is_in_fec_group:" << header.is_in_fec_group
277 << ", fec_group: " << header.fec_group << "}\n"; 285 << ", fec_group: " << header.fec_group << "}\n";
278 return os; 286 return os;
279 } 287 }
280 288
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 : stream_id(stream_id) {} 683 : stream_id(stream_id) {}
676 684
677 QuicPathCloseFrame::QuicPathCloseFrame(QuicPathId path_id) : path_id(path_id) {} 685 QuicPathCloseFrame::QuicPathCloseFrame(QuicPathId path_id) : path_id(path_id) {}
678 686
679 QuicPacket::QuicPacket(char* buffer, 687 QuicPacket::QuicPacket(char* buffer,
680 size_t length, 688 size_t length,
681 bool owns_buffer, 689 bool owns_buffer,
682 QuicConnectionIdLength connection_id_length, 690 QuicConnectionIdLength connection_id_length,
683 bool includes_version, 691 bool includes_version,
684 bool includes_path_id, 692 bool includes_path_id,
693 bool includes_diversification_nonce,
685 QuicPacketNumberLength packet_number_length) 694 QuicPacketNumberLength packet_number_length)
686 : QuicData(buffer, length, owns_buffer), 695 : QuicData(buffer, length, owns_buffer),
687 buffer_(buffer), 696 buffer_(buffer),
688 connection_id_length_(connection_id_length), 697 connection_id_length_(connection_id_length),
689 includes_version_(includes_version), 698 includes_version_(includes_version),
690 includes_path_id_(includes_path_id), 699 includes_path_id_(includes_path_id),
700 includes_diversification_nonce_(includes_diversification_nonce),
691 packet_number_length_(packet_number_length) {} 701 packet_number_length_(packet_number_length) {}
692 702
693 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length) 703 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length)
694 : QuicData(buffer, length) {} 704 : QuicData(buffer, length) {}
695 705
696 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, 706 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer,
697 size_t length, 707 size_t length,
698 bool owns_buffer) 708 bool owns_buffer)
699 : QuicData(buffer, length, owns_buffer) {} 709 : QuicData(buffer, length, owns_buffer) {}
700 710
(...skipping 25 matching lines...) Expand all
726 memcpy(buffer, this->data(), this->length()); 736 memcpy(buffer, this->data(), this->length());
727 return new QuicReceivedPacket(buffer, this->length(), receipt_time(), true); 737 return new QuicReceivedPacket(buffer, this->length(), receipt_time(), true);
728 } 738 }
729 739
730 ostream& operator<<(ostream& os, const QuicReceivedPacket& s) { 740 ostream& operator<<(ostream& os, const QuicReceivedPacket& s) {
731 os << s.length() << "-byte data"; 741 os << s.length() << "-byte data";
732 return os; 742 return os;
733 } 743 }
734 744
735 StringPiece QuicPacket::AssociatedData() const { 745 StringPiece QuicPacket::AssociatedData() const {
736 return StringPiece(data(), GetStartOfEncryptedData( 746 return StringPiece(
737 connection_id_length_, includes_version_, 747 data(), GetStartOfEncryptedData(
738 includes_path_id_, packet_number_length_)); 748 connection_id_length_, includes_version_, includes_path_id_,
749 includes_diversification_nonce_, packet_number_length_));
739 } 750 }
740 751
741 StringPiece QuicPacket::Plaintext() const { 752 StringPiece QuicPacket::Plaintext() const {
742 const size_t start_of_encrypted_data = 753 const size_t start_of_encrypted_data = GetStartOfEncryptedData(
743 GetStartOfEncryptedData(connection_id_length_, includes_version_, 754 connection_id_length_, includes_version_, includes_path_id_,
744 includes_path_id_, packet_number_length_); 755 includes_diversification_nonce_, packet_number_length_);
745 return StringPiece(data() + start_of_encrypted_data, 756 return StringPiece(data() + start_of_encrypted_data,
746 length() - start_of_encrypted_data); 757 length() - start_of_encrypted_data);
747 } 758 }
748 759
749 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, 760 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener,
750 QuicPacketLength data_length) 761 QuicPacketLength data_length)
751 : ack_listener(listener), length(data_length) { 762 : ack_listener(listener), length(data_length) {
752 DCHECK(listener != nullptr); 763 DCHECK(listener != nullptr);
753 } 764 }
754 765
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 is_unackable(false), 824 is_unackable(false),
814 has_crypto_handshake(has_crypto_handshake), 825 has_crypto_handshake(has_crypto_handshake),
815 needs_padding(needs_padding), 826 needs_padding(needs_padding),
816 retransmission(0) {} 827 retransmission(0) {}
817 828
818 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; 829 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default;
819 830
820 TransmissionInfo::~TransmissionInfo() {} 831 TransmissionInfo::~TransmissionInfo() {}
821 832
822 } // namespace net 833 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_protocol.h ('k') | net/quic/reliable_quic_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698