Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: dcbc3580c465d7d078dbe8a9c44b91b9104853aa
https://github.com/WebKit/WebKit/commit/dcbc3580c465d7d078dbe8a9c44b91b9104853aa
Author: Pascoe <[email protected]>
Date: 2026-10-13 (Tue, 13 Oct 2026)
Changed paths:
M
LayoutTests/http/wpt/identity/digital-credential-openid4vp-disabled-by-default.https.html
M
LayoutTests/http/wpt/identity/digital-credential-openid4vp-request-parsing-disabled.https.html
M LayoutTests/http/wpt/identity/formats/ISO18013/mixed-requests.https.html
M LayoutTests/http/wpt/identity/formats/ISO18013/valid-roundtrip.https.html
M
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-roundtrip.https-expected.txt
M
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-roundtrip.https.html
A
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-unvalidated-request.https-expected.txt
A
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-unvalidated-request.https.html
M LayoutTests/platform/ios/TestExpectations
M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
M Source/WebCore/Headers.cmake
M Source/WebCore/Modules/identity/CredentialRequestCoordinator.cpp
M Source/WebCore/Modules/identity/CredentialRequestCoordinator.h
M Source/WebCore/Modules/identity/CredentialRequestCoordinatorClient.h
M Source/WebCore/Modules/identity/DigitalCredential.cpp
M Source/WebCore/Modules/identity/DigitalCredentialPresentationProtocol.h
A Source/WebCore/Modules/identity/DigitalCredentialsOpenID4VPRequestData.h
M Source/WebCore/Modules/identity/DigitalCredentialsRequestData.h
M Source/WebCore/Modules/identity/DigitalCredentialsRequestDataBuilder.cpp
M Source/WebCore/Modules/identity/DigitalCredentialsRequestDataBuilder.h
M
Source/WebCore/Modules/identity/dummy/DummyCredentialRequestCoordinatorClient.cpp
M
Source/WebCore/Modules/identity/dummy/DummyCredentialRequestCoordinatorClient.h
M Source/WebCore/Modules/identity/protocols/DigitalCredentialsProtocols.h
M
Source/WebCore/Modules/identity/protocols/UnvalidatedDigitalCredentialRequest.h
A
Source/WebCore/Modules/identity/protocols/openid/OpenID4VPUnsignedRequest.h
A
Source/WebCore/Modules/identity/protocols/openid/ValidatedOpenID4VPRequest.h
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/loader/EmptyClients.cpp
M Source/WebCore/page/ChromeClient.cpp
M Source/WebCore/page/ChromeClient.h
M Source/WebKit/Configurations/WebKitSwift.xcconfig
M Source/WebKit/DerivedSources-output.xcfilelist
M Source/WebKit/DerivedSources.make
M Source/WebKit/Headers.cmake
M Source/WebKit/PlatformCocoa.cmake
M Source/WebKit/Shared/WebCoreArgumentCodersAuth.serialization.in
M Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.h
M Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.mm
M Source/WebKit/UIProcess/DigitalCredentials/WKDigitalCredentialsPicker.mm
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebPageProxy.messages.in
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentController.swift
A
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentOpenID4VPRequest.h
A
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentOpenID4VPRequest.swift
M
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentRequest.h
M
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentRequest.swift
M
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentRawRequestValidator.h
M
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentRawRequestValidator.swift
M
Source/WebKit/WebProcess/DigitalCredentials/DigitalCredentialsCoordinator.cpp
M
Source/WebKit/WebProcess/DigitalCredentials/DigitalCredentialsCoordinator.h
M
Source/WebKit/WebProcess/cocoa/IdentityDocumentServices/DigitalCredentialsRequestValidatorBridge.h
M
Source/WebKit/WebProcess/cocoa/IdentityDocumentServices/DigitalCredentialsRequestValidatorBridge.mm
M Tools/TestWebKitAPI/CMakeLists.txt
M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
A Tools/TestWebKitAPI/Tests/WebCore/DigitalCredentialsRequestDataBuilder.cpp
Log Message:
-----------
[Digital Credentials] Validate OpenID4VP requests and hand them to the picker
https://bugs.webkit.org/show_bug.cgi?id=321618
rdar://problem/183338719
Reviewed by Abrar Rahman Protyasha.
319055@main taught the virtual wallet to honor the requested protocol, but
nothing behind it
could answer one: validateRequests() skipped every non-mdoc request,
DigitalCredentialsRequestData had a single alternative, and the picker could
only build an mdoc
request.
This patch fills that path in, matching mdoc. Each OpenID4VP request is
validated in the web
content process and reduced to a ValidatedOpenID4VPRequest: the protocol, the
DCQL query, and the
verifier identities established by the request's signatures, mirroring how a
validated mdoc request
carries its presentment requests and certificate chains. That crosses IPC to
the UI process, which
presents it, and a response is accepted only for a protocol the page requested.
The web content process also decides what is presented: mdoc keeps precedence
over OpenID4VP, and
only one OpenID4VP protocol is presented. The raw requests it later provides
for the document provider
are exactly the presented requests, in the same order, so that a raw request
can be released by its
position. Previously every request the page passed was provided, including ones
that failed
validation or were not presented, and a raw request that could not be converted
was dropped, shifting
the rest; now the raw requests are provided all or nothing.
A validated OpenID4VP request is bounded before it crosses IPC: its strings
share the request data's
length limit, its nested elements are capped, and at most a fixed number of
requests are presented.
The web content process enforces the same limits first, so that a page cannot
produce a request the UI
process refuses to decode.
An OpenID4VP request that does not validate is still handed to the UI process,
where a virtual
wallet can answer it; otherwise the picker rejects it, because nothing remains
to present. This
keeps openid4vp-roundtrip running, as its requests are not signed for the test
origin.
DigitalCredentialsExtras.swift is copied from WebKitAdditions only when it is
present, so this builds
against a WebKitAdditions that predates it; HAVE(DIGITAL_CREDENTIALS_OPENID4VP)
is off there.
The setting is on by default where HAVE(DIGITAL_CREDENTIALS_OPENID4VP), and the
tests that cover
it being off now turn it off explicitly.
*
LayoutTests/http/wpt/identity/digital-credential-openid4vp-disabled-by-default.https.html:
*
LayoutTests/http/wpt/identity/digital-credential-openid4vp-request-parsing-disabled.https.html:
* LayoutTests/http/wpt/identity/formats/ISO18013/mixed-requests.https.html:
* LayoutTests/http/wpt/identity/formats/ISO18013/valid-roundtrip.https.html:
*
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-roundtrip.https-expected.txt:
*
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-roundtrip.https.html:
*
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-unvalidated-request.https-expected.txt:
Added.
*
LayoutTests/http/wpt/identity/formats/openid4vp/openid4vp-unvalidated-request.https.html:
Added.
* LayoutTests/platform/ios/TestExpectations:
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WebCore/Headers.cmake:
* Source/WebCore/Modules/identity/CredentialRequestCoordinator.cpp:
(WebCore::CredentialRequestCoordinator::initiateTheCredentialRequest):
(WebCore::CredentialRequestCoordinator::prepareCredentialRequests):
* Source/WebCore/Modules/identity/CredentialRequestCoordinator.h:
* Source/WebCore/Modules/identity/CredentialRequestCoordinatorClient.h:
* Source/WebCore/Modules/identity/DigitalCredential.cpp:
(WebCore::DigitalCredential::userAgentAllowsProtocol):
(WebCore::convertProtocolString):
(WebCore::jsToCredentialRequest):
* Source/WebCore/Modules/identity/DigitalCredentialPresentationProtocol.h:
(WebCore::digitalCredentialPresentationProtocolFromString):
(WebCore::digitalCredentialPresentationProtocolToString):
(WebCore::isOpenID4VPPresentationProtocol):
* Source/WebCore/Modules/identity/DigitalCredentialsOpenID4VPRequestData.h:
Added.
* Source/WebCore/Modules/identity/DigitalCredentialsRequestData.h:
* Source/WebCore/Modules/identity/DigitalCredentialsRequestDataBuilder.cpp:
(WebCore::DigitalCredentialsRequestDataBuilder::build):
* Source/WebCore/Modules/identity/DigitalCredentialsRequestDataBuilder.h:
*
Source/WebCore/Modules/identity/dummy/DummyCredentialRequestCoordinatorClient.cpp:
(WebCore::DummyCredentialRequestCoordinatorClient::validateAndParseDigitalCredentialRequests):
*
Source/WebCore/Modules/identity/dummy/DummyCredentialRequestCoordinatorClient.h:
* Source/WebCore/Modules/identity/protocols/DigitalCredentialsProtocols.h:
*
Source/WebCore/Modules/identity/protocols/UnvalidatedDigitalCredentialRequest.h:
(WebCore::openID4VPRequestJSON): The request as the JSON object the page
passed, shared
by validation and raw request handoff.
* Source/WebCore/Modules/identity/protocols/openid/OpenID4VPUnsignedRequest.h:
Added.
* Source/WebCore/Modules/identity/protocols/openid/ValidatedOpenID4VPRequest.h:
Added.
(WebCore::isWithinOpenID4VPRequestLimits):
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/loader/EmptyClients.cpp:
* Source/WebCore/page/ChromeClient.cpp:
(WebCore::ChromeClient::validateAndParseDigitalCredentialRequests):
* Source/WebCore/page/ChromeClient.h:
* Source/WebKit/Configurations/WebKitSwift.xcconfig:
* Source/WebKit/DerivedSources-output.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/Headers.cmake:
* Source/WebKit/PlatformCocoa.cmake:
* Source/WebKit/Shared/WebCoreArgumentCodersAuth.serialization.in:
* Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.h:
* Source/WebKit/UIProcess/Cocoa/WebKitSwiftSoftLink.mm:
* Source/WebKit/UIProcess/DigitalCredentials/WKDigitalCredentialsPicker.mm:
(-[WKDigitalCredentialsPicker presentWithRequestData:completionHandler:]):
(-[WKDigitalCredentialsPicker performRequest:]):
(-[WKDigitalCredentialsPicker performOpenID4VPRequest:]):
(-[WKDigitalCredentialsPicker presentRequest:]):
(-[WKDigitalCredentialsPicker handlePresentmentCompletionWithResponse:error:]):
(mapRequestAuthentications):
(mapCertificateChain):
(mapCredentialFormat):
(mapTrustedAuthorityType):
(mapStrings):
(mapStringSets):
(mapClaimsQuery):
(mapOpenID4VPRequest):
(-[WKDigitalCredentialsPicker fetchRawRequestsWithCompletionHandler:]):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::showDigitalCredentialsChooser):
(WebKit::WebPageProxy::setVirtualWalletBehaviorForTesting):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentController.swift:
Accept an OpenID4VP response only for a protocol that was requested, and hand
OpenID4VP raw
requests to the document provider.
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentOpenID4VPRequest.h:
Added.
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentOpenID4VPRequest.swift:
Added.
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentRequest.h:
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentPresentmentRequest.swift:
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentRawRequestValidator.h:
*
Source/WebKit/WebKitSwift/IdentityDocumentServices/WKIdentityDocumentRawRequestValidator.swift:
(validateOpenID4VPRequest): Return the validated request.
* Source/WebKit/WebProcess/DigitalCredentials/DigitalCredentialsCoordinator.cpp:
(WebKit::DigitalCredentialsCoordinator::validateAndParseDigitalCredentialRequests):
* Source/WebKit/WebProcess/DigitalCredentials/DigitalCredentialsCoordinator.h:
*
Source/WebKit/WebProcess/cocoa/IdentityDocumentServices/DigitalCredentialsRequestValidatorBridge.h:
*
Source/WebKit/WebProcess/cocoa/IdentityDocumentServices/DigitalCredentialsRequestValidatorBridge.mm:
(WebKit::validateRequest):
(WebKit::createOpenID4VPRequestData):
(WebKit::reportValidationFailure):
(WebKit::DigitalCredentials::validateRequests):
(WebKit::convertCredentialFormat):
(WebKit::convertTrustedAuthorityType):
(WebKit::convertStrings):
(WebKit::convertStringSets):
(WebKit::convertClaimPathComponent):
(WebKit::convertClaimValue):
(WebKit::buildValidatedOpenID4VPRequestObject):
* Tools/TestWebKitAPI/CMakeLists.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebCore/DigitalCredentialsRequestDataBuilder.cpp:
Added.
(TestWebKitAPI::TEST(DigitalCredentialsRequestDataBuilder,
PresentsAtMostTheMaximumNumberOfOpenID4VPRequests)):
(TestWebKitAPI::TEST(ValidatedOpenID4VPRequest, LimitsBoundEveryElement)):
(TestWebKitAPI::TEST(ValidatedOpenID4VPRequest, LimitsBoundStringLength)):
(TestWebKitAPI::TEST(DigitalCredentialsRequestDataBuilder,
RawRequestsOmitRequestsThatDidNotValidate)):
(TestWebKitAPI::TEST(DigitalCredentialsRequestDataBuilder,
RawRequestsFollowMobileDocumentPrecedence)):
(TestWebKitAPI::TEST(DigitalCredentialsRequestDataBuilder,
RawRequestsFollowTheFirstOpenID4VPProtocol)):
(TestWebKitAPI::TEST(DigitalCredentialsRequestDataBuilder,
RejectsValidationThatDoesNotCoverEveryRequest)):
Canonical link: https://commits.webkit.org/323661@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications