Index: net/quic/core/crypto/quic_crypto_client_config.cc |
diff --git a/net/quic/core/crypto/quic_crypto_client_config.cc b/net/quic/core/crypto/quic_crypto_client_config.cc |
index 0bee46290dbcb6c592551f00634c190bdafcf3ed..cd9c7783a72f81e233157c37acbea7162e9997eb 100644 |
--- a/net/quic/core/crypto/quic_crypto_client_config.cc |
+++ b/net/quic/core/crypto/quic_crypto_client_config.cc |
@@ -66,7 +66,9 @@ QuicCryptoClientConfig::~QuicCryptoClientConfig() { |
} |
QuicCryptoClientConfig::CachedState::CachedState() |
- : server_config_valid_(false), generation_counter_(0) {} |
+ : server_config_valid_(false), |
+ expiration_time_(QuicWallTime::Zero()), |
+ generation_counter_(0) {} |
QuicCryptoClientConfig::CachedState::~CachedState() {} |
@@ -89,15 +91,11 @@ bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const { |
return false; |
} |
- uint64_t expiry_seconds; |
- if (scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) { |
- RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID_EXPIRY); |
- return false; |
- } |
- if (now.ToUNIXSeconds() >= expiry_seconds) { |
+ if (now.IsAfter(expiration_time_)) { |
UMA_HISTOGRAM_CUSTOM_TIMES( |
"Net.QuicClientHelloServerConfig.InvalidDuration", |
- base::TimeDelta::FromSeconds(now.ToUNIXSeconds() - expiry_seconds), |
+ base::TimeDelta::FromSeconds(now.ToUNIXSeconds() - |
+ expiration_time_.ToUNIXSeconds()), |
base::TimeDelta::FromMinutes(1), base::TimeDelta::FromDays(20), 50); |
RecordInchoateClientHelloReason(SERVER_CONFIG_EXPIRED); |
return false; |
@@ -145,6 +143,7 @@ bool QuicCryptoClientConfig::CachedState::has_server_nonce() const { |
QuicCryptoClientConfig::CachedState::ServerConfigState |
QuicCryptoClientConfig::CachedState::SetServerConfig(StringPiece server_config, |
QuicWallTime now, |
+ QuicWallTime expiry_time, |
string* error_details) { |
const bool matches_existing = server_config == server_config_; |
@@ -165,13 +164,18 @@ QuicCryptoClientConfig::CachedState::SetServerConfig(StringPiece server_config, |
return SERVER_CONFIG_INVALID; |
} |
- uint64_t expiry_seconds; |
- if (new_scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) { |
- *error_details = "SCFG missing EXPY"; |
- return SERVER_CONFIG_INVALID_EXPIRY; |
+ if (expiry_time.IsZero()) { |
+ uint64_t expiry_seconds; |
+ if (new_scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) { |
+ *error_details = "SCFG missing EXPY"; |
+ return SERVER_CONFIG_INVALID_EXPIRY; |
+ } |
+ expiration_time_ = QuicWallTime::FromUNIXSeconds(expiry_seconds); |
+ } else { |
+ expiration_time_ = expiry_time; |
} |
- if (now.ToUNIXSeconds() >= expiry_seconds) { |
+ if (now.IsAfter(expiration_time_)) { |
*error_details = "SCFG has expired"; |
return SERVER_CONFIG_EXPIRED; |
} |
@@ -259,7 +263,8 @@ bool QuicCryptoClientConfig::CachedState::Initialize( |
StringPiece cert_sct, |
StringPiece chlo_hash, |
StringPiece signature, |
- QuicWallTime now) { |
+ QuicWallTime now, |
+ QuicWallTime expiration_time) { |
DCHECK(server_config_.empty()); |
if (server_config.empty()) { |
@@ -268,7 +273,8 @@ bool QuicCryptoClientConfig::CachedState::Initialize( |
} |
string error_details; |
- ServerConfigState state = SetServerConfig(server_config, now, &error_details); |
+ ServerConfigState state = |
+ SetServerConfig(server_config, now, expiration_time, &error_details); |
RecordDiskCacheServerConfigState(state); |
if (state != SERVER_CONFIG_VALID) { |
DVLOG(1) << "SetServerConfig failed with " << error_details; |
@@ -347,6 +353,7 @@ void QuicCryptoClientConfig::CachedState::InitializeFrom( |
server_config_sig_ = other.server_config_sig_; |
server_config_valid_ = other.server_config_valid_; |
server_designated_connection_ids_ = other.server_designated_connection_ids_; |
+ expiration_time_ = other.expiration_time_; |
if (other.proof_verify_details_.get() != nullptr) { |
proof_verify_details_.reset(other.proof_verify_details_->Clone()); |
} |
@@ -730,8 +737,14 @@ QuicErrorCode QuicCryptoClientConfig::CacheNewServerConfig( |
return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND; |
} |
+ QuicWallTime expiration_time = QuicWallTime::Zero(); |
+ uint64_t expiry_seconds; |
+ if (message.GetUint64(kSTTL, &expiry_seconds) == QUIC_NO_ERROR) { |
+ expiration_time = now.Add(QuicTime::Delta::FromSeconds(expiry_seconds)); |
+ } |
+ |
CachedState::ServerConfigState state = |
- cached->SetServerConfig(scfg, now, error_details); |
+ cached->SetServerConfig(scfg, now, expiration_time, error_details); |
if (state == CachedState::SERVER_CONFIG_EXPIRED) { |
return QUIC_CRYPTO_SERVER_CONFIG_EXPIRED; |
} |