0.40.0-beta.0 ships a TIGHT minimal subset so the package can issue SD-JWT VCs to a wallet via OpenID4VCI's pre-authorized_code flow. That alone is enough for the "ID card you can store in your wallet" use case that's the most-requested first-step.
The full G6 scope is deliberately spread across several betas because each piece is a distinct spec family. This file captures what's shipped, what's deferred, and the order to add the rest.
- SD-JWT VC primitives (
src/vc/sdJwt.ts) — draft-ietf-oauth-sd-jwt-vc + draft-ietf-oauth-selective-disclosure-jwtissueSdJwtVc({base, selective, signingKey, holderJwk?})— encodes selective claims as salted hashes (_sd), emits the<jwt>~<disclosure1>~<disclosure2>~form with optionalcnfholder bindingparseSdJwtVc(token)— splits the~form, decodes the JWT payload + disclosurespresentSdJwtVc(parsed, claimNames)— drops disclosures the holder doesn't want to revealverifySdJwtVc({token, issuerPublicJwk})— verifies issuer signature, rehashes disclosures against_sd, returns{protectedClaims, disclosedClaims, cnf?}
- OpenID4VCI issuer-side routes (
src/oidc/vci.ts)GET /.well-known/openid-credential-issuer— issuer metadata +credential_configurations_supportedPOST /vci/credential— issues an SD-JWT VC for an authorized access token; cnf-binds via the wallet'sproof.jwtif suppliedPOST /vci/nonce— issues a fresh c_nonce for wallet proof-of-possessionurn:ietf:params:oauth:grant-type:pre-authorized_codeon/oauth2/token
- Stores — in-memory + Postgres for
CredentialOffer+CredentialNonce - Discovery — issuer metadata advertises
credential_configurations_supported+ pre-authorized_code grant - Tests — SD-JWT round-trips, OID4VCI happy path, c_nonce binding, tamper detection
- OpenID for Verifiable Presentations (OID4VP) — verifier side
POST /vp/authorize— initiate a presentation request with DIF Presentation DefinitionPOST /vp/response— acceptvp_token+presentation_submission, verify, surface to consumer hookonVerifiedPresentation({verifiedClaims, holderJwk})- Same-device (cross-domain redirect) + cross-device (QR / deeplink) modes
- SIOPv2
id_tokenmode (legacy compatibility)
- Status mechanism — Bitstring Status List (draft-ietf-oauth-status-list)
/vc/status/:listIdendpoint serving the status list as a signed JWTrevokeVcCredential(jti)operation that flips the bitverifySdJwtVchonorsstatusclaim when present
- Additional credential formats
- JWT-VC (W3C VC Data Model 2.0 JSON-LD form via JWT envelope)
- mdoc / ISO 18013-5 (mobile driver's license format) — needs CBOR + COSE primitives
- Authorization Code flow for VCI (in addition to pre-authorized_code) — for in-band consent UX where the wallet drives login
- Key attestation —
attestation_jwtproof type so the wallet proves its key lives in a secure enclave - Trust frameworks — EUDIW trust list lookup, OID Federation 1.0 (= G10) for cross-issuer trust
- Postgres status store + multi-tenant status list partitioning
- DPoP-bound credential delivery — the credential is bound to the wallet's DPoP key in addition to the cnf JWK
- Wallet implementation — out of scope; the package issues + verifies, the wallet is the user's app
- Real ARF (EU Architecture Reference Framework) trust list integration — punt until an EU consumer asks
- LD-Proof JSON-LD VCs — superseded by SD-JWT VC + mdoc in practice; the W3C VC DM 2.0 secure-by-default formats are what wallets implement
- SD-JWT VC:
draft-ietf-oauth-sd-jwt-vc-09(2025-06) - SD-JWT:
draft-ietf-oauth-selective-disclosure-jwt-13(2025-05) - OpenID4VCI:
openid-4-verifiable-credential-issuance-1_0-ID2(final 2025-09) - OpenID4VP:
openid-4-verifiable-presentations-1_0-ID3(final 2025-09) - Bitstring Status List:
draft-ietf-oauth-status-list-12(2025-04) - W3C VC Data Model 2.0:
vc-data-model-2.0(W3C Rec 2025-05) - EUDI ARF:
eu-digital-identity-wallet/eudi-doc-architecture-and-reference-framework
Issuer-first because (a) most "first VC use case" inquiries are "I want to issue a credential the user can hold in their wallet," (b) it's the simpler half (the issuer always knows the schema; the verifier has to handle arbitrary presentations), and (c) it composes cleanly on top of the existing OIDC provider — pre-authorized_code is just another grant type, the credential endpoint is just another protected route.
OID4VP (verifier) follows because the consumer can rehearse the protocol against their own issuer in beta.0, then accept presentations in beta.1. Status mechanism rides with verifier because "I issued it and can revoke it" is the same operation pair.