§ Decentralized Identity Interop Profile v5

Profile Status: Draft

Latest Release: https://FIDEScommunity.github.io/DIIP

Latest Draft: https://FIDEScommunity.github.io/DIIP/draft

Editors:
Eelco Klaver (Credenco)
Harmen van der Kooij (FIDES Labs)
Niels Klomp (4Sure Technology Solutions)
Niels van Dijk (SURF)
Samuel Rinnetmäki (Findynet)
Timo Glastra (Animo Solutions)
Contributors and previous editors:
Adam Eunson (Auvo)
Jelle Millenaar (Impierce Technologies)
Maaike van Leuken (TNO)
Thierry Thevenet (Talao)

§ Abstract

The Decentralized Identity Interop Profile, or DIIP for short, defines requirements against existing specifications to enable the interoperable issuance and presentation of Digital Credentials between Issuers, Holders, and Verifiers.

Purpose Specification
Credential format W3C VCDM 2.0 (20 March 2025) and SD-JWT VC (draft 13)
Signature scheme SD-JWT as specified in VC-JOSE-COSE (20 March 2025) and SD-JWT VC (draft 13)
Signature algorithm ES256 (RFC 7518 May 2015)
Identifying Issuers, Holders, and Verifiers did:jwk (Commit 8137ac4, Apr 14 2022) and did:web (31 July 2024)
Issuance protocol OpenID for Verifiable Credentials Issuance 1.0 (OID4VCI) (Final).
Presentation protocol OpenID for Verifiable Presentations 1.0 (OID4VP) (Final)
Revocation mechanism IETF Token Status List (Draft 13, 2025-11-11)
Trust Establishment OpenID Fed DCP (Appendix B of this profile)

The Normative References section links to the versions of specifications that DIIP-compliant implementations must support.

This document is not a specification but a profile. It outlines existing specifications required for implementations to interoperate with each other. It also clarifies mandatory features for the options mentioned in the referenced specifications.

The main objective of this profile is to allow for easy adoption and use the minimum amount of functionality for a working Digital Credential ecosystem.

§ Status of this Document

The Decentralized Identity Interop Profile v5 is approved by the FIDES Community on January 15th, 2026.

The latest published DIIP profile can be found at https://FIDEScommunity.github.io/DIIP/. The latest working group draft can be found athttps://FIDEScommunity.github.io/DIIP/draft.

§ Audience

The audience of this document includes organisations aiming to issue or verify Digital Credentials, as well as the implementers of Digital Credential solutions (Wallets and Agents).

§ Development of the DIIP Profile

Participate:
GitHub repo
File a bug
Commit history

The development of this interoperability profile is a collaborative process. Anyone can suggest new specifications and restrictions. The suggestions are reviewed by the community, and decisions are made through discussions.

Feel free to join the FIDES Community Discord to participate in the discussions.

There are also monthly DIIP meetings. Contact Harmen van der Kooij if you want to be invited to the meetings.

The authors intend to release new versions of the DIIP profile twice a year.

Some plans and ideas for the next version are documented in the Appendix A: Future Directions.

§ Structure of this Document

The Goals section explains the design of the DIIP profile.

The Profile section defines the requirements for compliant solutions and explains the choices.

The References section defines the specifications and their versions.

The Terminology section explains the key terms used in this profile.

§ Goals

The W3C VCDM specification defines a data model for Digital Credentials but does not prescribe standards for transport protocol, key management, authentication, query language, etc.

The (OID4VCI) and (OID4VP) protocols define the interaction between Wallets and Agents but don’t specify a data model or a credential format.

This interoperability profile makes selections by combining a set of specifications. It chooses standards for credential format, signature algorithm, identifying actors, and issuance and presentation protocols. Instead of saying, “We use W3C VCDM credentials signed with VC-JOSE-COSE using ES256 as the signature algorithm, OID4VCI as the issuance protocol, and OID4VP as the presentation protocol, and OpenID Federation for trust establishment”, you can just say, “We use DIIP v5”.

In addition, the DIIP profile makes selections within the specifications. When a standard allows multiple ways of implementing something, DIIP makes one of those ways mandatory. As an implementer, you don’t need to fully support all specifications to be DIIP-compliant. DIIP makes these choices to accelerate adoption and interoperability – defining the minimum required functionality.

DIIP does not exclude anything. For example, when DIIP says that compliant implementations MUST support did:jwk as an identifier of the Issuers, Holders, and Verifiers, it doesn’t say that other identifiers cannot be used. The Wallets and Agents can support other identifiers as well and still be DIIP-compliant.

Trust ecosystems can also easily extend DIIP by saying, “We use the DIIP v5 profile and allow mDocs as an additional credential format”. They can also switch requirements by saying, “We use the DIIP v5 profile but use VC-DATA-INTEGRITY as an embedded proof mechanism”.

The design goal for DIIP is to ensure interoperability between Wallets and Agents in cases where device binding of Digital Credentials is not required and the Wallet doesn’t need to be trusted. Issuing, holding, and presenting certifications, diplomas, licenses, permits, etc., fit into the scope of DIIP. Using a Wallet for strong customer authentication or for sharing Person Identification Data (PID) is out of DIIP’s scope, and you should look into HAIP instead.

§ Relationship to eIDAS Regulation and HAIP Profile

In the context of the European eIDAS regulation (eIDAS) and its Architecture and Reference Framework (ARF), the DIIP profile is a profile for “regular” digital credentials, “non-qualified electronic attestations of attributes”.

Wallets and Agents may support both DIIP and the OpenID4VC High Assurance Interoperability Profile (HAIP). HAIP is targeted for high-assurance use cases where it is important to bind the credentials to the Holder's private key (device binding). DIIP is the profile for other use cases.

The standards used in the DIIP profile are the same ones that the ARF uses, but DIIP makes different choices to HAIP in some areas where OID4VCI and OID4VP provide optionality.

While DIIP is a standalone profile and enables interoperability on it’s own, it is designed to build upon and integrate with the EUDI wallet. Therefore, DIIP implementers who want to integrate with the EUDI Wallet should support HAIP and the implementation regulations issued by the European Commission.

§ Profile

In this section, we describe the interoperability profile.

§ Credential Format

The W3C Verifiable Credential Data Model (W3C VCDM) defines structure and vocabulary well suited for Digital Credentials in DIIP’s scope. For example, the Open Badges 3 credentials use W3C VCDM as the data format.

The SD-JWT-based Verifiable Credentials specification (SD-JWT VC) defines a credential format that are serialized in JSON Web Tokens (JWTs) and enable selective disclosure. SD-JWT VC is used as a credential format for person identification data (PID) in HAIP and ARF (in addition to mDocs).

W3C VCDM recommends securing Verifiable Credentials using JOSE and COSE (VC-JOSE-COSE) as an enveloping proof mechanism and Verifiable Credential Data Integrity 1.0 (VC-DATA-INTEGRITY) as an embedded proof mechanism.

To keep things as simple as possible, DIIP requires implementations to use SD-JWT as the mechanism to secure also W3C VCDM-based credentials.

Requirement: DIIP-compliant implementations MUST support SD-JWT VC as a credential format.

Requirement: DIIP-compliant implementations MUST support W3C VCDM and more specifically Securing JSON-LD Verifiable Credentials with SD-JWT as specified in (VC-JOSE-COSE).

§ Signature Algorithm

The DIIP profile chooses one key type Secp256r1 and one signature method ES256 that all implementations must support.

Requirement: DIIP-compliant implementations MUST support ES256 (ECDSA using Secp256r1 curve and SHA-256 message digest algorithm).

§ Identifiers

DIIP prefers decentralized identifiers (DIDs) as identifiers. An entity identified by a DID publishes a DID Document, which can contain useful metadata about the entity, e.g., various endpoints. There are many DID methods defined. The DIIP profile requires support for two of them: did:jwk and did:web. In many use cases, organizations are identified by did:web, and the natural persons are identified by did:jwk.

Requirement: DIIP-compliant implementations MUST support did:jwk and did:web as the identifiers of the Issuers, Holders, and Verifiers.

§ Trust Establishment

Signatures in Digital Credentials can be used to verify that the content of a credential has not been tampered with. But anyone can sign a credential and put anything in the issuer field. Digital Credential ecosystems require that there is a way for a Verifier to check who is the Issuer of a Digital Credential. Equally, a user might want to be informed about the trustworthiness of a Verifier before choosing to share credentials.

DIIP enables trust ecosystems to use OpenID Fed DCP – a light-weight profile of the OpenID Federation, authored for use cases including Agents, Wallets and Digital Credentials. The OpenID Fed DCP specification is an appendix to this version of the DIIP profile. In the future, the OpenID Fed DCP profile will probably be donated to be maintained elsewhere.

The requirements regarding Trust Establishment are OPTIONAL in DIIP v5.

Requirement: DIIP-compliant Issuer Agents MUST support publishing OpenID Federation Entity Configuration as defined in OpenID Fed DCP.

Requirement: DIIP-compliant Issuer Agents MUST support issuing the fed claim as defined in OpenID Fed DCP when issuing SD-JWT VC credentials.

Requirement: DIIP-compliant Issuer Agents MUST support issuing the termsOfUse attribute as defined in OpenID Fed DCP when issuing W3C VCDM credentials.

Requirement: DIIP-compliant Verifier Agents MUST support publishing OpenID Federation Entity Configuration as defined in OpenID Fed DCP.

§ Issuance

The issuance of Digital Credentials from the Issuer to the Holder's Wallet is done along the OID4VCI specification. Other protocols exist, but OID4VCI is very broadly supported and also required by HAIP.

§ OID4VCI

OpenID for Verifiable Credential Issuance (OID4VCI) defines an API for the issuance of Digital Credentials. OID4VCI issuance flow variations leave room for optionality.

In many situations, Digital Credentials are issued on the Issuer's online service (website). This online service may have already authenticated and authorized the user before displaying the credential offer. Another authentication or authorization is not needed in those situations.

Authorization Code Flow provides a more advanced way of implementing credential issuance. Proof Key for Code Exchange (PKCE) defines a way to mitigate against authorization code interception attack. Pushed authorization request (PAR) allows clients to push the payload of an authorization request directly to the authorization server. These features may be needed in higher assurance use cases or for protecting privacy.

Requirement: DIIP-compliant implementations MUST support both Pre-Authorized Code Flow and Authorization Code Flow.

Requirement: DIIP-compliant implementations MUST support the tx_code when using Pre-Authorized Code Flow.

Requirement: DIIP-compliant Wallets MUST NOT assume the Authorization Server is on the same domain as the Issuer.

Requirement: DIIP-compliant implementations MUST support PKCE with Code Challenge Method Parameter S256 to prevent authorization code interception attacks.

Requirement: DIIP-compliant implementations MUST support PAR with the Issuer's Authorization Server using require_pushed_authorization_requests set to true ensuring integrity and authenticity of the authorization request.

It should be noted that various Security Considerations have been described in the OID4VCI specification with respect to implementing Pre-Authorized Code Flow. Parties implementing DIIP are strongly suggested to implement mitigating measures, like the use of a Transaction Code.

OID4VCI defines Wallet-initiated and Issuer-initiated flows. Wallet-initiated means that the Wallet can start the flow without any activity from the Issuer. The Issuer-initiated flow seems to be more common in many use cases and seems to be supported more widely. It also aligns better with the use cases where the Holder is authenticated and authorized in an online service before the credential offer is created and shown.

Requirement: DIIP-compliant implementations MUST support the Issuer-initiated flow.

OID4VCI defines Same-device and Cross-device Credential Offer. People should be able to use both their desktop browser and their mobile device’s browser when interacting with the Issuer's online service.

Requirement: DIIP-compliant implementations MUST support both Same-device and Cross-device Credential Offer.

OID4VCI defines Immediate and Deferred flows. Deferred is more complex to implement and not required in most use cases.

Requirement: DIIP-compliant implementations MUST support the Immediate flow.

OID4VCI states that there are two possible methods for requesting the issuance of a specific credential type in an Authorization Request: either by utilizing the authorization_details parameter or by utilizing the scope parameter.

The scope parameter is a light-weight way of using an external authorization server. The authorization_details makes the flow much more configurable and structured. If an issuer agent does not support an external authorization server, the scope parameter is not needed.

Requirement: DIIP-compliant Wallets MUST support the authorization_details parameter using the credential_configuration_id parameter in the Authorization Request.

Requirement: DIIP-compliant Wallets MUST support the scope parameter in the Authorization Request.

Requirement: DIIP-compliant Issuer Agents MUST support the authorization_details parameter in the Authorization Request.

OID4VCI defines proof types jwt, ldp_vp, and attestation for binding the issued credential to the identifier of the end-user possessing that credential. DIIP requires compliant implementations to support did:jwk as an identifier. Thus, in cases where cryptographic holder-binding is needed, implementations should be able to bind a credential to the Holder's did:jwk.

Requirement: DIIP-compliant implementations MUST support the jwt proof type with a did:jwk or did:web as the iss value and use a kid from the assertionMethod Verification Method relationship of the respective Issuer's DID document.

Requirement: DIIP-compliant implementations MUST support a cnf holder binding claim in the Issuer's jwt and it MUST include a kid value from the authentication Verification Method relationship of the respective Holder's DID document.

§ Presentation

The presentation of claims from the Holder's Wallet to the Verifier is done along the OID4VP. Other protocols exist, but OID4VP is very broadly supported and also required by HAIP.

§ OID4VP

Using OID4VP, the Holders can also present cryptographically verifiable claims issued by third-party Issuers, such that the Verifier can place trust in those Issuers instead of the subject (Holder).

OID4VP supports scenarios where the Authorization Request is sent both when the Verifier is interacting with the Holder using the device that is the same or different from the device on which requested Digital Credentials are stored.

Requirement: DIIP-compliant implementations MUST support both Same-device Flow and Cross-device Flow.

According to OID4VP, the Verifier may send an Authorization Request using either of these 3 options:

DIIP only requires support for the last option. Requirement: DIIP-compliant implementations MUST support passing the Authorization Request object by reference.

OID4VP defines two values for the request_uri_method in the Authorization Request: get and post. DIIP requires support for only the get method.

Requirement: DIIP-compliant implementations MUST support the get value for the request_uri_method in the Authorization Request.

OID4VP defines many Client Identifier Schemes. One way to identify Verifiers is through OpenID Federation. Since DIIP uses DIDs, it is natural to require support for the corresponding Client Identifier Scheme.

Requirement: DIIP-compliant implementations MUST support the did Client Identifier Scheme.

The following features of OID4VP are not required by this version of the DIIP profile:

§ Validity and Revocation Algorithm

Expiration algorithms using validFrom and validUntil are a powerful mechanism to establish the validity of credentials. Evaluating the expiration of a credential is much more efficient than using revocation mechanisms. While the absence of validFrom and validUntil would suggest a credential is considered valid indefinitely, it is recommended that all implementations set validity expiration whenever possible to allow for clear communication to Holders and Verifiers.

Requirement: DIIP-compliant implementations MUST support checking the validity status of a Digital Credential using validFrom and validUntil when they are specified.

The IETF Token Status List defines a mechanism, data structures, and processing rules for representing the status of Digital Credentials (and other “Tokens”). The statuses of Tokens are conveyed via a bit array in the Status List. The Status List is embedded in a Status List Token.

The Bitstring Status List is based on the same idea as the IETF Token Status List and is simpler to implement since it doesn’t require signing of the status list. The IETF Token Status List may gain more support since it is recommended by HAIP.

Requirement: DIIP-compliant implementations MUST support IETF Token Status List as a status list mechanism.

§ Terminology

This section consolidates in one place common terms used across open standards that this profile consists of. For the details of these, as well as other useful terms, see the text within each of the specifications listed in References.

Agent
A software application or component that an Issuer uses to issue Digital Credentials or that a Verifier uses to request and verify them.
Holder
An entity that possesses or holds Digital Credentials and can present them to Verifiers.
DID
Decentralized Identifier as defined in DID Core.
Issuer
A role an entity can perform by asserting claims about one or more subjects, creating a Digital Credential from these claims, and transmitting the Digital Credential to a Holder, as defined in W3C VCDM.
Digital Credential
A set of one or more Claims made by an Issuer that is tamper-evident and has authorship that can be cryptographically verified.
Verifier
An entity that requests and receives one or more Digital Credentials for processing.
Wallet
A software application or component that receives, stores, presents, and manages credentials and key material of an entity.

§ References

§ Normative References

did:jwk
did:jwk Method Specification. Status: Draft.
did:web
did:web Method Specification. Status: Unofficial working group draft.
ES256
ECDSA using P-256 (Secp256r1) and SHA-256 as specified in RFC 7518 JSON Web Algorithms (JWA). Status: RFC - Proposed Standard.
IETF Token Status List
Token Status List - draft 13. Status: Internet-Draft.
OID4VCI
OpenID for Verifiable Credential Issuance 1.0. Status: Final.
OID4VP
OpenID for Verifiable Presentations 1.0. Status: Final.
OpenID Federation
OpenID Federation 1.0 - draft 42. Status: draft.
OpenID Fed DCP
OpenID Federation Digital Credentials Profile - draft 0.1.0. Status: draft.
PAR
RFC 9126 Pushed Authorization Requests. Status: RFC - Proposed Standard.
PKCE
RFC 7636 Proof Key for Code Exchange by OAuth Public Clients. Status: RFC - Proposed Standard.
SD-JWT VC
SD-JWT-based Verifiable Credentials (SD-JWT VC) - draft 13. Status: WG Document.
Secp256r1
Secp256r1 curve in RFC 5480 ECC SubjectPublicKeyInfo Format. Status: RFC - Proposed Standard.
This curve is called P-256 in RFC 7518 JSON Web Algorithms (JWA). Status: RFC - Proposed Standard.
W3C VCDM
Verifiable Credentials Data Model v2.0. Status: W3C Proposed Recommendation.
VC-JOSE-COSE
Securing Verifiable Credentials using JOSE and COSE. Status: W3C Proposed Recommendation.

§ Non-Normative References

ARF
Architecture and Reference Framework. Status: Draft.
Bitstring Status List
Bitstring Status List v1.0. Status: W3C Proposed Recommendation.
DID Core
Decentralized Identifiers (DIDs) v1.0. Status: W3C Recommendation.
eIDAS
Regulation (EU) No 910/2014 of the European Parliament and of the Council of 23 July 2014 on electronic identification and trust services for electronic transactions in the internal market and repealing Directive 1999/93/EC. Status: In force.
HAIP
OpenID4VC High Assurance Interoperability Profile. Status: Draft.
JWT
RFC 7519 JSON Web Token (JWT). Status: RFC - Proposed Standard.
Open Badges 3
Open Badges Specification, Spec Version 3.0, Document Version 1.2. Status: This document is made available for adoption by the public community at large.
VC-DATA-INTEGRITY
Verifiable Credential Data Integrity 1.0. Status: W3C Proposed Recommendation.

§ Appendix A: Future Directions

§ Identifiers

A near-future version of DIIP will probably require support for did:webvh instead of did:web.

§ Trust Establishment

The next version of the DIIP profile will likely require also Wallets to support OpenID Federation.

§ Digital Credentials API

DC API is a new W3C specification. The next versions of the DIIP protocol will most likely require compliant solutions to support DC API.

§ References

DC API
Digital Credentials. Status: Draft Community Group Report.
did:webvh
The did:webvh DID Method v0.5. Status: CURRENT STABLE.

§ Appendix B: OpenID Federation Digital Credentials Profile

§ Introduction

This specification profiles OpenID Federation for use with digital credentials, specifically focusing on credential issuance via OpenID for Verifiable Credential Issuance (OID4VCI) and credential presentation via OpenID for Verifiable Presentations (OID4VP).

The profile simplifies federation usage by limiting scope to trust chain resolution and metadata discovery, while omitting more complex features such as federation policies and trust marks.

§ Scope

This profile applies to:

This profile does not apply to and does not require conforming implementations to support:

of OpenID Federation.

§ Terminology

This specification uses the terms defined in OpenID Federation, OID4VCI, OID4VP, and SD-JWT VC.

Entity Identifier: As defined in OpenID Federation, a URL that uniquely identifies a federation entity.

Entity Configuration: As defined in OpenID Federation, a signed JWT published at the Entity Identifier’s /.well-known/openid-federation endpoint containing metadata and authority hints.

Trust Chain: As defined in OpenID Federation, a sequence of Entity Statements from a Leaf Entity through intermediate entities to a Trust Anchor.

Issuer: The role of the entity issuing credentials as defined in W3C VCDM

Credential Issuer: The technical service used to issue credentials as defined in OID4VCI

Verifier: The entity that requests, receives, and validates Presentations as defined in OID4VCI. Note that this specification does not distinguish the role and the technical service of the verifier the same way it does for Issuer and Credential Issuer. For the purposes of this specification Verifier may refer to either the role or the technical service. (Thus, the reference to the definition in OID4VCI and not the one in OID4VP.)

§ Credential Issuance

§ Entity Identifier

Requirement: The Credential Issuer MUST use the value of the credential_issuer in its OID4VCI issuer metadata as its Entity Identifier.

The Credential Issuer’s Entity Configuration can be found using the method described in the chapter 9 of OpenID Federation.

§ Issuer Metadata Publication

Requirement: The Credential Issuer MUST place the OpenID4VCI issuer metadata into the Entity Configuration, in the openid_credential_issuer Entity Type Identifier.

Requirement: If the openid_credential_issuer Entity Type Identifier is found in the Entity Configuration, the Wallet MUST use only this medatada and ignore the regular issuer metadata published in the well-known location defined in OID4VCI.

Requirement: The Credential Issuer MUST place the public key material of the keys it uses to sign Digital Credentials in the jwks property of the vc_issuer Entity Type Identifier using the syntax specified in the chapter 5.2.1. of the OpenID Federation.

Requirement: The Credential Issuer MUST include the federation_entity Entity Type Identifier with the display_name property in the Entity Configuration.

The Credential Issuer MAY place additional metadata into the federation_entity Entity Type Identifier.

Requirement: The Wallet MUST use the value of the display_name property in the federation_entity Entity Type Identifier when showing information about the Credential Issuer to the user of the Wallet.

§ Example: Credential Issuer Entity Configuration

The following JSON document is a non-normative example of the decoded payload of a Credential Issuer’s Entity Configuration.

{
  "iss": "https://credential-issuer.example",
  "sub": "https://credential-issuer.example",
  "iat": 1616239022,
  "exp": 1616239322,
  "metadata": {
    "federation_entity": {
      "display_name": "Example Issuer",
      "logo_uri": "https://credential-issuer.example/logo.png",
      "organization_name": "Example Credential Issuer",
      "contacts": ["support@credential-issuer.example"]
    },
    "openid_credential_issuer": {
      "issuer": "https://credential-issuer.example",
      "display": [
        {
          "name": "Example Issuer",
          "locale": "en-US",
          "logo": {
            "uri": "https://credential-issuer.example/logo.png",
            "alt_text": "Example Logo"
          }
        }
      ],
      "credential_issuer": "https://credential-issuer.example",
      "authorization_endpoint": "https://credential-issuer.example/authorize",
      "authorization_servers": ["https://credential-issuer.example/authorize"],
      "credential_endpoint": "https://credential-issuer.example/credential",
      "credential_configurations_supported": {
        "sd_jwt_vc_example": "..."
      }
    },
    "vc_issuer": {
      "jwks": [
        {
          "kty": "EC",
          "kid": "MJ2BW-rNshp9sjh3SvwnBIkEsYsU92xVtC3-Fv_lcKc",
          "alg": "ES256",
          "crv": "P-256",
          "x": "JTEE5QghmkA_-7_pZoKIluRzGNvQGtzmpNvb_nAswhE",
          "y": "A_iBfIseHsdfE7CmI3lIYtKMdfyXXOIpPX_o6O0h0wY",
          "use": "sig"
        }
      ]
    }
  },
  "jwks": [
    {
      "kty": "EC",
      "kid": "MJ2BW-rNshp9sjh3SvwnBIkEsYsU92xVtC3-Fv_lcKc",
      "alg": "ES256",
      "crv": "P-256",
      "x": "JTEE5QghmkA_-7_pZoKIluRzGNvQGtzmpNvb_nAswhE",
      "y": "A_iBfIseHsdfE7CmI3lIYtKMdfyXXOIpPX_o6O0h0wY",
      "use": "sig"
    }
  ],
  "authority_hints": [
    "https://trustregistry.example"
  ]
}

The JWKS in the vc_issuer Entity Type Identifier contains information about the keys used to sign Digital Credentials. The JWKS on the root level of the Entity Configuration contains information about the key used to sign the Entity Configuration. In the example, the same key is used, but the keys MAY be different.

§ SD-JWT VC Credentials

Requirement: When the Issuer issues credentials in the SD-JWT VC format, the Issuer MUST place its Entity Identifier in the fed claim of the credential.

§ Example: SD-JWT VC with Federation Claim

The following non-normative example shows a decoded payload of an SD-JWT VC credential with the fed claim:

{
  "iss": "https://credential-issuer.example",
  "fed": "https://credential-issuer.example",
  "iat": 1683000000,
  "exp": 1883000000,
  "vct": "https://credentials.example.com/identity_credential",
  "is_over_65": true,
  "address": {
    "street_address": "123 Main St",
    "locality": "Anytown",
    "region": "Anystate",
    "country": "US"
  }
}

§ W3C VCDM Credentials

Requirement: When the Issuer issues credentials in the W3C VCDM format, the Issuer MUST place a termsOfUse property into the credential. The type of this termsOfUse property MUST be the string OpenIDFederation and the policyId MUST be the Issuer’s Entity Identifier.

§ Example: W3C VCDM Credential with termsOfUse

The following non-normative example illustrates the use of the termsOfUse property:

{
  "@context": [
    "https://www.w3.org/ns/credentials/v2"
  ],
  "id": "urn:uuid:c65d364e-2560-4e08-be03-9c3d944d609d",
  "type": [
    "VerifiableCredential"
  ],
  "issuer": "did:web:credential-issuer.example",
  "validFrom": "2025-12-01T00:00:00Z",
  "validUntil": "2028-12-31T23:59:59Z",
  "credentialSubject": {
  },
  "termsOfUse": {
    "type": "OpenIDFederation",
    "trustFramework": "Example Federation",
    "policyId": "https://credential-issuer.example"
  }
}

§ Note on Credential Issuer vs. Issuer

The Issuer defined in the digital credential (the value of the iss claim in SD-JWT VC credentials or the value of the id of the issuer property in W3C VCDM credentials) is not necessarily the same entity as the Credential Issuer defined in the property credential_issuer in the OID4VCI metadata.

For example, the OpenID Federation Entity Identifier of the Issuer of the credential could be https://university-of-utopia.example.edu and the OpenID Federation Entity Identifier of the Credential Issuer could be https://credentials.ministryofeducation.example.edu.

If the Issuer chooses to make this kind of distinction between the entity issuing the credential and the technical service used for issuance, it is RECOMMENDED that the Entity Configuration of the technical service has an authority_hints value pointing to the Issuer’s Entity Identifier and the Issuer publishes a Subordinate Statement about the technical service.

§ Credential Presentation and Verification

§ Client Identifier Scheme

Requirement: The Verifier MUST use the openid_federation: prefix as defined in OID4VP Section 5.9.3.

§ Verifier Metadata Publication

Requirement: The Verifier MUST place verifier metadata into the Entity Configuration, in the openid_credential_verifier Entity Type Identifier.

Requirement: The Verifier MUST include the federation_entity Entity Type Identifier with the display_name property in the Entity Configuration.

The Verifier MAY place additional metadata into the federation_entity Entity Type Identifier.

Requirement: The Wallet MUST use the value of the display_name property in the federation_entity Entity Type Identifier when showing information about the Verifier to the user of the Wallet.

§ Trust Establishment

Requirement: To establish trust with the Issuer (ensure that the Issuer can be trusted), the Verifier MUST resolve the Trust Chain from the Issuer’s Entity Configuration until it finds a Federation Entity it trusts. Requirement: The Verifier MUST verify that the credential is signed with a key included in the vc_issuer metadata in the Entity Configuration of the Issuer. The jwks property in the vc_issuer must contain a key with the kid value equal to the kid header in the SD-JWT VC credential.

§ Example: Verifier Entity Configuration

The following JSON document is a non-normative example of the decoded payload of a Verifier’s Entity Configuration.

{
  "iss": "https://credential-verifier.example",
  "sub": "https://credential-verifier.example",
  "iat": 1616239023,
  "exp": 1616239323,
  "metadata": {
    "federation_entity": {
      "display_name": "Example Credential Verifier",
      "logo_uri": "https://credential-verifier.example/logo.png",
      "organization_name": "Example Credential Verifier",
      "contacts": ["support@credential-verifier.example"]
    },
    "openid_credential_verifier": {
      "jwks": {
        "keys": [
          {
            "kty": "EC",
            "crv": "P-256",
            "x": "f83OJ3D2xF4Z1s3QpLQe4qVb8K7q6y1v3z4Yb6k9J0",
            "y": "x_FEzRu9q3u4bWz5n9X2L4q1U8T7c6v5s2d1a0b3C4",
            "alg": "ES256",
            "use": "enc",
            "kid": "ec-key-1"
          }
        ]
      },
      "encrypted_response_enc_values_supported": [
        "A128GCM",
        "A192GCM",
        "A256GCM"
      ],
      "vp_formats_supported": {
        "dc+sd-jwt": {
          "sd-jwt_alg_values": ["ES256"],
          "kb-jwt_alg_values": ["ES256"]
        }
      }
    }
  },
  "jwks": [
    {
      "kty": "EC",
      "kid": "y4nC8uTvcM5uJxOIvUqFjXb2EA6xPGdnt8zvjW94m6U",
      "alg": "ES256",
      "crv": "P-256",
      "x": "K6dA9ayt4P8xBN6SFiCZYOI2qeaFda7VV5wnmHWcl7w",
      "y": "CdE30dUX0geK4NL8IMC9u-rRMOLC9WaScJIGK5rxtKI"
    }
  ],
  "authority_hints": [
    "https://trustregistry.example"
  ]
}

§ Subordinate Statements

Intermediaries and Trust Anchors MAY authorize their subordinates to issue or request certain credential types by placing metadata values like openid_credential_issuer.credential_configurations_supported or openid_credential_verifier.dcql_query in the Subordinate Statements.

The meaning of such statements SHOULD be specified in ecosystem rulebooks and are out of the scope of this specification.

Table of Contents
undefined