Repositories
The FIDO4VC project is split across separate repositories under the fido4vc GitHub org, one per component. This page lists them with descriptions of role and integration relationships.
Walk-through of the full DID-creation → issuance → presentation flow against the Docker-Compose stack in fido4vc/demo.
Core components
Section titled “Core components”Upstream fork
Section titled “Upstream fork”How it fits together
Section titled “How it fits together”fido-vc-wallet-ui (Next.js, browser-side WebAuthn invocation) │ ├── HTTP ─► fido-vc-middleware │ │ ──── signer side ──── │ │ cryptosuite.canonicalize(unsignedVP) │ │ → derive WebAuthn challenge │ │ → wrap the resulting WebAuthn assertion as a │ │ DataIntegrityProof on the VP │ │ │ └── uses ──► fido-vc-cryptosuite-ts │ └── HTTP ─► waltid-identity (walt.id Wallet / Issuer / Verifier APIs) │ └── HTTP policy ──► fido-vc-verifier-sidecar │ ──── verifier side ──── │ cryptosuite.verify(signedVP) │ → recompute challenge │ → validate FIDO assertion │ against did:jwk pubkey │ └── uses ──► fido-vc-cryptosuite-tsThe cryptosuite is a single library used at both ends of the protocol:
- Signer side —
fido-vc-middlewarecallscryptosuite.canonicalize()to compute the WebAuthn challenge over a JCS-canonicalized VP. The middleware never signs anything itself; the FIDO authenticator does, and the middleware wraps the resulting assertion as aDataIntegrityProofwithcryptosuite="fido4vc-jcs-2026". - Verifier side —
fido-vc-verifier-sidecarcallscryptosuite.verify()to validate a signed VP: recomputes the expected challenge, confirms it matchesclientData.challenge, and verifies the FIDO signature against the public key resolved from the proof’sdid:jwk.
The Wallet UI itself never sees the cryptosuite — it uses @simplewebauthn/browser only to invoke WebAuthn in the browser.
Running locally
Section titled “Running locally”End-to-end orchestration lives in its own fido4vc/demo repo. By default it pulls all six prebuilt images from ghcr.io/fido4vc/* — no host JDK, Node toolchain, or Gradle build required. Cold pull is ~2–5 min depending on bandwidth.
git clone https://github.com/fido4vc/democd demodocker compose up -dWhat gets started (seven containers):
| Service | Port | Image |
|---|---|---|
| wallet-ui | 3000 | ghcr.io/fido4vc/fido-vc-wallet-ui |
| middleware | 8080 | ghcr.io/fido4vc/fido-vc-middleware |
| verifier-sidecar | 8081 | ghcr.io/fido4vc/fido-vc-verifier-sidecar |
| waltid-wallet-api | 7001 | ghcr.io/fido4vc/waltid-wallet-api |
| waltid-issuer-api | 7002 | ghcr.io/fido4vc/waltid-issuer-api |
| waltid-verifier-api | 7003 | ghcr.io/fido4vc/waltid-verifier-api |
| db | 3306 | mysql:8 (stores FIDO credential records) |
End-to-end demo flow:
- Open the Wallet UI at
http://localhost:3000, register, and sign in - Add a FIDO key via the DID tab (creates a
did:jwk:...) - Mint a credential offer with the walt.id Issuer API (
POST /openid4vc/jwt/issue) - Paste the offer URL into the Wallet UI Credentials → Receive Credential, complete the FIDO flow
- Mint a presentation request with the walt.id Verifier API (
POST /openid4vc/verify) - Paste the presentation URL into the Wallet UI, present with FIDO
- Verify the result via
GET /openid4vc/session/<state>— look for"verified": true
Need to hack on a component? Clone the sibling repos and run docker compose up -d --build instead — see the Build from source section of the demo README.
The demo README has the full curl payloads, troubleshooting matrix, and architecture diagram.
Licensing
Section titled “Licensing”All FIDO4VC component repositories are licensed under the Apache License 2.0. The walt.id fork inherits Apache-2.0 from upstream.
Where to next
Section titled “Where to next”- Architecture — how the pieces fit together
- Paper & Citation — the formal research paper