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" |
(...skipping 27 matching lines...) Expand all Loading... |
38 } | 38 } |
39 | 39 |
40 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, | 40 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target, |
41 QuicPacketSequenceNumber a, | 41 QuicPacketSequenceNumber a, |
42 QuicPacketSequenceNumber b) { | 42 QuicPacketSequenceNumber b) { |
43 return (Delta(target, a) < Delta(target, b)) ? a : b; | 43 return (Delta(target, a) < Delta(target, b)) ? a : b; |
44 } | 44 } |
45 | 45 |
46 } // namespace | 46 } // namespace |
47 | 47 |
48 QuicFramer::QuicFramer(QuicVersionTag version, | 48 QuicFramer::QuicFramer(QuicTag version, |
49 QuicTime creation_time, | 49 QuicTime creation_time, |
50 bool is_server) | 50 bool is_server) |
51 : visitor_(NULL), | 51 : visitor_(NULL), |
52 fec_builder_(NULL), | 52 fec_builder_(NULL), |
53 error_(QUIC_NO_ERROR), | 53 error_(QUIC_NO_ERROR), |
54 last_sequence_number_(0), | 54 last_sequence_number_(0), |
55 quic_version_(version), | 55 quic_version_(version), |
56 decrypter_(QuicDecrypter::Create(kNULL)), | 56 decrypter_(QuicDecrypter::Create(kNULL)), |
| 57 alternative_decrypter_latch_(false), |
57 is_server_(is_server), | 58 is_server_(is_server), |
58 creation_time_(creation_time) { | 59 creation_time_(creation_time) { |
59 DCHECK(IsSupportedVersion(version)); | 60 DCHECK(IsSupportedVersion(version)); |
60 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); | 61 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL)); |
61 } | 62 } |
62 | 63 |
63 QuicFramer::~QuicFramer() {} | 64 QuicFramer::~QuicFramer() {} |
64 | 65 |
65 bool CanTruncate(const QuicFrame& frame) { | 66 bool CanTruncate(const QuicFrame& frame) { |
66 if (frame.type == ACK_FRAME || | 67 if (frame.type == ACK_FRAME || |
(...skipping 27 matching lines...) Expand all Loading... |
94 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 95 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
95 GetMinAckFrameSize(); | 96 GetMinAckFrameSize(); |
96 } | 97 } |
97 | 98 |
98 // static | 99 // static |
99 size_t QuicFramer::GetMinGoAwayFrameSize() { | 100 size_t QuicFramer::GetMinGoAwayFrameSize() { |
100 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + | 101 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize + |
101 kQuicStreamIdSize; | 102 kQuicStreamIdSize; |
102 } | 103 } |
103 | 104 |
104 bool QuicFramer::IsSupportedVersion(QuicVersionTag version) { | 105 bool QuicFramer::IsSupportedVersion(QuicTag version) { |
105 return version == kQuicVersion1; | 106 return version == kQuicVersion1; |
106 } | 107 } |
107 | 108 |
108 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { | 109 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) { |
109 return kQuicGuidSize + kPublicFlagsSize + | 110 return kQuicGuidSize + kPublicFlagsSize + |
110 number_versions * kQuicVersionSize; | 111 number_versions * kQuicVersionSize; |
111 } | 112 } |
112 | 113 |
113 size_t QuicFramer::GetSerializedFrameLength( | 114 size_t QuicFramer::GetSerializedFrameLength( |
114 const QuicFrame& frame, size_t free_bytes, bool first_frame) { | 115 const QuicFrame& frame, size_t free_bytes, bool first_frame) { |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, | 282 if (!AppendPacketSequenceNumber(packet.rejected_sequence_number, |
282 &writer)) { | 283 &writer)) { |
283 return NULL; | 284 return NULL; |
284 } | 285 } |
285 | 286 |
286 return new QuicEncryptedPacket(writer.take(), len, true); | 287 return new QuicEncryptedPacket(writer.take(), len, true); |
287 } | 288 } |
288 | 289 |
289 QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket( | 290 QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket( |
290 const QuicPacketPublicHeader& header, | 291 const QuicPacketPublicHeader& header, |
291 const QuicVersionTagList& supported_versions) { | 292 const QuicTagVector& supported_versions) { |
292 DCHECK(header.version_flag); | 293 DCHECK(header.version_flag); |
293 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); | 294 size_t len = GetVersionNegotiationPacketSize(supported_versions.size()); |
294 QuicDataWriter writer(len); | 295 QuicDataWriter writer(len); |
295 | 296 |
296 if (!writer.WriteUInt64(header.guid)) { | 297 if (!writer.WriteUInt64(header.guid)) { |
297 return NULL; | 298 return NULL; |
298 } | 299 } |
299 | 300 |
300 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION); | 301 uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION); |
301 if (!writer.WriteUInt8(flags)) { | 302 if (!writer.WriteUInt8(flags)) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 | 344 |
344 reader_.reset(NULL); | 345 reader_.reset(NULL); |
345 return rv; | 346 return rv; |
346 } | 347 } |
347 | 348 |
348 bool QuicFramer::ProcessVersionNegotiationPacket( | 349 bool QuicFramer::ProcessVersionNegotiationPacket( |
349 QuicPacketPublicHeader* public_header) { | 350 QuicPacketPublicHeader* public_header) { |
350 DCHECK(!is_server_); | 351 DCHECK(!is_server_); |
351 // Try reading at least once to raise error if the packet is invalid. | 352 // Try reading at least once to raise error if the packet is invalid. |
352 do { | 353 do { |
353 QuicVersionTag version; | 354 QuicTag version; |
354 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { | 355 if (!reader_->ReadBytes(&version, kQuicVersionSize)) { |
355 set_detailed_error("Unable to read supported version in negotiation."); | 356 set_detailed_error("Unable to read supported version in negotiation."); |
356 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); | 357 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET); |
357 } | 358 } |
358 public_header->versions.push_back(version); | 359 public_header->versions.push_back(version); |
359 } while (!reader_->IsDoneReading()); | 360 } while (!reader_->IsDoneReading()); |
360 | 361 |
361 visitor_->OnVersionNegotiationPacket(*public_header); | 362 visitor_->OnVersionNegotiationPacket(*public_header); |
362 return true; | 363 return true; |
363 } | 364 } |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; | 547 public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0; |
547 public_header->version_flag = | 548 public_header->version_flag = |
548 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; | 549 (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0; |
549 | 550 |
550 if (public_header->reset_flag && public_header->version_flag) { | 551 if (public_header->reset_flag && public_header->version_flag) { |
551 set_detailed_error("Got version flag in reset packet"); | 552 set_detailed_error("Got version flag in reset packet"); |
552 return false; | 553 return false; |
553 } | 554 } |
554 | 555 |
555 if (public_header->version_flag && is_server_) { | 556 if (public_header->version_flag && is_server_) { |
556 QuicVersionTag version; | 557 QuicTag version; |
557 if (!reader_->ReadUInt32(&version)) { | 558 if (!reader_->ReadUInt32(&version)) { |
558 // Read the version only if the packet is from the client. | 559 // Read the version only if the packet is from the client. |
559 // version flag from the server means version negotiation packet. | 560 // version flag from the server means version negotiation packet. |
560 set_detailed_error("Unable to read protocol version."); | 561 set_detailed_error("Unable to read protocol version."); |
561 return false; | 562 return false; |
562 } | 563 } |
563 public_header->versions.push_back(version); | 564 public_header->versions.push_back(version); |
564 } | 565 } |
565 return true; | 566 return true; |
566 } | 567 } |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 encrypter_[level].reset(encrypter); | 1062 encrypter_[level].reset(encrypter); |
1062 } | 1063 } |
1063 | 1064 |
1064 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { | 1065 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const { |
1065 DCHECK_GE(level, 0); | 1066 DCHECK_GE(level, 0); |
1066 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); | 1067 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); |
1067 DCHECK(encrypter_[level].get() != NULL); | 1068 DCHECK(encrypter_[level].get() != NULL); |
1068 return encrypter_[level].get(); | 1069 return encrypter_[level].get(); |
1069 } | 1070 } |
1070 | 1071 |
| 1072 void QuicFramer::SwapCryptersForTest(QuicFramer* other) { |
| 1073 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { |
| 1074 encrypter_[i].swap(other->encrypter_[i]); |
| 1075 } |
| 1076 decrypter_.swap(other->decrypter_); |
| 1077 alternative_decrypter_.swap(other->alternative_decrypter_); |
| 1078 |
| 1079 const bool other_latch = other->alternative_decrypter_latch_; |
| 1080 other->alternative_decrypter_latch_ = alternative_decrypter_latch_; |
| 1081 alternative_decrypter_latch_ = other_latch; |
| 1082 } |
| 1083 |
1071 QuicEncryptedPacket* QuicFramer::EncryptPacket( | 1084 QuicEncryptedPacket* QuicFramer::EncryptPacket( |
1072 EncryptionLevel level, | 1085 EncryptionLevel level, |
1073 QuicPacketSequenceNumber packet_sequence_number, | 1086 QuicPacketSequenceNumber packet_sequence_number, |
1074 const QuicPacket& packet) { | 1087 const QuicPacket& packet) { |
1075 DCHECK(encrypter_[level].get() != NULL); | 1088 DCHECK(encrypter_[level].get() != NULL); |
1076 | 1089 |
1077 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( | 1090 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket( |
1078 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); | 1091 packet_sequence_number, packet.AssociatedData(), packet.Plaintext())); |
1079 if (out.get() == NULL) { | 1092 if (out.get() == NULL) { |
1080 RaiseError(QUIC_ENCRYPTION_FAILURE); | 1093 RaiseError(QUIC_ENCRYPTION_FAILURE); |
(...skipping 28 matching lines...) Expand all Loading... |
1109 } | 1122 } |
1110 | 1123 |
1111 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number, | 1124 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number, |
1112 bool version_flag, | 1125 bool version_flag, |
1113 const QuicEncryptedPacket& packet) { | 1126 const QuicEncryptedPacket& packet) { |
1114 StringPiece encrypted; | 1127 StringPiece encrypted; |
1115 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { | 1128 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { |
1116 return false; | 1129 return false; |
1117 } | 1130 } |
1118 DCHECK(decrypter_.get() != NULL); | 1131 DCHECK(decrypter_.get() != NULL); |
1119 LOG(INFO) << "Decrypting packet"; | |
1120 decrypted_.reset(decrypter_->DecryptPacket( | 1132 decrypted_.reset(decrypter_->DecryptPacket( |
1121 sequence_number, | 1133 sequence_number, |
1122 GetAssociatedDataFromEncryptedPacket(packet, version_flag), | 1134 GetAssociatedDataFromEncryptedPacket(packet, version_flag), |
1123 encrypted)); | 1135 encrypted)); |
1124 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { | 1136 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) { |
1125 LOG(INFO) << "Trying alternative"; | |
1126 decrypted_.reset(alternative_decrypter_->DecryptPacket( | 1137 decrypted_.reset(alternative_decrypter_->DecryptPacket( |
1127 sequence_number, | 1138 sequence_number, |
1128 GetAssociatedDataFromEncryptedPacket(packet, version_flag), | 1139 GetAssociatedDataFromEncryptedPacket(packet, version_flag), |
1129 encrypted)); | 1140 encrypted)); |
1130 if (decrypted_.get() != NULL) { | 1141 if (decrypted_.get() != NULL) { |
1131 LOG(INFO) << "alternative ok"; | |
1132 if (alternative_decrypter_latch_) { | 1142 if (alternative_decrypter_latch_) { |
1133 LOG(INFO) << " latching"; | |
1134 // Switch to the alternative decrypter and latch so that we cannot | 1143 // Switch to the alternative decrypter and latch so that we cannot |
1135 // switch back. | 1144 // switch back. |
1136 decrypter_.reset(alternative_decrypter_.release()); | 1145 decrypter_.reset(alternative_decrypter_.release()); |
1137 } else { | 1146 } else { |
1138 LOG(INFO) << " swapping"; | |
1139 // Switch the alternative decrypter so that we use it first next time. | 1147 // Switch the alternative decrypter so that we use it first next time. |
1140 decrypter_.swap(alternative_decrypter_); | 1148 decrypter_.swap(alternative_decrypter_); |
1141 } | 1149 } |
1142 } | 1150 } |
1143 } | 1151 } |
1144 | 1152 |
1145 if (decrypted_.get() == NULL) { | 1153 if (decrypted_.get() == NULL) { |
1146 return false; | 1154 return false; |
1147 } | 1155 } |
1148 | 1156 |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 | 1485 |
1478 bool QuicFramer::RaiseError(QuicErrorCode error) { | 1486 bool QuicFramer::RaiseError(QuicErrorCode error) { |
1479 DLOG(INFO) << detailed_error_; | 1487 DLOG(INFO) << detailed_error_; |
1480 set_error(error); | 1488 set_error(error); |
1481 visitor_->OnError(this); | 1489 visitor_->OnError(this); |
1482 reader_.reset(NULL); | 1490 reader_.reset(NULL); |
1483 return false; | 1491 return false; |
1484 } | 1492 } |
1485 | 1493 |
1486 } // namespace net | 1494 } // namespace net |
OLD | NEW |