Skip to content

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.

Tested (executable suite)
Credential issuance — OpenID4VCI 1.0, wallet roleAn 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.HolderNative shellRust coreSecure EnclaveIssuer1. credential offer (QR / deep link)2. CredentialOfferReceived + issuer cert chainTrust decision in-core: X.509 path → trusted-list anchorabort: IssuerNotTrusted3. Effect: RequestToken4. POST /token5. sender-bound token + c_nonce6. TokenReceivedGates: c_nonce fresh (replay set) · WUA attests device keyabort: proof key not attested7. Effect: Sign(proof-of-possession)8. sign (biometric gate)9. ES256 signature10. DeviceSignatureProduced11. Effect: RequestCredential(proof JWT)12. POST /credential13. SD-JWT VC (compact)14. CredentialReceivedValidate format + structure → store holding → audit logabort: UnsupportedFormat / CredentialInvalid
Credential issuance — sequence with security decisions.SVG artifact
Wallet core (this project)External partySecure hardwarePlanned / not yet integrated
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/oid4vci
  • abort_c_nonce_replayedcrates/oid4vci
  • abort_format_mismatch_on_responsecrates/oid4vci
  • unattested_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.