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

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

Issue 14083012: QUIC: retransmit packets with the correct encryption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Moved HandshakeMode enum to MockCryptoClientStream Created 7 years, 7 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"
(...skipping 28 matching lines...) Expand all
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(QuicVersionTag version,
49 QuicDecrypter* decrypter,
50 QuicEncrypter* encrypter,
51 QuicTime creation_time, 49 QuicTime creation_time,
52 bool is_server) 50 bool is_server)
53 : visitor_(NULL), 51 : visitor_(NULL),
54 fec_builder_(NULL), 52 fec_builder_(NULL),
55 error_(QUIC_NO_ERROR), 53 error_(QUIC_NO_ERROR),
56 last_sequence_number_(0), 54 last_sequence_number_(0),
57 quic_version_(version), 55 quic_version_(version),
58 decrypter_(decrypter), 56 decrypter_(QuicDecrypter::Create(kNULL)),
59 encrypter_(encrypter),
60 is_server_(is_server), 57 is_server_(is_server),
61 creation_time_(creation_time) { 58 creation_time_(creation_time) {
62 DCHECK(IsSupportedVersion(version)); 59 DCHECK(IsSupportedVersion(version));
60 encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL));
63 } 61 }
64 62
65 QuicFramer::~QuicFramer() {} 63 QuicFramer::~QuicFramer() {}
66 64
67 bool CanTruncate(const QuicFrame& frame) { 65 bool CanTruncate(const QuicFrame& frame) {
68 if (frame.type == ACK_FRAME || 66 if (frame.type == ACK_FRAME ||
69 frame.type == CONNECTION_CLOSE_FRAME) { 67 frame.type == CONNECTION_CLOSE_FRAME) {
70 return true; 68 return true;
71 } 69 }
72 return false; 70 return false;
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 } 1028 }
1031 1029
1032 // static 1030 // static
1033 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket( 1031 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
1034 const QuicEncryptedPacket& encrypted, bool includes_version) { 1032 const QuicEncryptedPacket& encrypted, bool includes_version) {
1035 return StringPiece(encrypted.data() + kStartOfHashData, 1033 return StringPiece(encrypted.data() + kStartOfHashData,
1036 GetStartOfEncryptedData(includes_version) - 1034 GetStartOfEncryptedData(includes_version) -
1037 kStartOfHashData); 1035 kStartOfHashData);
1038 } 1036 }
1039 1037
1040 void QuicFramer::push_decrypter(QuicDecrypter* decrypter) { 1038 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) {
1041 DCHECK(backup_decrypter_.get() == NULL); 1039 DCHECK(alternative_decrypter_.get() == NULL);
1042 backup_decrypter_.reset(decrypter_.release());
1043 decrypter_.reset(decrypter); 1040 decrypter_.reset(decrypter);
1044 } 1041 }
1045 1042
1046 void QuicFramer::pop_decrypter() { 1043 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter,
1047 DCHECK(backup_decrypter_.get() != NULL); 1044 bool latch_once_used) {
1048 decrypter_.reset(backup_decrypter_.release()); 1045 alternative_decrypter_.reset(decrypter);
1046 alternative_decrypter_latch_ = latch_once_used;
1049 } 1047 }
1050 1048
1051 void QuicFramer::set_encrypter(QuicEncrypter* encrypter) { 1049 const QuicDecrypter* QuicFramer::decrypter() const {
1052 encrypter_.reset(encrypter); 1050 return decrypter_.get();
1051 }
1052
1053 const QuicDecrypter* QuicFramer::alternative_decrypter() const {
1054 return alternative_decrypter_.get();
1055 }
1056
1057 void QuicFramer::SetEncrypter(EncryptionLevel level,
1058 QuicEncrypter* encrypter) {
1059 DCHECK_GE(level, 0);
1060 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1061 encrypter_[level].reset(encrypter);
1062 }
1063
1064 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const {
1065 DCHECK_GE(level, 0);
1066 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1067 DCHECK(encrypter_[level].get() != NULL);
1068 return encrypter_[level].get();
1053 } 1069 }
1054 1070
1055 QuicEncryptedPacket* QuicFramer::EncryptPacket( 1071 QuicEncryptedPacket* QuicFramer::EncryptPacket(
1072 EncryptionLevel level,
1056 QuicPacketSequenceNumber packet_sequence_number, 1073 QuicPacketSequenceNumber packet_sequence_number,
1057 const QuicPacket& packet) { 1074 const QuicPacket& packet) {
1058 scoped_ptr<QuicData> out(encrypter_->EncryptPacket(packet_sequence_number, 1075 DCHECK(encrypter_[level].get() != NULL);
1059 packet.AssociatedData(), 1076
1060 packet.Plaintext())); 1077 scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket(
1078 packet_sequence_number, packet.AssociatedData(), packet.Plaintext()));
1061 if (out.get() == NULL) { 1079 if (out.get() == NULL) {
1062 RaiseError(QUIC_ENCRYPTION_FAILURE); 1080 RaiseError(QUIC_ENCRYPTION_FAILURE);
1063 return NULL; 1081 return NULL;
1064 } 1082 }
1065 StringPiece header_data = packet.BeforePlaintext(); 1083 StringPiece header_data = packet.BeforePlaintext();
1066 size_t len = header_data.length() + out->length(); 1084 size_t len = header_data.length() + out->length();
1067 char* buffer = new char[len]; 1085 char* buffer = new char[len];
1068 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt(). 1086 // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
1069 memcpy(buffer, header_data.data(), header_data.length()); 1087 memcpy(buffer, header_data.data(), header_data.length());
1070 memcpy(buffer + header_data.length(), out->data(), out->length()); 1088 memcpy(buffer + header_data.length(), out->data(), out->length());
1071 return new QuicEncryptedPacket(buffer, len, true); 1089 return new QuicEncryptedPacket(buffer, len, true);
1072 } 1090 }
1073 1091
1074 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { 1092 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
1075 return encrypter_->GetMaxPlaintextSize(ciphertext_size); 1093 // In order to keep the code simple, we don't have the current encryption
1094 // level to hand. At the moment, all AEADs have a tag-length of 16 bytes so
1095 // that doesn't matter but we take the minimum plaintext length just to be
1096 // safe.
1097 size_t min_plaintext_size = ciphertext_size;
1098
1099 for (int i = ENCRYPTION_NONE; i <= ENCRYPTION_FORWARD_SECURE; i++) {
1100 if (encrypter_[i].get() != NULL) {
1101 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
1102 if (size < min_plaintext_size) {
1103 min_plaintext_size = size;
1104 }
1105 }
1106 }
1107
1108 return min_plaintext_size;
1076 } 1109 }
1077 1110
1078 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number, 1111 bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
1079 bool version_flag, 1112 bool version_flag,
1080 const QuicEncryptedPacket& packet) { 1113 const QuicEncryptedPacket& packet) {
1081 StringPiece encrypted; 1114 StringPiece encrypted;
1082 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) { 1115 if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
1083 return false; 1116 return false;
1084 } 1117 }
1085 DCHECK(decrypter_.get() != NULL); 1118 DCHECK(decrypter_.get() != NULL);
1119 LOG(INFO) << "Decrypting packet";
1086 decrypted_.reset(decrypter_->DecryptPacket( 1120 decrypted_.reset(decrypter_->DecryptPacket(
1087 sequence_number, 1121 sequence_number,
1088 GetAssociatedDataFromEncryptedPacket(packet, version_flag), 1122 GetAssociatedDataFromEncryptedPacket(packet, version_flag),
1089 encrypted)); 1123 encrypted));
1090 if (decrypted_.get() == NULL && backup_decrypter_.get() != NULL) { 1124 if (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) {
1091 decrypted_.reset(backup_decrypter_->DecryptPacket( 1125 LOG(INFO) << "Trying alternative";
1126 decrypted_.reset(alternative_decrypter_->DecryptPacket(
1092 sequence_number, 1127 sequence_number,
1093 GetAssociatedDataFromEncryptedPacket(packet, version_flag), 1128 GetAssociatedDataFromEncryptedPacket(packet, version_flag),
1094 encrypted)); 1129 encrypted));
1130 if (decrypted_.get() != NULL) {
1131 LOG(INFO) << "alternative ok";
1132 if (alternative_decrypter_latch_) {
1133 LOG(INFO) << " latching";
1134 // Switch to the alternative decrypter and latch so that we cannot
1135 // switch back.
1136 decrypter_.reset(alternative_decrypter_.release());
1137 } else {
1138 LOG(INFO) << " swapping";
1139 // Switch the alternative decrypter so that we use it first next time.
1140 decrypter_.swap(alternative_decrypter_);
1141 }
1142 }
1095 } 1143 }
1096 // TODO(wtc): tell the caller or visitor which decrypter was used, so that 1144
1097 // they can verify a packet that should be encrypted is encrypted.
1098 // TODO(wtc): figure out when it is safe to delete backup_decrypter_.
1099 if (decrypted_.get() == NULL) { 1145 if (decrypted_.get() == NULL) {
1100 return false; 1146 return false;
1101 } 1147 }
1102 1148
1103 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length())); 1149 reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length()));
1104 return true; 1150 return true;
1105 } 1151 }
1106 1152
1107 size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) { 1153 size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) {
1108 switch (frame.type) { 1154 switch (frame.type) {
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 1477
1432 bool QuicFramer::RaiseError(QuicErrorCode error) { 1478 bool QuicFramer::RaiseError(QuicErrorCode error) {
1433 DLOG(INFO) << detailed_error_; 1479 DLOG(INFO) << detailed_error_;
1434 set_error(error); 1480 set_error(error);
1435 visitor_->OnError(this); 1481 visitor_->OnError(this);
1436 reader_.reset(NULL); 1482 reader_.reset(NULL);
1437 return false; 1483 return false;
1438 } 1484 }
1439 1485
1440 } // namespace net 1486 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698