Index: net/quic/core/crypto/quic_crypto_server_config.cc |
diff --git a/net/quic/core/crypto/quic_crypto_server_config.cc b/net/quic/core/crypto/quic_crypto_server_config.cc |
index dcc925f3920ca14b2a86b635bc7779a2df15a265..e70c4f2b5ff46d0aaace8e0c5c66fa4afe877c7c 100644 |
--- a/net/quic/core/crypto/quic_crypto_server_config.cc |
+++ b/net/quic/core/crypto/quic_crypto_server_config.cc |
@@ -500,7 +500,7 @@ void QuicCryptoServerConfig::ValidateClientHello( |
const IPAddress& server_ip, |
QuicVersion version, |
const QuicClock* clock, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const { |
const QuicWallTime now(clock->WallNow()); |
@@ -530,16 +530,16 @@ void QuicCryptoServerConfig::ValidateClientHello( |
requested_config = GetConfigWithScid(requested_scid); |
primary_config = primary_config_; |
- crypto_proof->config = primary_config_; |
+ signed_config->config = primary_config_; |
} |
if (result->error_code == QUIC_NO_ERROR) { |
// QUIC requires a new proof for each CHLO so clear any existing proof. |
- crypto_proof->chain = nullptr; |
- crypto_proof->signature = ""; |
- crypto_proof->cert_sct = ""; |
+ signed_config->chain = nullptr; |
+ signed_config->signature = ""; |
+ signed_config->cert_sct = ""; |
EvaluateClientHello(server_ip, version, requested_config, primary_config, |
- crypto_proof, result, std::move(done_cb)); |
+ signed_config, result, std::move(done_cb)); |
} else { |
done_cb->Run(result, /* details = */ nullptr); |
} |
@@ -597,7 +597,7 @@ class QuicCryptoServerConfig::ProcessClientHelloCallback |
QuicRandom* rand, |
QuicCompressedCertsCache* compressed_certs_cache, |
scoped_refptr<QuicCryptoNegotiatedParameters> params, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
QuicByteCount total_framing_overhead, |
QuicByteCount chlo_packet_size, |
const scoped_refptr<QuicCryptoServerConfig::Config>& requested_config, |
@@ -616,7 +616,7 @@ class QuicCryptoServerConfig::ProcessClientHelloCallback |
rand_(rand), |
compressed_certs_cache_(compressed_certs_cache), |
params_(params), |
- crypto_proof_(crypto_proof), |
+ signed_config_(signed_config), |
total_framing_overhead_(total_framing_overhead), |
chlo_packet_size_(chlo_packet_size), |
requested_config_(requested_config), |
@@ -625,19 +625,18 @@ class QuicCryptoServerConfig::ProcessClientHelloCallback |
void Run(bool ok, |
const scoped_refptr<ProofSource::Chain>& chain, |
- const string& signature, |
- const string& leaf_cert_sct, |
+ const QuicCryptoProof& proof, |
std::unique_ptr<ProofSource::Details> details) override { |
if (ok) { |
- crypto_proof_->chain = chain; |
- crypto_proof_->signature = signature; |
- crypto_proof_->cert_sct = leaf_cert_sct; |
+ signed_config_->chain = chain; |
+ signed_config_->signature = proof.signature; |
+ signed_config_->cert_sct = proof.leaf_cert_scts; |
} |
config_->ProcessClientHelloAfterGetProof( |
!ok, std::move(details), *validate_chlo_result_, reject_only_, |
connection_id_, client_address_, version_, supported_versions_, |
use_stateless_rejects_, server_designated_connection_id_, clock_, rand_, |
- compressed_certs_cache_, params_, crypto_proof_, |
+ compressed_certs_cache_, params_, signed_config_, |
total_framing_overhead_, chlo_packet_size_, requested_config_, |
primary_config_, std::move(done_cb_)); |
} |
@@ -657,7 +656,7 @@ class QuicCryptoServerConfig::ProcessClientHelloCallback |
QuicRandom* const rand_; |
QuicCompressedCertsCache* compressed_certs_cache_; |
scoped_refptr<QuicCryptoNegotiatedParameters> params_; |
- scoped_refptr<QuicCryptoProof> crypto_proof_; |
+ scoped_refptr<QuicSignedServerConfig> signed_config_; |
const QuicByteCount total_framing_overhead_; |
const QuicByteCount chlo_packet_size_; |
const scoped_refptr<QuicCryptoServerConfig::Config> requested_config_; |
@@ -680,7 +679,7 @@ void QuicCryptoServerConfig::ProcessClientHello( |
QuicRandom* rand, |
QuicCompressedCertsCache* compressed_certs_cache, |
scoped_refptr<QuicCryptoNegotiatedParameters> params, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
QuicByteCount total_framing_overhead, |
QuicByteCount chlo_packet_size, |
std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const { |
@@ -722,7 +721,7 @@ void QuicCryptoServerConfig::ProcessClientHello( |
// Use the config that the client requested in order to do key-agreement. |
// Otherwise give it a copy of |primary_config_| to use. |
- primary_config = crypto_proof->config; |
+ primary_config = signed_config->config; |
requested_config = GetConfigWithScid(requested_scid); |
} |
} |
@@ -746,7 +745,7 @@ void QuicCryptoServerConfig::ProcessClientHello( |
CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash); |
// No need to get a new proof if one was already generated. |
- if (!crypto_proof->chain) { |
+ if (!signed_config->chain) { |
const QuicTag* tag_ptr; |
size_t num_tags; |
QuicTagVector connection_options; |
@@ -759,7 +758,7 @@ void QuicCryptoServerConfig::ProcessClientHello( |
this, validate_chlo_result, reject_only, connection_id, |
client_address, version, supported_versions, |
use_stateless_rejects, server_designated_connection_id, clock, |
- rand, compressed_certs_cache, params, crypto_proof, |
+ rand, compressed_certs_cache, params, signed_config, |
total_framing_overhead, chlo_packet_size, requested_config, |
primary_config, std::move(done_cb))); |
proof_source_->GetProof(server_ip, info.sni.as_string(), |
@@ -769,13 +768,16 @@ void QuicCryptoServerConfig::ProcessClientHello( |
return; |
} |
- if (!proof_source_->GetProof( |
- server_ip, info.sni.as_string(), primary_config->serialized, |
- version, chlo_hash, connection_options, &crypto_proof->chain, |
- &crypto_proof->signature, &crypto_proof->cert_sct)) { |
+ QuicCryptoProof proof; |
+ if (!proof_source_->GetProof(server_ip, info.sni.as_string(), |
+ primary_config->serialized, version, chlo_hash, |
+ connection_options, &signed_config->chain, |
+ &proof)) { |
helper.Fail(QUIC_HANDSHAKE_FAILED, "Missing or invalid crypto proof."); |
return; |
} |
+ signed_config->signature = proof.signature; |
+ signed_config->cert_sct = proof.leaf_cert_scts; |
} |
helper.DetachCallback(); |
@@ -784,7 +786,7 @@ void QuicCryptoServerConfig::ProcessClientHello( |
*validate_chlo_result, reject_only, connection_id, client_address, |
version, supported_versions, use_stateless_rejects, |
server_designated_connection_id, clock, rand, compressed_certs_cache, |
- params, crypto_proof, total_framing_overhead, chlo_packet_size, |
+ params, signed_config, total_framing_overhead, chlo_packet_size, |
requested_config, primary_config, std::move(done_cb)); |
} |
@@ -803,7 +805,7 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterGetProof( |
QuicRandom* rand, |
QuicCompressedCertsCache* compressed_certs_cache, |
scoped_refptr<QuicCryptoNegotiatedParameters> params, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
QuicByteCount total_framing_overhead, |
QuicByteCount chlo_packet_size, |
const scoped_refptr<Config>& requested_config, |
@@ -833,7 +835,7 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterGetProof( |
BuildRejection(version, clock->WallNow(), *primary_config, client_hello, |
info, validate_chlo_result.cached_network_params, |
use_stateless_rejects, server_designated_connection_id, rand, |
- compressed_certs_cache, params, *crypto_proof, |
+ compressed_certs_cache, params, *signed_config, |
total_framing_overhead, chlo_packet_size, out.get()); |
if (FLAGS_quic_export_rej_for_all_rejects && |
rejection_observer_ != nullptr) { |
@@ -926,11 +928,11 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterGetProof( |
client_hello_serialized.length()); |
hkdf_suffix.append(requested_config->serialized); |
DCHECK(proof_source_.get()); |
- if (crypto_proof->chain->certs.empty()) { |
+ if (signed_config->chain->certs.empty()) { |
helper.Fail(QUIC_CRYPTO_INTERNAL_ERROR, "Failed to get certs"); |
return; |
} |
- hkdf_suffix.append(crypto_proof->chain->certs.at(0)); |
+ hkdf_suffix.append(signed_config->chain->certs.at(0)); |
StringPiece cetv_ciphertext; |
if (requested_config->channel_id_enabled && |
@@ -1208,7 +1210,7 @@ class QuicCryptoServerConfig::EvaluateClientHelloCallback |
QuicVersion version, |
scoped_refptr<QuicCryptoServerConfig::Config> requested_config, |
scoped_refptr<QuicCryptoServerConfig::Config> primary_config, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
scoped_refptr<ValidateClientHelloResultCallback::Result> |
client_hello_state, |
std::unique_ptr<ValidateClientHelloResultCallback> done_cb) |
@@ -1218,23 +1220,22 @@ class QuicCryptoServerConfig::EvaluateClientHelloCallback |
version_(version), |
requested_config_(std::move(requested_config)), |
primary_config_(std::move(primary_config)), |
- crypto_proof_(crypto_proof), |
+ signed_config_(signed_config), |
client_hello_state_(std::move(client_hello_state)), |
done_cb_(std::move(done_cb)) {} |
void Run(bool ok, |
const scoped_refptr<ProofSource::Chain>& chain, |
- const string& signature, |
- const string& leaf_cert_sct, |
+ const QuicCryptoProof& proof, |
std::unique_ptr<ProofSource::Details> details) override { |
if (ok) { |
- crypto_proof_->chain = chain; |
- crypto_proof_->signature = signature; |
- crypto_proof_->cert_sct = leaf_cert_sct; |
+ signed_config_->chain = chain; |
+ signed_config_->signature = proof.signature; |
+ signed_config_->cert_sct = proof.leaf_cert_scts; |
} |
config_.EvaluateClientHelloAfterGetProof( |
found_error_, server_ip_, version_, requested_config_, primary_config_, |
- crypto_proof_, std::move(details), !ok, client_hello_state_, |
+ signed_config_, std::move(details), !ok, client_hello_state_, |
std::move(done_cb_)); |
} |
@@ -1245,7 +1246,7 @@ class QuicCryptoServerConfig::EvaluateClientHelloCallback |
const QuicVersion version_; |
const scoped_refptr<QuicCryptoServerConfig::Config> requested_config_; |
const scoped_refptr<QuicCryptoServerConfig::Config> primary_config_; |
- scoped_refptr<QuicCryptoProof> crypto_proof_; |
+ scoped_refptr<QuicSignedServerConfig> signed_config_; |
scoped_refptr<ValidateClientHelloResultCallback::Result> client_hello_state_; |
std::unique_ptr<ValidateClientHelloResultCallback> done_cb_; |
}; |
@@ -1255,7 +1256,7 @@ void QuicCryptoServerConfig::EvaluateClientHello( |
QuicVersion version, |
scoped_refptr<Config> requested_config, |
scoped_refptr<Config> primary_config, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
scoped_refptr<ValidateClientHelloResultCallback::Result> client_hello_state, |
std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const { |
ValidateClientHelloHelper helper(client_hello_state, &done_cb); |
@@ -1327,7 +1328,7 @@ void QuicCryptoServerConfig::EvaluateClientHello( |
string chlo_hash; |
CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash); |
bool need_proof = true; |
- need_proof = !crypto_proof->chain; |
+ need_proof = !signed_config->chain; |
const QuicTag* tag_ptr; |
size_t num_tags; |
QuicTagVector connection_options; |
@@ -1341,7 +1342,7 @@ void QuicCryptoServerConfig::EvaluateClientHello( |
std::unique_ptr<EvaluateClientHelloCallback> cb( |
new EvaluateClientHelloCallback( |
*this, found_error, server_ip, version, requested_config, |
- primary_config, crypto_proof, client_hello_state, |
+ primary_config, signed_config, client_hello_state, |
std::move(done_cb))); |
proof_source_->GetProof(server_ip, info->sni.as_string(), |
serialized_config, version, chlo_hash, |
@@ -1352,19 +1353,24 @@ void QuicCryptoServerConfig::EvaluateClientHello( |
} |
// No need to get a new proof if one was already generated. |
- if (need_proof && |
- !proof_source_->GetProof( |
- server_ip, info->sni.as_string(), serialized_config, version, |
- chlo_hash, connection_options, &crypto_proof->chain, |
- &crypto_proof->signature, &crypto_proof->cert_sct)) { |
- get_proof_failed = true; |
+ if (need_proof) { |
+ QuicCryptoProof proof; |
+ |
+ if (proof_source_->GetProof( |
+ server_ip, info->sni.as_string(), serialized_config, version, |
+ chlo_hash, connection_options, &signed_config->chain, &proof)) { |
+ signed_config->signature = proof.signature; |
+ signed_config->cert_sct = proof.leaf_cert_scts; |
+ } else { |
+ get_proof_failed = true; |
+ } |
} |
// Details are null because the synchronous version of GetProof does not |
// return any stats. Eventually the synchronous codepath will be eliminated. |
EvaluateClientHelloAfterGetProof( |
found_error, server_ip, version, requested_config, primary_config, |
- crypto_proof, nullptr /* proof_source_details */, get_proof_failed, |
+ signed_config, nullptr /* proof_source_details */, get_proof_failed, |
client_hello_state, std::move(done_cb)); |
helper.DetachCallback(); |
} |
@@ -1375,7 +1381,7 @@ void QuicCryptoServerConfig::EvaluateClientHelloAfterGetProof( |
QuicVersion version, |
scoped_refptr<Config> requested_config, |
scoped_refptr<Config> primary_config, |
- scoped_refptr<QuicCryptoProof> crypto_proof, |
+ scoped_refptr<QuicSignedServerConfig> signed_config, |
std::unique_ptr<ProofSource::Details> proof_source_details, |
bool get_proof_failed, |
scoped_refptr<ValidateClientHelloResultCallback::Result> client_hello_state, |
@@ -1389,7 +1395,7 @@ void QuicCryptoServerConfig::EvaluateClientHelloAfterGetProof( |
info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE); |
} |
- if (!ValidateExpectedLeafCertificate(client_hello, *crypto_proof)) { |
+ if (!ValidateExpectedLeafCertificate(client_hello, *signed_config)) { |
found_error = true; |
info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE); |
} |
@@ -1516,11 +1522,9 @@ bool QuicCryptoServerConfig::BuildServerConfigUpdateMessage( |
expiry_time.AbsoluteDifference(clock->WallNow()).ToSeconds()); |
scoped_refptr<ProofSource::Chain> chain; |
- string signature; |
- string cert_sct; |
+ QuicCryptoProof proof; |
if (!proof_source_->GetProof(server_ip, params.sni, serialized, version, |
- chlo_hash, connection_options, &chain, |
- &signature, &cert_sct)) { |
+ chlo_hash, connection_options, &chain, &proof)) { |
DVLOG(1) << "Server: failed to get proof."; |
return false; |
} |
@@ -1530,13 +1534,13 @@ bool QuicCryptoServerConfig::BuildServerConfigUpdateMessage( |
params.client_cached_cert_hashes, common_cert_sets); |
out->SetStringPiece(kCertificateTag, compressed); |
- out->SetStringPiece(kPROF, signature); |
+ out->SetStringPiece(kPROF, proof.signature); |
if (params.sct_supported_by_client && enable_serving_sct_) { |
- if (cert_sct.empty()) { |
+ if (proof.leaf_cert_scts.empty()) { |
DLOG(WARNING) << "SCT is expected but it is empty. sni: " << params.sni |
<< " server_ip: " << server_ip.ToString(); |
} else { |
- out->SetStringPiece(kCertificateSCTTag, cert_sct); |
+ out->SetStringPiece(kCertificateSCTTag, proof.leaf_cert_scts); |
} |
} |
return true; |
@@ -1612,14 +1616,14 @@ QuicCryptoServerConfig::BuildServerConfigUpdateMessageProofSourceCallback:: |
void QuicCryptoServerConfig::BuildServerConfigUpdateMessageProofSourceCallback:: |
Run(bool ok, |
const scoped_refptr<ProofSource::Chain>& chain, |
- const string& signature, |
- const string& leaf_cert_sct, |
+ const QuicCryptoProof& proof, |
std::unique_ptr<ProofSource::Details> details) { |
config_->FinishBuildServerConfigUpdateMessage( |
version_, compressed_certs_cache_, common_cert_sets_, |
client_common_set_hashes_, client_cached_cert_hashes_, |
- sct_supported_by_client_, ok, chain, signature, leaf_cert_sct, |
- std::move(details), std::move(message_), std::move(cb_)); |
+ sct_supported_by_client_, ok, chain, proof.signature, |
+ proof.leaf_cert_scts, std::move(details), std::move(message_), |
+ std::move(cb_)); |
} |
void QuicCryptoServerConfig::FinishBuildServerConfigUpdateMessage( |
@@ -1670,7 +1674,7 @@ void QuicCryptoServerConfig::BuildRejection( |
QuicRandom* rand, |
QuicCompressedCertsCache* compressed_certs_cache, |
scoped_refptr<QuicCryptoNegotiatedParameters> params, |
- const QuicCryptoProof& crypto_proof, |
+ const QuicSignedServerConfig& signed_config, |
QuicByteCount total_framing_overhead, |
QuicByteCount chlo_packet_size, |
CryptoHandshakeMessage* out) const { |
@@ -1714,7 +1718,7 @@ void QuicCryptoServerConfig::BuildRejection( |
} |
const string compressed = |
- CompressChain(compressed_certs_cache, crypto_proof.chain, |
+ CompressChain(compressed_certs_cache, signed_config.chain, |
params->client_common_set_hashes, |
params->client_cached_cert_hashes, config.common_cert_sets); |
@@ -1737,22 +1741,22 @@ void QuicCryptoServerConfig::BuildRejection( |
"overhead calculation may underflow"); |
bool should_return_sct = |
params->sct_supported_by_client && enable_serving_sct_; |
- const size_t sct_size = should_return_sct ? crypto_proof.cert_sct.size() : 0; |
+ const size_t sct_size = should_return_sct ? signed_config.cert_sct.size() : 0; |
const size_t total_size = |
- crypto_proof.signature.size() + compressed.size() + sct_size; |
+ signed_config.signature.size() + compressed.size() + sct_size; |
if (info.valid_source_address_token || total_size < max_unverified_size) { |
out->SetStringPiece(kCertificateTag, compressed); |
- out->SetStringPiece(kPROF, crypto_proof.signature); |
+ out->SetStringPiece(kPROF, signed_config.signature); |
if (should_return_sct) { |
- if (crypto_proof.cert_sct.empty()) { |
+ if (signed_config.cert_sct.empty()) { |
DLOG(WARNING) << "SCT is expected but it is empty."; |
} else { |
- out->SetStringPiece(kCertificateSCTTag, crypto_proof.cert_sct); |
+ out->SetStringPiece(kCertificateSCTTag, signed_config.cert_sct); |
} |
} |
} else { |
DLOG(WARNING) << "Sending inchoate REJ for hostname: " << info.sni |
- << " signature: " << crypto_proof.signature.size() |
+ << " signature: " << signed_config.signature.size() |
<< " cert: " << compressed.size() << " sct:" << sct_size |
<< " total: " << total_size |
<< " max: " << max_unverified_size; |
@@ -2234,8 +2238,8 @@ HandshakeFailureReason QuicCryptoServerConfig::ValidateServerNonce( |
bool QuicCryptoServerConfig::ValidateExpectedLeafCertificate( |
const CryptoHandshakeMessage& client_hello, |
- const QuicCryptoProof& crypto_proof) const { |
- if (crypto_proof.chain->certs.empty()) { |
+ const QuicSignedServerConfig& signed_config) const { |
+ if (signed_config.chain->certs.empty()) { |
return false; |
} |
@@ -2243,7 +2247,7 @@ bool QuicCryptoServerConfig::ValidateExpectedLeafCertificate( |
if (client_hello.GetUint64(kXLCT, &hash_from_client) != QUIC_NO_ERROR) { |
return false; |
} |
- return CryptoUtils::ComputeLeafCertHash(crypto_proof.chain->certs.at(0)) == |
+ return CryptoUtils::ComputeLeafCertHash(signed_config.chain->certs.at(0)) == |
hash_from_client; |
} |
@@ -2277,7 +2281,7 @@ QuicCryptoServerConfig::Config::Config() |
QuicCryptoServerConfig::Config::~Config() { |
} |
-QuicCryptoProof::QuicCryptoProof() {} |
-QuicCryptoProof::~QuicCryptoProof() {} |
+QuicSignedServerConfig::QuicSignedServerConfig() {} |
+QuicSignedServerConfig::~QuicSignedServerConfig() {} |
} // namespace net |