gfe-relnote: Refactor QuicFramer to use array of QuicDecrypter. Not flag protected.
PiperOrigin-RevId: 240227711
Change-Id: I93eaee5a6176dff23fdd84361c372ca76f903c94
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index 4640d39..2594497 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -489,7 +489,7 @@
version_(PROTOCOL_UNSUPPORTED, QUIC_VERSION_UNSUPPORTED),
supported_versions_(supported_versions),
decrypter_level_(ENCRYPTION_INITIAL),
- alternative_decrypter_level_(ENCRYPTION_INITIAL),
+ alternative_decrypter_level_(NUM_ENCRYPTION_LEVELS),
alternative_decrypter_latch_(false),
perspective_(perspective),
validate_flags_(true),
@@ -505,7 +505,7 @@
supports_multiple_packet_number_spaces_(false) {
DCHECK(!supported_versions.empty());
version_ = supported_versions_[0];
- decrypter_ = QuicMakeUnique<NullDecrypter>(perspective);
+ decrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullDecrypter>(perspective);
encrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullEncrypter>(perspective);
}
@@ -3910,9 +3910,10 @@
void QuicFramer::SetDecrypter(EncryptionLevel level,
std::unique_ptr<QuicDecrypter> decrypter) {
- DCHECK(alternative_decrypter_ == nullptr);
+ DCHECK_EQ(alternative_decrypter_level_, NUM_ENCRYPTION_LEVELS);
DCHECK_GE(level, decrypter_level_);
- decrypter_ = std::move(decrypter);
+ decrypter_[decrypter_level_] = nullptr;
+ decrypter_[level] = std::move(decrypter);
decrypter_level_ = level;
}
@@ -3920,17 +3921,24 @@
EncryptionLevel level,
std::unique_ptr<QuicDecrypter> decrypter,
bool latch_once_used) {
- alternative_decrypter_ = std::move(decrypter);
+ DCHECK_NE(level, decrypter_level_);
+ if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
+ decrypter_[alternative_decrypter_level_] = nullptr;
+ }
+ decrypter_[level] = std::move(decrypter);
alternative_decrypter_level_ = level;
alternative_decrypter_latch_ = latch_once_used;
}
const QuicDecrypter* QuicFramer::decrypter() const {
- return decrypter_.get();
+ return decrypter_[decrypter_level_].get();
}
const QuicDecrypter* QuicFramer::alternative_decrypter() const {
- return alternative_decrypter_.get();
+ if (alternative_decrypter_level_ == NUM_ENCRYPTION_LEVELS) {
+ return nullptr;
+ }
+ return decrypter_[alternative_decrypter_level_].get();
}
void QuicFramer::SetEncrypter(EncryptionLevel level,
@@ -4017,18 +4025,22 @@
size_t buffer_length,
size_t* decrypted_length,
EncryptionLevel* decrypted_level) {
- DCHECK(decrypter_ != nullptr);
+ DCHECK(decrypter_[decrypter_level_] != nullptr);
+ QuicDecrypter* alternative_decrypter = nullptr;
+ if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
+ alternative_decrypter = decrypter_[alternative_decrypter_level_].get();
+ }
- bool success = decrypter_->DecryptPacket(
+ bool success = decrypter_[decrypter_level_]->DecryptPacket(
header.packet_number.ToUint64(), associated_data, encrypted,
decrypted_buffer, decrypted_length, buffer_length);
if (success) {
visitor_->OnDecryptedPacket(decrypter_level_);
*decrypted_level = decrypter_level_;
- } else if (alternative_decrypter_ != nullptr) {
+ } else if (alternative_decrypter != nullptr) {
if (header.nonce != nullptr) {
DCHECK_EQ(perspective_, Perspective::IS_CLIENT);
- alternative_decrypter_->SetDiversificationNonce(*header.nonce);
+ alternative_decrypter->SetDiversificationNonce(*header.nonce);
}
bool try_alternative_decryption = true;
if (alternative_decrypter_level_ == ENCRYPTION_ZERO_RTT) {
@@ -4043,7 +4055,7 @@
}
if (try_alternative_decryption) {
- success = alternative_decrypter_->DecryptPacket(
+ success = alternative_decrypter->DecryptPacket(
header.packet_number.ToUint64(), associated_data, encrypted,
decrypted_buffer, decrypted_length, buffer_length);
}
@@ -4053,12 +4065,12 @@
if (alternative_decrypter_latch_) {
// Switch to the alternative decrypter and latch so that we cannot
// switch back.
- decrypter_ = std::move(alternative_decrypter_);
decrypter_level_ = alternative_decrypter_level_;
- alternative_decrypter_level_ = ENCRYPTION_INITIAL;
+ decrypter_[decrypter_level_] =
+ std::move(decrypter_[alternative_decrypter_level_]);
+ alternative_decrypter_level_ = NUM_ENCRYPTION_LEVELS;
} else {
// Switch the alternative decrypter so that we use it first next time.
- decrypter_.swap(alternative_decrypter_);
EncryptionLevel level = alternative_decrypter_level_;
alternative_decrypter_level_ = decrypter_level_;
decrypter_level_ = level;