| 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 28 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |