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;
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h
index 98f7385..6e5b6aa 100644
--- a/quic/core/quic_framer.h
+++ b/quic/core/quic_framer.h
@@ -893,17 +893,17 @@
// element, with subsequent elements in descending order (versions can be
// skipped as necessary).
ParsedQuicVersionVector supported_versions_;
- // Primary decrypter used to decrypt packets during parsing.
- std::unique_ptr<QuicDecrypter> decrypter_;
- // Alternative decrypter that can also be used to decrypt packets.
- std::unique_ptr<QuicDecrypter> alternative_decrypter_;
- // The encryption level of |decrypter_|.
+ // Decrypters used to decrypt packets during parsing.
+ std::unique_ptr<QuicDecrypter> decrypter_[NUM_ENCRYPTION_LEVELS];
+ // The encryption level of the primary decrypter to use in |decrypter_|.
EncryptionLevel decrypter_level_;
- // The encryption level of |alternative_decrypter_|.
- EncryptionLevel alternative_decrypter_level_;
- // |alternative_decrypter_latch_| is true if, when |alternative_decrypter_|
- // successfully decrypts a packet, we should install it as the only
+ // The encryption level of the alternative decrypter to use in |decrypter_|.
+ // When set to NUM_ENCRYPTION_LEVELS, indicates that there is no alternative
// decrypter.
+ EncryptionLevel alternative_decrypter_level_;
+ // |alternative_decrypter_latch_| is true if, when the decrypter at
+ // |alternative_decrypter_level_| successfully decrypts a packet, we should
+ // install it as the only decrypter.
bool alternative_decrypter_latch_;
// Encrypters used to encrypt packets via EncryptPayload().
std::unique_ptr<QuicEncrypter> encrypter_[NUM_ENCRYPTION_LEVELS];
diff --git a/quic/test_tools/quic_framer_peer.cc b/quic/test_tools/quic_framer_peer.cc
index b8b749f..68c7d0e 100644
--- a/quic/test_tools/quic_framer_peer.cc
+++ b/quic/test_tools/quic_framer_peer.cc
@@ -307,9 +307,8 @@
void QuicFramerPeer::SwapCrypters(QuicFramer* framer1, QuicFramer* framer2) {
for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; i++) {
framer1->encrypter_[i].swap(framer2->encrypter_[i]);
+ framer1->decrypter_[i].swap(framer2->decrypter_[i]);
}
- framer1->decrypter_.swap(framer2->decrypter_);
- framer1->alternative_decrypter_.swap(framer2->alternative_decrypter_);
EncryptionLevel framer2_level = framer2->decrypter_level_;
framer2->decrypter_level_ = framer1->decrypter_level_;