diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.cc')
-rw-r--r-- | chromium/net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.cc | 154 |
1 files changed, 72 insertions, 82 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.cc b/chromium/net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.cc index b929dcc11b9..da04f4f1ca1 100644 --- a/chromium/net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.cc +++ b/chromium/net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.h" +#include "quic/core/crypto/quic_crypto_server_config.h" #include <algorithm> #include <cstdlib> @@ -16,43 +16,42 @@ #include "absl/types/optional.h" #include "third_party/boringssl/src/include/openssl/sha.h" #include "third_party/boringssl/src/include/openssl/ssl.h" -#include "net/third_party/quiche/src/quic/core/crypto/aes_128_gcm_12_decrypter.h" -#include "net/third_party/quiche/src/quic/core/crypto/aes_128_gcm_12_encrypter.h" -#include "net/third_party/quiche/src/quic/core/crypto/cert_compressor.h" -#include "net/third_party/quiche/src/quic/core/crypto/certificate_view.h" -#include "net/third_party/quiche/src/quic/core/crypto/chacha20_poly1305_encrypter.h" -#include "net/third_party/quiche/src/quic/core/crypto/channel_id.h" -#include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h" -#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h" -#include "net/third_party/quiche/src/quic/core/crypto/crypto_utils.h" -#include "net/third_party/quiche/src/quic/core/crypto/curve25519_key_exchange.h" -#include "net/third_party/quiche/src/quic/core/crypto/key_exchange.h" -#include "net/third_party/quiche/src/quic/core/crypto/p256_key_exchange.h" -#include "net/third_party/quiche/src/quic/core/crypto/proof_source.h" -#include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h" -#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h" -#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h" -#include "net/third_party/quiche/src/quic/core/crypto/quic_hkdf.h" -#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h" -#include "net/third_party/quiche/src/quic/core/crypto/server_proof_verifier.h" -#include "net/third_party/quiche/src/quic/core/crypto/tls_server_connection.h" -#include "net/third_party/quiche/src/quic/core/proto/crypto_server_config_proto.h" -#include "net/third_party/quiche/src/quic/core/proto/source_address_token_proto.h" -#include "net/third_party/quiche/src/quic/core/quic_clock.h" -#include "net/third_party/quiche/src/quic/core/quic_packets.h" -#include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h" -#include "net/third_party/quiche/src/quic/core/quic_types.h" -#include "net/third_party/quiche/src/quic/core/quic_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_cert_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_hostname_utils.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_reference_counted.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" -#include "net/third_party/quiche/src/quic/platform/api/quic_testvalue.h" -#include "net/third_party/quiche/src/common/platform/api/quiche_text_utils.h" +#include "quic/core/crypto/aes_128_gcm_12_decrypter.h" +#include "quic/core/crypto/aes_128_gcm_12_encrypter.h" +#include "quic/core/crypto/cert_compressor.h" +#include "quic/core/crypto/certificate_view.h" +#include "quic/core/crypto/chacha20_poly1305_encrypter.h" +#include "quic/core/crypto/channel_id.h" +#include "quic/core/crypto/crypto_framer.h" +#include "quic/core/crypto/crypto_handshake_message.h" +#include "quic/core/crypto/crypto_utils.h" +#include "quic/core/crypto/curve25519_key_exchange.h" +#include "quic/core/crypto/key_exchange.h" +#include "quic/core/crypto/p256_key_exchange.h" +#include "quic/core/crypto/proof_source.h" +#include "quic/core/crypto/proof_verifier.h" +#include "quic/core/crypto/quic_decrypter.h" +#include "quic/core/crypto/quic_encrypter.h" +#include "quic/core/crypto/quic_hkdf.h" +#include "quic/core/crypto/quic_random.h" +#include "quic/core/crypto/server_proof_verifier.h" +#include "quic/core/crypto/tls_server_connection.h" +#include "quic/core/proto/crypto_server_config_proto.h" +#include "quic/core/proto/source_address_token_proto.h" +#include "quic/core/quic_clock.h" +#include "quic/core/quic_packets.h" +#include "quic/core/quic_socket_address_coder.h" +#include "quic/core/quic_types.h" +#include "quic/core/quic_utils.h" +#include "quic/platform/api/quic_bug_tracker.h" +#include "quic/platform/api/quic_flag_utils.h" +#include "quic/platform/api/quic_flags.h" +#include "quic/platform/api/quic_hostname_utils.h" +#include "quic/platform/api/quic_logging.h" +#include "quic/platform/api/quic_reference_counted.h" +#include "quic/platform/api/quic_socket_address.h" +#include "quic/platform/api/quic_testvalue.h" +#include "common/platform/api/quiche_text_utils.h" namespace quic { @@ -256,7 +255,7 @@ QuicCryptoServerConfig::QuicCryptoServerConfig( pad_shlo_(true), validate_chlo_size_(true), validate_source_address_token_(true) { - DCHECK(proof_source_.get()); + QUICHE_DCHECK(proof_source_.get()); source_address_token_boxer_.SetKeys( {DeriveSourceAddressTokenKey(source_address_token_secret)}); @@ -288,7 +287,7 @@ QuicServerConfigProtobuf QuicCryptoServerConfig::GenerateConfig( std::string encoded_public_values; // First three bytes encode the length of the public value. - DCHECK_LT(curve25519_public_value.size(), (1U << 24)); + QUICHE_DCHECK_LT(curve25519_public_value.size(), (1U << 24)); encoded_public_values.push_back( static_cast<char>(curve25519_public_value.size())); encoded_public_values.push_back( @@ -305,7 +304,7 @@ QuicServerConfigProtobuf QuicCryptoServerConfig::GenerateConfig( P256KeyExchange::New(p256_private_key)); absl::string_view p256_public_value = p256->public_value(); - DCHECK_LT(p256_public_value.size(), (1U << 24)); + QUICHE_DCHECK_LT(p256_public_value.size(), (1U << 24)); encoded_public_values.push_back( static_cast<char>(p256_public_value.size())); encoded_public_values.push_back( @@ -339,7 +338,7 @@ QuicServerConfigProtobuf QuicCryptoServerConfig::GenerateConfig( if (options.orbit.size() == sizeof(orbit_bytes)) { memcpy(orbit_bytes, options.orbit.data(), sizeof(orbit_bytes)); } else { - DCHECK(options.orbit.empty()); + QUICHE_DCHECK(options.orbit.empty()); rand->RandBytes(orbit_bytes, sizeof(orbit_bytes)); } msg.SetStringPiece(kORBT, @@ -417,9 +416,9 @@ std::unique_ptr<CryptoHandshakeMessage> QuicCryptoServerConfig::AddConfig( configs_[config->id] = config; SelectNewPrimaryConfig(now); - DCHECK(primary_config_.get()); - DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), - primary_config_.get()); + QUICHE_DCHECK(primary_config_.get()); + QUICHE_DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), + primary_config_.get()); } return msg; @@ -507,9 +506,9 @@ bool QuicCryptoServerConfig::SetConfigs( configs_ = std::move(new_configs); fallback_config_ = fallback_config; SelectNewPrimaryConfig(now); - DCHECK(primary_config_.get()); - DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), - primary_config_.get()); + QUICHE_DCHECK(primary_config_.get()); + QUICHE_DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), + primary_config_.get()); return true; } @@ -673,7 +672,7 @@ void QuicCryptoServerConfig::ProcessClientHello( QuicByteCount total_framing_overhead, QuicByteCount chlo_packet_size, std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const { - DCHECK(done_cb); + QUICHE_DCHECK(done_cb); auto context = std::make_unique<ProcessClientHelloContext>( validate_chlo_result, reject_only, connection_id, server_address, client_address, version, supported_versions, clock, rand, @@ -721,7 +720,7 @@ void QuicCryptoServerConfig::ProcessClientHello( auto cb = std::make_unique<ProcessClientHelloCallback>( this, std::move(context), configs); - DCHECK(proof_source_.get()); + QUICHE_DCHECK(proof_source_.get()); proof_source_->GetProof(server_address, client_address, sni, configs.primary->serialized, transport_version, chlo_hash, std::move(cb)); @@ -742,7 +741,7 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterGetProof( context->connection_id(), context->transport_version())) << "ProcessClientHelloAfterGetProof: attempted to use connection ID " << context->connection_id() << " which is invalid with version " - << QuicVersionToString(context->transport_version()); + << context->version(); if (found_error) { context->Fail(QUIC_HANDSHAKE_FAILED, "Failed to get proof"); @@ -830,7 +829,7 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterCalculateSharedKeys( << "ProcessClientHelloAfterCalculateSharedKeys:" " attempted to use connection ID " << context->connection_id() << " which is invalid with version " - << QuicVersionToString(context->transport_version()); + << context->version(); if (found_error) { // If we are already using the fallback config, or there is no fallback @@ -863,7 +862,7 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterCalculateSharedKeys( hkdf_suffix.append(client_hello_serialized.data(), client_hello_serialized.length()); hkdf_suffix.append(configs.requested->serialized); - DCHECK(proof_source_.get()); + QUICHE_DCHECK(proof_source_.get()); if (context->signed_config()->chain->certs.empty()) { context->Fail(QUIC_CRYPTO_INTERNAL_ERROR, "Failed to get certs"); return; @@ -1001,7 +1000,7 @@ void QuicCryptoServerConfig::ProcessClientHelloAfterCalculateSharedKeys( out->SetVersionVector(kVER, context->supported_versions()); out->SetStringPiece( kSourceAddressTokenTag, - NewSourceAddressToken(*configs.requested, + NewSourceAddressToken(*configs.requested->source_address_token_boxer, context->info().source_address_tokens, context->client_address().host(), context->rand(), context->info().now, nullptr)); @@ -1086,9 +1085,9 @@ bool QuicCryptoServerConfig::GetCurrentConfigs( configs_lock_.ReaderUnlock(); configs_lock_.WriterLock(); SelectNewPrimaryConfig(now); - DCHECK(primary_config_.get()); - DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), - primary_config_.get()); + QUICHE_DCHECK(primary_config_.get()); + QUICHE_DCHECK_EQ(configs_.find(primary_config_->id)->second.get(), + primary_config_.get()); configs_lock_.WriterUnlock(); configs_lock_.ReaderLock(); } @@ -1235,7 +1234,8 @@ void QuicCryptoServerConfig::EvaluateClientHello( Config& config = configs.requested != nullptr ? *configs.requested : *configs.primary; source_address_token_error = - ParseSourceAddressToken(config, srct, &info->source_address_tokens); + ParseSourceAddressToken(*config.source_address_token_boxer, srct, + &info->source_address_tokens); if (source_address_token_error == HANDSHAKE_OK) { source_address_token_error = ValidateSourceAddressTokens( @@ -1326,8 +1326,9 @@ void QuicCryptoServerConfig::BuildServerConfigUpdateMessage( serialized = primary_config_->serialized; common_cert_sets = primary_config_->common_cert_sets; source_address_token = NewSourceAddressToken( - *primary_config_, previous_source_address_tokens, client_address.host(), - rand, clock->WallNow(), cached_network_params); + *primary_config_->source_address_token_boxer, + previous_source_address_tokens, client_address.host(), rand, + clock->WallNow(), cached_network_params); } CryptoHandshakeMessage message; @@ -1438,8 +1439,9 @@ void QuicCryptoServerConfig::BuildRejection( out->SetStringPiece( kSourceAddressTokenTag, NewSourceAddressToken( - config, context.info().source_address_tokens, - context.info().client_ip, context.rand(), context.info().now, + *config.source_address_token_boxer, + context.info().source_address_tokens, context.info().client_ip, + context.rand(), context.info().now, &context.validate_chlo_result()->cached_network_params)); out->SetValue(kSTTL, config.expiry_time.AbsoluteDifference(now).ToSeconds()); if (replay_protection_) { @@ -1448,7 +1450,7 @@ void QuicCryptoServerConfig::BuildRejection( } // Send client the reject reason for debugging purposes. - DCHECK_LT(0u, reject_reasons.size()); + QUICHE_DCHECK_LT(0u, reject_reasons.size()); out->SetVector(kRREJ, reject_reasons); // The client may have requested a certificate chain. @@ -1477,7 +1479,7 @@ void QuicCryptoServerConfig::BuildRejection( context.params()->client_common_set_hashes, context.params()->client_cached_cert_hashes, config.common_cert_sets); - DCHECK_GT(context.chlo_packet_size(), context.client_hello().size()); + QUICHE_DCHECK_GT(context.chlo_packet_size(), context.client_hello().size()); // kREJOverheadBytes is a very rough estimate of how much of a REJ // message is taken up by things other than the certificates. // STK: 56 bytes @@ -1513,27 +1515,15 @@ void QuicCryptoServerConfig::BuildRejection( context.signed_config()->chain->certs; std::string ca_subject; if (!certs.empty()) { - if (GetQuicReloadableFlag( - quic_extract_x509_subject_using_certificate_view)) { - QUIC_RELOADABLE_FLAG_COUNT_N( - quic_extract_x509_subject_using_certificate_view, 1, 2); std::unique_ptr<CertificateView> view = CertificateView::ParseSingleCertificate(certs[0]); if (view != nullptr) { absl::optional<std::string> maybe_ca_subject = view->GetHumanReadableSubject(); if (maybe_ca_subject.has_value()) { - QUIC_RELOADABLE_FLAG_COUNT_N( - quic_extract_x509_subject_using_certificate_view, 2, 2); ca_subject = *maybe_ca_subject; } } - } else { - absl::string_view ca_subject_view; - QuicCertUtils::ExtractSubjectNameFromDERCert(certs[0], - &ca_subject_view); - ca_subject = std::string(ca_subject_view); - } } QUIC_LOG_EVERY_N_SEC(WARNING, 60) << "SCT is expected but it is empty. sni: '" @@ -1559,7 +1549,7 @@ std::string QuicCryptoServerConfig::CompressChain( const std::string& client_cached_cert_hashes, const CommonCertSets* common_sets) { // Check whether the compressed certs is available in the cache. - DCHECK(compressed_certs_cache); + QUICHE_DCHECK(compressed_certs_cache); const std::string* cached_value = compressed_certs_cache->GetCompressedCert( chain, client_common_set_hashes, client_cached_cert_hashes); if (cached_value) { @@ -1718,7 +1708,7 @@ void QuicCryptoServerConfig::AcquirePrimaryConfigChangedCb( } std::string QuicCryptoServerConfig::NewSourceAddressToken( - const Config& config, + const CryptoSecretBoxer& crypto_secret_boxer, const SourceAddressTokens& previous_tokens, const QuicIpAddress& ip, QuicRandom* rand, @@ -1751,8 +1741,8 @@ std::string QuicCryptoServerConfig::NewSourceAddressToken( *(source_address_tokens.add_tokens()) = token; } - return config.source_address_token_boxer->Box( - rand, source_address_tokens.SerializeAsString()); + return crypto_secret_boxer.Box(rand, + source_address_tokens.SerializeAsString()); } int QuicCryptoServerConfig::NumberOfConfigs() const { @@ -1786,12 +1776,12 @@ SSL_CTX* QuicCryptoServerConfig::ssl_ctx() const { } HandshakeFailureReason QuicCryptoServerConfig::ParseSourceAddressToken( - const Config& config, + const CryptoSecretBoxer& crypto_secret_boxer, absl::string_view token, SourceAddressTokens* tokens) const { std::string storage; absl::string_view plaintext; - if (!config.source_address_token_boxer->Unbox(token, &storage, &plaintext)) { + if (!crypto_secret_boxer.Unbox(token, &storage, &plaintext)) { return SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE; } |