Journeys
What the identity runtime does across regulated wallet profiles, national identity systems, and delegated agents.
Protocol journeys
Exact roles, exact profiles — never “OpenID compliant”.
The implementation role is the wallet. OpenID4VCI 1.0 is the OAuth-protected issuance API; OpenID4VP 1.0 is the presentation mechanism — each journey below names its standards, the security decision at every step, the negative cases that are tested, and where the evidence lives.
Wallet role in OpenID4VCI 1.0 (pre-authorized + authorization-code with PAR/PKCE)
An issuer offer starts a fresh issuance session. The core decides issuer trust against the operator-signed trusted list, requires a sender-bound token and a fresh c_nonce, gates on the Wallet Unit Attestation binding the device key, has the Secure Enclave sign the proof-of-possession, validates the returned credential's structure, and stores it as a holding — recorded in the audit log.
Text description of this diagram
An issuer's credential offer reaches the shell (QR or deep link) and is fed to the core with the issuer's certificate chain. The core decides issuer trust by X.509 path validation to a PID/attestation anchor on the operator-signed trusted list; an untrusted issuer aborts. The shell exchanges the token (sender-bound, fresh c_nonce); the core refuses to sign the proof-of-possession unless the Wallet Unit Attestation binds the device key; the Secure Enclave signs; the credential response is validated for format and structure, stored as a holding, and the issuance is recorded in the audit log.
Security decisions
- Offer received. Issuer trust = X.509 path validation to PID/attestation anchors, in-core.
- Grant selection. Only HAIP-allowed grants; auth-code path requires PAR + PKCE S256.
- Token. Must be sender-bound; c_nonce must be fresh (replay set).
- Proof of possession. Refused unless the WUA attests the device key at the required level; key never leaves the enclave.
- Credential response. Format must match the request; structure must parse; only then stored.
Negative cases tested
abort_untrusted_issuercrates/oid4vciabort_c_nonce_replayedcrates/oid4vciabort_format_mismatch_on_responsecrates/oid4vciunattested_proof_key_is_rejected_in_corecrates/wallet-core/tests/e2e_issuance.rs
Standards & evidence
- OpenID4VCI 1.0
- HAIP 1.0 (guard subset)
- SD-JWT VC
- WUA (EUDI TS)
- Live-TCP lifecycle E2E (issue → hold → present)
crates/shell-io/tests/e2e_live_lifecycle.rs - Lean IssuanceModel (4 safety properties)
formal/lean/IssuanceModel.lean - Tamarin oid4vci_issuance (4 lemmas)
formal/tamarin/oid4vci_issuance.spthy
Honest scope Machine + wire flow tested in-repo including over live TCP. On-device orchestration against a real external issuer (browser/eID step, metadata-driven endpoints, mso_mdoc formats) is in progress.