Index: net/quic/crypto/quic_crypto_client_config.cc |
diff --git a/net/quic/crypto/quic_crypto_client_config.cc b/net/quic/crypto/quic_crypto_client_config.cc |
index bb71fcc5803a1d1eaaa966096032595eebbe191d..0467ff55f0a3f08bde6abcd08e2f343baf755ed6 100644 |
--- a/net/quic/crypto/quic_crypto_client_config.cc |
+++ b/net/quic/crypto/quic_crypto_client_config.cc |
@@ -191,9 +191,10 @@ void QuicCryptoClientConfig::CachedState::InvalidateServerConfig() { |
void QuicCryptoClientConfig::CachedState::SetProof(const vector<string>& certs, |
StringPiece cert_sct, |
+ StringPiece chlo_hash, |
StringPiece signature) { |
- bool has_changed = |
- signature != server_config_sig_ || certs_.size() != certs.size(); |
+ bool has_changed = signature != server_config_sig_ || |
+ chlo_hash != chlo_hash_ || certs_.size() != certs.size(); |
if (!has_changed) { |
for (size_t i = 0; i < certs_.size(); i++) { |
@@ -212,6 +213,7 @@ void QuicCryptoClientConfig::CachedState::SetProof(const vector<string>& certs, |
SetProofInvalid(); |
certs_ = certs; |
cert_sct_ = cert_sct.as_string(); |
+ chlo_hash_ = chlo_hash.as_string(); |
server_config_sig_ = signature.as_string(); |
} |
@@ -220,6 +222,7 @@ void QuicCryptoClientConfig::CachedState::Clear() { |
source_address_token_.clear(); |
certs_.clear(); |
cert_sct_.clear(); |
+ chlo_hash_.clear(); |
server_config_sig_.clear(); |
server_config_valid_ = false; |
proof_verify_details_.reset(); |
@@ -233,6 +236,7 @@ void QuicCryptoClientConfig::CachedState::ClearProof() { |
SetProofInvalid(); |
certs_.clear(); |
cert_sct_.clear(); |
+ chlo_hash_.clear(); |
server_config_sig_.clear(); |
} |
@@ -250,6 +254,7 @@ bool QuicCryptoClientConfig::CachedState::Initialize( |
StringPiece source_address_token, |
const vector<string>& certs, |
const string& cert_sct, |
+ StringPiece chlo_hash, |
StringPiece signature, |
QuicWallTime now) { |
DCHECK(server_config_.empty()); |
@@ -267,6 +272,7 @@ bool QuicCryptoClientConfig::CachedState::Initialize( |
return false; |
} |
+ chlo_hash.CopyToString(&chlo_hash_); |
signature.CopyToString(&server_config_sig_); |
source_address_token.CopyToString(&source_address_token_); |
certs_ = certs; |
@@ -291,6 +297,10 @@ const string& QuicCryptoClientConfig::CachedState::cert_sct() const { |
return cert_sct_; |
} |
+const string& QuicCryptoClientConfig::CachedState::chlo_hash() const { |
+ return chlo_hash_; |
+} |
+ |
const string& QuicCryptoClientConfig::CachedState::signature() const { |
return server_config_sig_; |
} |
@@ -330,6 +340,7 @@ void QuicCryptoClientConfig::CachedState::InitializeFrom( |
source_address_token_ = other.source_address_token_; |
certs_ = other.certs_; |
cert_sct_ = other.cert_sct_; |
+ chlo_hash_ = other.chlo_hash_; |
server_config_sig_ = other.server_config_sig_; |
server_config_valid_ = other.server_config_valid_; |
server_designated_connection_ids_ = other.server_designated_connection_ids_; |
@@ -709,7 +720,8 @@ QuicErrorCode QuicCryptoClientConfig::FillClientHello( |
QuicErrorCode QuicCryptoClientConfig::CacheNewServerConfig( |
const CryptoHandshakeMessage& message, |
QuicWallTime now, |
- const QuicVersion version, |
+ QuicVersion version, |
+ StringPiece chlo_hash, |
const vector<string>& cached_certs, |
CachedState* cached, |
string* error_details) { |
@@ -751,7 +763,7 @@ QuicErrorCode QuicCryptoClientConfig::CacheNewServerConfig( |
if (version > QUIC_VERSION_29) { |
message.GetStringPiece(kCertificateSCTTag, &cert_sct); |
} |
- cached->SetProof(certs, cert_sct, proof); |
+ cached->SetProof(certs, cert_sct, chlo_hash, proof); |
} else { |
// Secure QUIC: clear existing proof as we have been sent a new SCFG |
// without matching proof/certs. |
@@ -775,6 +787,7 @@ QuicErrorCode QuicCryptoClientConfig::ProcessRejection( |
const CryptoHandshakeMessage& rej, |
QuicWallTime now, |
const QuicVersion version, |
+ StringPiece chlo_hash, |
CachedState* cached, |
QuicCryptoNegotiatedParameters* out_params, |
string* error_details) { |
@@ -785,8 +798,9 @@ QuicErrorCode QuicCryptoClientConfig::ProcessRejection( |
return QUIC_CRYPTO_INTERNAL_ERROR; |
} |
- QuicErrorCode error = CacheNewServerConfig( |
- rej, now, version, out_params->cached_certs, cached, error_details); |
+ QuicErrorCode error = |
+ CacheNewServerConfig(rej, now, version, chlo_hash, |
+ out_params->cached_certs, cached, error_details); |
if (error != QUIC_NO_ERROR) { |
return error; |
} |
@@ -879,6 +893,7 @@ QuicErrorCode QuicCryptoClientConfig::ProcessServerConfigUpdate( |
const CryptoHandshakeMessage& server_config_update, |
QuicWallTime now, |
const QuicVersion version, |
+ StringPiece chlo_hash, |
CachedState* cached, |
QuicCryptoNegotiatedParameters* out_params, |
string* error_details) { |
@@ -888,7 +903,7 @@ QuicErrorCode QuicCryptoClientConfig::ProcessServerConfigUpdate( |
*error_details = "ServerConfigUpdate must have kSCUP tag."; |
return QUIC_INVALID_CRYPTO_MESSAGE_TYPE; |
} |
- return CacheNewServerConfig(server_config_update, now, version, |
+ return CacheNewServerConfig(server_config_update, now, version, chlo_hash, |
out_params->cached_certs, cached, error_details); |
} |