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

Reply via email to