Rename URLRequest's expected_signatures
to expected_public_keys
.
This was a bad naming choice. We're passing public key expectations up from Blink for use in the network stack. The signatures come from the server's response, and are eventually verified against these keys. No change in behavior, just improving comprehension. Bug: 383409575 Change-Id: I9348fd7f0baa4df6df589bceec61c77553eb3e5a Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6368837 Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org> Commit-Queue: Mike West <mkwst@chromium.org> Reviewed-by: Kenichi Ishibashi <bashi@chromium.org> Cr-Commit-Position: refs/heads/main@{#1435893}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
7570bd0267
commit
71e4dabaf3
services/network
prefetch_matches.ccurl_loader.ccurl_loader.h
public
cpp
resource_request.ccresource_request.hsri_message_signatures.ccsri_message_signatures.hurl_request_mojom_traits.ccurl_request_mojom_traits.hurl_request_mojom_traits_perftest.ccurl_request_mojom_traits_unittest.cc
mojom
third_party/blink/renderer
core
html
parser
platform
loader
fetch
tools/metrics/histograms/metadata/network
@@ -80,7 +80,7 @@ namespace {
|
|||||||
DO_FIELD(credentials_mode) __VA_ARGS__ \
|
DO_FIELD(credentials_mode) __VA_ARGS__ \
|
||||||
DO_FIELD(redirect_mode) __VA_ARGS__ \
|
DO_FIELD(redirect_mode) __VA_ARGS__ \
|
||||||
DO_FIELD(fetch_integrity) __VA_ARGS__ \
|
DO_FIELD(fetch_integrity) __VA_ARGS__ \
|
||||||
DO_FIELD(expected_signatures) __VA_ARGS__ \
|
DO_FIELD(expected_public_keys) __VA_ARGS__ \
|
||||||
DO_FIELD(destination) __VA_ARGS__ \
|
DO_FIELD(destination) __VA_ARGS__ \
|
||||||
DO_FIELD(original_destination) __VA_ARGS__ \
|
DO_FIELD(original_destination) __VA_ARGS__ \
|
||||||
DO_FIELD(request_body) __VA_ARGS__ \
|
DO_FIELD(request_body) __VA_ARGS__ \
|
||||||
@@ -222,7 +222,7 @@ enum class FieldsForUma {
|
|||||||
kAttributionReportingSrcToken = 61,
|
kAttributionReportingSrcToken = 61,
|
||||||
kIsAdTagged = 62,
|
kIsAdTagged = 62,
|
||||||
kKeepaliveToken = 63,
|
kKeepaliveToken = 63,
|
||||||
kExpectedSignatures = 64,
|
kExpectedPublicKeys = 64,
|
||||||
kPermissionsPolicy = 65,
|
kPermissionsPolicy = 65,
|
||||||
kClientSideContentDecodingEnabled = 66,
|
kClientSideContentDecodingEnabled = 66,
|
||||||
kMaxValue = kClientSideContentDecodingEnabled,
|
kMaxValue = kClientSideContentDecodingEnabled,
|
||||||
@@ -256,7 +256,7 @@ constexpr auto kUmaEnumMap = base::MakeFixedFlatMap<Fields, FieldsForUma>({
|
|||||||
{Fields::kcredentials_mode, FieldsForUma::kCredentialsMode},
|
{Fields::kcredentials_mode, FieldsForUma::kCredentialsMode},
|
||||||
{Fields::kredirect_mode, FieldsForUma::kRedirectMode},
|
{Fields::kredirect_mode, FieldsForUma::kRedirectMode},
|
||||||
{Fields::kfetch_integrity, FieldsForUma::kFetchIntegrity},
|
{Fields::kfetch_integrity, FieldsForUma::kFetchIntegrity},
|
||||||
{Fields::kexpected_signatures, FieldsForUma::kExpectedSignatures},
|
{Fields::kexpected_public_keys, FieldsForUma::kExpectedPublicKeys},
|
||||||
{Fields::kdestination, FieldsForUma::kDestination},
|
{Fields::kdestination, FieldsForUma::kDestination},
|
||||||
{Fields::koriginal_destination, FieldsForUma::kOriginalDestination},
|
{Fields::koriginal_destination, FieldsForUma::kOriginalDestination},
|
||||||
{Fields::krequest_body, FieldsForUma::kRequestBody},
|
{Fields::krequest_body, FieldsForUma::kRequestBody},
|
||||||
|
@@ -310,7 +310,7 @@ bool ResourceRequest::EqualsForTesting(const ResourceRequest& request) const {
|
|||||||
credentials_mode == request.credentials_mode &&
|
credentials_mode == request.credentials_mode &&
|
||||||
redirect_mode == request.redirect_mode &&
|
redirect_mode == request.redirect_mode &&
|
||||||
fetch_integrity == request.fetch_integrity &&
|
fetch_integrity == request.fetch_integrity &&
|
||||||
expected_signatures == request.expected_signatures &&
|
expected_public_keys == request.expected_public_keys &&
|
||||||
destination == request.destination &&
|
destination == request.destination &&
|
||||||
request_body == request.request_body &&
|
request_body == request.request_body &&
|
||||||
keepalive == request.keepalive &&
|
keepalive == request.keepalive &&
|
||||||
|
@@ -181,7 +181,7 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE) ResourceRequest {
|
|||||||
std::string fetch_integrity;
|
std::string fetch_integrity;
|
||||||
// Used to populate `Accept-Signatures`
|
// Used to populate `Accept-Signatures`
|
||||||
// https://www.rfc-editor.org/rfc/rfc9421.html#name-the-accept-signature-field
|
// https://www.rfc-editor.org/rfc/rfc9421.html#name-the-accept-signature-field
|
||||||
std::vector<std::string> expected_signatures;
|
std::vector<std::string> expected_public_keys;
|
||||||
mojom::RequestDestination destination = mojom::RequestDestination::kEmpty;
|
mojom::RequestDestination destination = mojom::RequestDestination::kEmpty;
|
||||||
mojom::RequestDestination original_destination =
|
mojom::RequestDestination original_destination =
|
||||||
mojom::RequestDestination::kEmpty;
|
mojom::RequestDestination::kEmpty;
|
||||||
|
@@ -746,7 +746,7 @@ MaybeBlockResponseForSRIMessageSignature(
|
|||||||
|
|
||||||
void MaybeSetAcceptSignatureHeader(
|
void MaybeSetAcceptSignatureHeader(
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
const std::vector<std::string>& expected_signatures) {
|
const std::vector<std::string>& expected_public_keys) {
|
||||||
// In order to support request-specific experimentation, we send the
|
// In order to support request-specific experimentation, we send the
|
||||||
// `Accept-Signature` header whenever signatures are expected by a request's
|
// `Accept-Signature` header whenever signatures are expected by a request's
|
||||||
// initiator, regardless of the `features::kSRIMessageSignatureEnforcement`
|
// initiator, regardless of the `features::kSRIMessageSignatureEnforcement`
|
||||||
@@ -757,7 +757,7 @@ void MaybeSetAcceptSignatureHeader(
|
|||||||
|
|
||||||
std::stringstream header;
|
std::stringstream header;
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (const std::string& public_key : expected_signatures) {
|
for (const std::string& public_key : expected_public_keys) {
|
||||||
// We expect these to be validly base64-encoded Ed25519 public keys:
|
// We expect these to be validly base64-encoded Ed25519 public keys:
|
||||||
std::optional<std::vector<uint8_t>> decoded =
|
std::optional<std::vector<uint8_t>> decoded =
|
||||||
base::Base64Decode(public_key);
|
base::Base64Decode(public_key);
|
||||||
|
@@ -78,7 +78,7 @@ MaybeBlockResponseForSRIMessageSignature(
|
|||||||
COMPONENT_EXPORT(NETWORK_CPP)
|
COMPONENT_EXPORT(NETWORK_CPP)
|
||||||
void MaybeSetAcceptSignatureHeader(
|
void MaybeSetAcceptSignatureHeader(
|
||||||
net::URLRequest*,
|
net::URLRequest*,
|
||||||
const std::vector<std::string>& expected_signatures);
|
const std::vector<std::string>& expected_public_keys);
|
||||||
|
|
||||||
} // namespace network
|
} // namespace network
|
||||||
|
|
||||||
|
@@ -121,7 +121,7 @@ bool StructTraits<
|
|||||||
!data.ReadCredentialsMode(&out->credentials_mode) ||
|
!data.ReadCredentialsMode(&out->credentials_mode) ||
|
||||||
!data.ReadRedirectMode(&out->redirect_mode) ||
|
!data.ReadRedirectMode(&out->redirect_mode) ||
|
||||||
!data.ReadFetchIntegrity(&out->fetch_integrity) ||
|
!data.ReadFetchIntegrity(&out->fetch_integrity) ||
|
||||||
!data.ReadExpectedSignatures(&out->expected_signatures) ||
|
!data.ReadExpectedPublicKeys(&out->expected_public_keys) ||
|
||||||
!data.ReadRequestBody(&out->request_body) ||
|
!data.ReadRequestBody(&out->request_body) ||
|
||||||
!data.ReadThrottlingProfileId(&out->throttling_profile_id) ||
|
!data.ReadThrottlingProfileId(&out->throttling_profile_id) ||
|
||||||
!data.ReadFetchWindowId(&out->fetch_window_id) ||
|
!data.ReadFetchWindowId(&out->fetch_window_id) ||
|
||||||
|
@@ -264,9 +264,9 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE)
|
|||||||
const network::ResourceRequest& request) {
|
const network::ResourceRequest& request) {
|
||||||
return request.fetch_integrity;
|
return request.fetch_integrity;
|
||||||
}
|
}
|
||||||
static const std::vector<std::string>& expected_signatures(
|
static const std::vector<std::string>& expected_public_keys(
|
||||||
const network::ResourceRequest& request) {
|
const network::ResourceRequest& request) {
|
||||||
return request.expected_signatures;
|
return request.expected_public_keys;
|
||||||
}
|
}
|
||||||
static network::mojom::RequestDestination destination(
|
static network::mojom::RequestDestination destination(
|
||||||
const network::ResourceRequest& request) {
|
const network::ResourceRequest& request) {
|
||||||
|
@@ -72,7 +72,7 @@ network::ResourceRequest CreateResourceRequest() {
|
|||||||
request.credentials_mode = mojom::CredentialsMode::kInclude;
|
request.credentials_mode = mojom::CredentialsMode::kInclude;
|
||||||
request.redirect_mode = mojom::RedirectMode::kFollow;
|
request.redirect_mode = mojom::RedirectMode::kFollow;
|
||||||
request.fetch_integrity = "dummy_fetch_integrity";
|
request.fetch_integrity = "dummy_fetch_integrity";
|
||||||
request.expected_signatures = {};
|
request.expected_public_keys = {};
|
||||||
request.keepalive = true;
|
request.keepalive = true;
|
||||||
request.browsing_topics = true;
|
request.browsing_topics = true;
|
||||||
request.ad_auction_headers = true;
|
request.ad_auction_headers = true;
|
||||||
|
@@ -86,7 +86,7 @@ TEST(URLRequestMojomTraitsTest, Roundtrips_ResourceRequest) {
|
|||||||
original.credentials_mode = mojom::CredentialsMode::kInclude;
|
original.credentials_mode = mojom::CredentialsMode::kInclude;
|
||||||
original.redirect_mode = mojom::RedirectMode::kFollow;
|
original.redirect_mode = mojom::RedirectMode::kFollow;
|
||||||
original.fetch_integrity = "dummy_fetch_integrity";
|
original.fetch_integrity = "dummy_fetch_integrity";
|
||||||
original.expected_signatures = {};
|
original.expected_public_keys = {};
|
||||||
original.keepalive = true;
|
original.keepalive = true;
|
||||||
original.browsing_topics = true;
|
original.browsing_topics = true;
|
||||||
original.ad_auction_headers = true;
|
original.ad_auction_headers = true;
|
||||||
|
@@ -317,7 +317,7 @@ struct URLRequest {
|
|||||||
// to populate an `Accept-Signatures` header.
|
// to populate an `Accept-Signatures` header.
|
||||||
//
|
//
|
||||||
// https://www.rfc-editor.org/rfc/rfc9421.html#name-the-accept-signature-field
|
// https://www.rfc-editor.org/rfc/rfc9421.html#name-the-accept-signature-field
|
||||||
array<string> expected_signatures;
|
array<string> expected_public_keys;
|
||||||
|
|
||||||
// https://fetch.spec.whatwg.org/#concept-request-destination
|
// https://fetch.spec.whatwg.org/#concept-request-destination
|
||||||
RequestDestination destination;
|
RequestDestination destination;
|
||||||
|
@@ -679,7 +679,7 @@ URLLoader::URLLoader(
|
|||||||
has_user_activation_(request.trusted_params &&
|
has_user_activation_(request.trusted_params &&
|
||||||
request.trusted_params->has_user_activation),
|
request.trusted_params->has_user_activation),
|
||||||
request_destination_(request.destination),
|
request_destination_(request.destination),
|
||||||
expected_signatures_(request.expected_signatures),
|
expected_public_keys_(request.expected_public_keys),
|
||||||
resource_scheduler_client_(context.GetResourceSchedulerClient()),
|
resource_scheduler_client_(context.GetResourceSchedulerClient()),
|
||||||
keepalive_statistics_recorder_(std::move(keepalive_statistics_recorder)),
|
keepalive_statistics_recorder_(std::move(keepalive_statistics_recorder)),
|
||||||
custom_proxy_pre_cache_headers_(request.custom_proxy_pre_cache_headers),
|
custom_proxy_pre_cache_headers_(request.custom_proxy_pre_cache_headers),
|
||||||
@@ -962,7 +962,7 @@ void URLLoader::ConfigureRequest(
|
|||||||
*factory_params_, *origin_access_list_,
|
*factory_params_, *origin_access_list_,
|
||||||
request_credentials_mode_);
|
request_credentials_mode_);
|
||||||
|
|
||||||
MaybeSetAcceptSignatureHeader(url_request_.get(), expected_signatures_);
|
MaybeSetAcceptSignatureHeader(url_request_.get(), expected_public_keys_);
|
||||||
|
|
||||||
url_request_->set_first_party_url_policy(first_party_url_policy);
|
url_request_->set_first_party_url_policy(first_party_url_policy);
|
||||||
|
|
||||||
@@ -2200,7 +2200,7 @@ void URLLoader::ContinueOnResponseStartedImmediately() {
|
|||||||
if (std::optional<mojom::BlockedByResponseReason> blocked_reason =
|
if (std::optional<mojom::BlockedByResponseReason> blocked_reason =
|
||||||
MaybeBlockResponseForSRIMessageSignature(
|
MaybeBlockResponseForSRIMessageSignature(
|
||||||
url_request_->url(), *response_,
|
url_request_->url(), *response_,
|
||||||
/*checks_forced_by_initiator=*/!expected_signatures_.empty(),
|
/*checks_forced_by_initiator=*/!expected_public_keys_.empty(),
|
||||||
devtools_observer_, devtools_request_id().value_or(""))) {
|
devtools_observer_, devtools_request_id().value_or(""))) {
|
||||||
CompleteBlockedResponse(net::ERR_BLOCKED_BY_RESPONSE, false,
|
CompleteBlockedResponse(net::ERR_BLOCKED_BY_RESPONSE, false,
|
||||||
blocked_reason);
|
blocked_reason);
|
||||||
|
@@ -796,7 +796,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
|
|||||||
const mojom::RequestDestination request_destination_ =
|
const mojom::RequestDestination request_destination_ =
|
||||||
mojom::RequestDestination::kEmpty;
|
mojom::RequestDestination::kEmpty;
|
||||||
|
|
||||||
const std::vector<std::string> expected_signatures_ = {};
|
const std::vector<std::string> expected_public_keys_;
|
||||||
|
|
||||||
scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
|
scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
|
||||||
|
|
||||||
|
@@ -116,7 +116,7 @@ Resource* PreloadRequest::Start(Document* document) {
|
|||||||
ResourceFetcher::DetermineRequestContext(resource_type_, is_image_set_));
|
ResourceFetcher::DetermineRequestContext(resource_type_, is_image_set_));
|
||||||
resource_request.SetRequestDestination(
|
resource_request.SetRequestDestination(
|
||||||
ResourceFetcher::DetermineRequestDestination(resource_type_));
|
ResourceFetcher::DetermineRequestDestination(resource_type_));
|
||||||
resource_request.SetExpectedSignatures(integrity_metadata_);
|
resource_request.SetExpectedPublicKeys(integrity_metadata_);
|
||||||
resource_request.SetFetchPriorityHint(fetch_priority_hint_);
|
resource_request.SetFetchPriorityHint(fetch_priority_hint_);
|
||||||
|
|
||||||
// Disable issue logging to avoid duplicates, since `CanRegister()` will be
|
// Disable issue logging to avoid duplicates, since `CanRegister()` will be
|
||||||
|
@@ -465,13 +465,13 @@ void ResourceRequestHead::SetFetchIntegrity(
|
|||||||
IntegrityMetadataSet metadata;
|
IntegrityMetadataSet metadata;
|
||||||
SubresourceIntegrity::ParseIntegrityAttribute(integrity, metadata,
|
SubresourceIntegrity::ParseIntegrityAttribute(integrity, metadata,
|
||||||
feature_context);
|
feature_context);
|
||||||
SetExpectedSignatures(metadata);
|
SetExpectedPublicKeys(metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceRequestHead::SetExpectedSignatures(
|
void ResourceRequestHead::SetExpectedPublicKeys(
|
||||||
const IntegrityMetadataSet& metadata) {
|
const IntegrityMetadataSet& metadata) {
|
||||||
for (const auto& signature : metadata.signatures) {
|
for (const auto& public_key : metadata.signatures) {
|
||||||
expected_signatures_.push_back(signature.first);
|
expected_public_keys_.push_back(public_key.first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -408,9 +408,9 @@ class PLATFORM_EXPORT ResourceRequestHead {
|
|||||||
void SetFetchIntegrity(const String& integrity, const FeatureContext*);
|
void SetFetchIntegrity(const String& integrity, const FeatureContext*);
|
||||||
|
|
||||||
// This is also called as a side-effect of `SetFetchIntegrity()`.
|
// This is also called as a side-effect of `SetFetchIntegrity()`.
|
||||||
void SetExpectedSignatures(const IntegrityMetadataSet&);
|
void SetExpectedPublicKeys(const IntegrityMetadataSet&);
|
||||||
const WTF::Vector<String>& GetExpectedSignatures() const {
|
const WTF::Vector<String>& GetExpectedPublicKeys() const {
|
||||||
return expected_signatures_;
|
return expected_public_keys_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CacheControlContainsNoCache() const;
|
bool CacheControlContainsNoCache() const;
|
||||||
@@ -751,8 +751,8 @@ class PLATFORM_EXPORT ResourceRequestHead {
|
|||||||
network::mojom::RedirectMode redirect_mode_;
|
network::mojom::RedirectMode redirect_mode_;
|
||||||
// Exposed as Request.integrity in Service Workers
|
// Exposed as Request.integrity in Service Workers
|
||||||
String fetch_integrity_;
|
String fetch_integrity_;
|
||||||
// Signature expectations extracted from `fetch_integrity_`
|
// Public key expectations extracted from `integrity_`
|
||||||
WTF::Vector<String> expected_signatures_;
|
WTF::Vector<String> expected_public_keys_;
|
||||||
String referrer_string_;
|
String referrer_string_;
|
||||||
network::mojom::ReferrerPolicy referrer_policy_;
|
network::mojom::ReferrerPolicy referrer_policy_;
|
||||||
network::mojom::CorsPreflightPolicy cors_preflight_policy_;
|
network::mojom::CorsPreflightPolicy cors_preflight_policy_;
|
||||||
|
@@ -325,9 +325,9 @@ void PopulateResourceRequest(const ResourceRequestHead& src,
|
|||||||
dest->credentials_mode = src.GetCredentialsMode();
|
dest->credentials_mode = src.GetCredentialsMode();
|
||||||
dest->redirect_mode = src.GetRedirectMode();
|
dest->redirect_mode = src.GetRedirectMode();
|
||||||
dest->fetch_integrity = src.GetFetchIntegrity().Utf8();
|
dest->fetch_integrity = src.GetFetchIntegrity().Utf8();
|
||||||
dest->expected_signatures.reserve(src.GetExpectedSignatures().size());
|
dest->expected_public_keys.reserve(src.GetExpectedPublicKeys().size());
|
||||||
for (const String& signature : src.GetExpectedSignatures()) {
|
for (const String& public_key : src.GetExpectedPublicKeys()) {
|
||||||
dest->expected_signatures.push_back(signature.Utf8());
|
dest->expected_public_keys.push_back(public_key.Utf8());
|
||||||
}
|
}
|
||||||
if (src.GetWebBundleTokenParams().has_value()) {
|
if (src.GetWebBundleTokenParams().has_value()) {
|
||||||
dest->web_bundle_token_params =
|
dest->web_bundle_token_params =
|
||||||
|
@@ -1570,7 +1570,7 @@ chromium-metrics-reviews@google.com.
|
|||||||
<int value="61" label="attribution_reporting_src_token"/>
|
<int value="61" label="attribution_reporting_src_token"/>
|
||||||
<int value="62" label="is_ad_tagged"/>
|
<int value="62" label="is_ad_tagged"/>
|
||||||
<int value="63" label="keepalive_token"/>
|
<int value="63" label="keepalive_token"/>
|
||||||
<int value="64" label="expected_signatures"/>
|
<int value="64" label="expected_public_keys"/>
|
||||||
<int value="65" label="permissions_policy"/>
|
<int value="65" label="permissions_policy"/>
|
||||||
<int value="66" label="client_side_content_decoding_enabled"/>
|
<int value="66" label="client_side_content_decoding_enabled"/>
|
||||||
</enum>
|
</enum>
|
||||||
|
Reference in New Issue
Block a user