Connect user-held identity to your service
Your app presents the request. The user approves disclosure. Your service decides access.
The issuance, presentation, verifier and federation adapter described here are planned additions. The available iOS SDK supports evidence capture, storage, signing and continuity; your app owns its screens and workflow.
The holder app, issuer and your service
These responsibilities describe the planned exchange package, issuer and verifier. They establish where each part runs and who controls it.
- In the holder app
- The holder app owns screens, consent and recovery. It supplies the stored proofing values for issuance. The exchange package adds protocol transport, holder-key signing and storage with erasure scoped to each instance.
- At the issuer
- The issuer verifies re-sent values against proofing bindings, signs the identity record and erases those values. It retains status and verification references. Issuer trust must be agreed with your service.
- In your service
- Deploy the verifier in your environment. It returns checked claims and their evidence. You own account linking, access rules and retention of received information. An optional OIDC or SAML 2.0 adapter connects verification to your existing sign-in system.
Present from an app or browser
Planned flows for native apps, mobile browsers and desktop browsers. Follow the request, user approval and verified result across each boundary.
Blue: user custody · Amber: your application and service · Purple: Kenshiki software
Planned native-app flow. The RP app starts the request. The holder app supplies the approved proof. Your backend binds the verified result to the initiating app request.
Your mobile app · RP app
User’s phone · Holder app, Kenshiki SDK inside
Your service · relying party · Kenshiki verifier + Access system
-
RP app → Access system
Start identity request from the RP app
-
Access system → Kenshiki verifier
Create signed request bound to this action
-
Kenshiki verifier → RP app
Return holder-app invocation request
-
RP app → Holder app
Open holder app with the request
-
Holder app
SDK validates request and recipient
-
Holder app
User reviews claims and approves
-
Holder app → Kenshiki verifier
SDK signs and sends encrypted presentation
-
Kenshiki verifier
Verify claims, key proof and request binding
-
RP app → Access system
Resume the originating app request
-
Access system
Check app identity and request binding
-
Access system → Kenshiki verifier
Consume verified result once, for this request
-
Kenshiki verifier → Access system
Return checked claims and evidence
-
Access system → RP app
Apply access rules and return result
The RP app and holder app have separate roles, even on one phone. Kenshiki SDK operations stay inside the holder app; your backend owns completion and access.
Planned same-device redirect flow. The browser and holder app run on one phone; your service binds completion to the browser visit that started the request.
Your application · Browser
User’s phone · Holder app, Kenshiki SDK inside
Your service · relying party · Kenshiki verifier + Access system
-
Browser → Holder app
Open request link via universal link
-
Holder app
SDK validates request and recipient
-
Holder app
User reviews claims and approves
-
Holder app → Kenshiki verifier
SDK signs and sends encrypted presentation
-
Kenshiki verifier
Verify claims, key proof and request binding
-
Kenshiki verifier → Holder app
Return completion URL with one-time code
-
Holder app → Browser
Open completion URL in browser
-
Browser → Access system
Return completion code to your service
-
Access system
Check originating browser visit
-
Access system → Kenshiki verifier
Consume verified result once, for this visit
-
Kenshiki verifier → Access system
Return checked claims and evidence
-
Access system
Link account and decide access
User approval stays in the holder app; the access decision stays with your service. Declining stops disclosure.
Planned cross-device flow. The request starts on the desktop. Approval and signing happen on the phone. Your service completes the original desktop request after checking the cross-device binding.
Your application · Browser
User’s phone · Holder app, Kenshiki SDK inside
Your service · relying party · Kenshiki verifier + Access system
-
Browser → Access system
Start identity request on the desktop
-
Access system → Kenshiki verifier
Create signed request bound to this visit
-
Kenshiki verifier → Browser
Return request for phone handoff
-
Browser → Holder app
Transfer the request to the holder app
-
Holder app
SDK validates request and recipient
-
Holder app
User reviews claims and approves
-
Holder app → Kenshiki verifier
SDK signs and sends encrypted presentation
-
Kenshiki verifier
Verify claims, key proof and request binding
-
Browser → Access system
Complete the original desktop request
-
Access system
Check cross-device and browser binding
-
Access system → Kenshiki verifier
Consume verified result once, for this visit
-
Kenshiki verifier → Access system
Return checked claims and evidence
-
Access system → Browser
Apply access rules and return result
The phone sends proof to your verifier. Access completes on the desktop that started the request. Cross-device binding must resist request forwarding; a request identifier alone is not sufficient.
Issue, hold, present, verify
01 · Issue from recorded evidence · Planned
The first-party holder app re-sends stored proofing values. The issuer compares keyed digests from proofing, binds the record to a holder key, signs and erases the values.
The planned issuance profile uses OpenID4VCI authorization code flow with PAR, PKCE and DPoP. The evidence identifies each recorded check, its source, outcome, policy mode and revision. Failed verification returns a typed error.
02 · Hold on the user’s device · Planned
The SDK keeps the signed record and holder-key reference in protected, instance-scoped storage. Private signing keys stay on the device. Key loss or invalidation requires re-issuance.
The host receives typed data to build its approval screen. It owns the wording and interaction; the SDK owns request validation and construction of the response.
03 · Request an approved disclosure · Planned
Your service requests specific claims. The holder app identifies the recipient and requested information, then asks the user to approve or decline. The response binds the disclosure to that request and recipient.
On the same iPhone, the browser opens the holder app through a universal link. The planned presentation profile uses OpenID4VP with an encrypted direct_post.jwt response to the verifier; completion returns to the original browser visit.
04 · Verify, then apply your access rules · Planned
The verifier checks issuer trust, signatures, holder-key proof, requested claims, recipient, freshness, status and replay protection. Your service binds completion to the app request or browser visit that initiated it.
Verified claims do not automatically identify an existing account. Your service defines account linking and access. Shared information may contain personal data; withdrawing permission cannot retract a disclosure already received.
Your service receives verified claims, the recorded check evidence and the time status was checked. It applies its own access rules to that result.
Choose your next integration step
Evaluate capture and evidence in an example app, or review the disclosure boundary before defining the claims your service needs.