Make CryptoUtils::HashHandshakeMessage return by value Also, during the handshake, don't hash the CHLO unless the hash is going to be used. gfe-relnote: No-op refactoring, no functional change, not flag-protected. PiperOrigin-RevId: 238635063 Change-Id: I76f033c33f436a1e95db5aae9494dbfdf7139ed5
diff --git a/quic/core/crypto/crypto_server_test.cc b/quic/core/crypto/crypto_server_test.cc index 3b5a8f6..f784bdb 100644 --- a/quic/core/crypto/crypto_server_test.cc +++ b/quic/core/crypto/crypto_server_test.cc
@@ -863,8 +863,8 @@ std::string error_details; std::unique_ptr<ProofVerifierCallback> callback( new DummyProofVerifierCallback()); - std::string chlo_hash; - CryptoUtils::HashHandshakeMessage(msg, &chlo_hash, Perspective::IS_SERVER); + const std::string chlo_hash = + CryptoUtils::HashHandshakeMessage(msg, Perspective::IS_SERVER); EXPECT_EQ(QUIC_SUCCESS, proof_verifier->VerifyProof( "test.example.com", 443, (std::string(scfg_str)),
diff --git a/quic/core/crypto/crypto_utils.cc b/quic/core/crypto/crypto_utils.cc index ffb5f1c..e3e438b 100644 --- a/quic/core/crypto/crypto_utils.cc +++ b/quic/core/crypto/crypto_utils.cc
@@ -455,14 +455,16 @@ } // static -void CryptoUtils::HashHandshakeMessage(const CryptoHandshakeMessage& message, - std::string* output, - Perspective perspective) { +std::string CryptoUtils::HashHandshakeMessage( + const CryptoHandshakeMessage& message, + Perspective perspective) { + string output; const QuicData& serialized = message.GetSerialized(); uint8_t digest[SHA256_DIGEST_LENGTH]; SHA256(reinterpret_cast<const uint8_t*>(serialized.data()), serialized.length(), digest); - output->assign(reinterpret_cast<const char*>(digest), sizeof(digest)); + output.assign(reinterpret_cast<const char*>(digest), sizeof(digest)); + return output; } #undef RETURN_STRING_LITERAL // undef for jumbo builds
diff --git a/quic/core/crypto/crypto_utils.h b/quic/core/crypto/crypto_utils.h index 37f9a2f..a958311 100644 --- a/quic/core/crypto/crypto_utils.h +++ b/quic/core/crypto/crypto_utils.h
@@ -197,10 +197,9 @@ static const char* HandshakeFailureReasonToString( HandshakeFailureReason reason); - // Writes a hash of the serialized |message| into |output|. - static void HashHandshakeMessage(const CryptoHandshakeMessage& message, - std::string* output, - Perspective perspective); + // Returns a hash of the serialized |message|. + static string HashHandshakeMessage(const CryptoHandshakeMessage& message, + Perspective perspective); private: // Implements the HKDF-Expand-Label function as defined in section 7.1 of RFC
diff --git a/quic/core/crypto/quic_crypto_server_config.cc b/quic/core/crypto/quic_crypto_server_config.cc index ccb7691..aa45e33 100644 --- a/quic/core/crypto/quic_crypto_server_config.cc +++ b/quic/core/crypto/quic_crypto_server_config.cc
@@ -790,10 +790,6 @@ helper.Fail(QUIC_UNSUPPORTED_PROOF_DEMAND, "Missing or invalid PDMD"); return; } - DCHECK(proof_source_.get()); - std::string chlo_hash; - CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash, - Perspective::IS_SERVER); // No need to get a new proof if one was already generated. if (!signed_config->chain) { @@ -803,6 +799,10 @@ server_designated_connection_id, clock, rand, compressed_certs_cache, params, signed_config, total_framing_overhead, chlo_packet_size, requested_config, primary_config, std::move(done_cb)); + const std::string chlo_hash = + CryptoUtils::HashHandshakeMessage(client_hello, Perspective::IS_SERVER); + + DCHECK(proof_source_.get()); proof_source_->GetProof( server_address, std::string(info.sni), primary_config->serialized, version.transport_version, chlo_hash, std::move(cb));
diff --git a/quic/core/quic_crypto_client_handshaker.cc b/quic/core/quic_crypto_client_handshaker.cc index e758cb6..5d8a647 100644 --- a/quic/core/quic_crypto_client_handshaker.cc +++ b/quic/core/quic_crypto_client_handshaker.cc
@@ -334,7 +334,7 @@ return; } next_state_ = STATE_RECV_REJ; - CryptoUtils::HashHandshakeMessage(out, &chlo_hash_, Perspective::IS_CLIENT); + chlo_hash_ = CryptoUtils::HashHandshakeMessage(out, Perspective::IS_CLIENT); session()->connection()->set_fully_pad_crypto_hadshake_packets( crypto_config_->pad_inchoate_hello()); SendHandshakeMessage(out); @@ -364,7 +364,7 @@ stream_->CloseConnectionWithDetails(error, error_details); return; } - CryptoUtils::HashHandshakeMessage(out, &chlo_hash_, Perspective::IS_CLIENT); + chlo_hash_ = CryptoUtils::HashHandshakeMessage(out, Perspective::IS_CLIENT); channel_id_sent_ = (channel_id_key_ != nullptr); if (cached->proof_verify_details()) { proof_handler_->OnProofVerifyDetailsAvailable(
diff --git a/quic/core/quic_crypto_server_handshaker.cc b/quic/core/quic_crypto_server_handshaker.cc index c5b1597..cd3cce9 100644 --- a/quic/core/quic_crypto_server_handshaker.cc +++ b/quic/core/quic_crypto_server_handshaker.cc
@@ -121,8 +121,8 @@ return; } - CryptoUtils::HashHandshakeMessage(message, &chlo_hash_, - Perspective::IS_SERVER); + chlo_hash_ = + CryptoUtils::HashHandshakeMessage(message, Perspective::IS_SERVER); std::unique_ptr<ValidateCallback> cb(new ValidateCallback(this)); DCHECK(validate_client_hello_cb_ == nullptr);