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.
+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 the Issuer or a Digital Credential is. Equally, a user might want to be informed about the trustworthiness of a Verifier before choosing to release credentials.
+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.
The DIIP v4 profile doesn’t require compliant implementations to support any trust establishment mechanism.
§ 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.
@@ -170,12 +171,16 @@ § 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.
+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 Transaction 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 the tx_code when using Pre-Authorized Code Flow.
+When the Issuer and the Authorization Server are separate entities, the OID4VCI specification lacks a standard mechanism for the Issuer to link a credential request back to its originating offer. To bridge this interoperability gap, DIIP mandates a specific flow using the issuer_state parameter and JWT-based Access Tokens.
+Requirement: DIIP-compliant Wallets MUST NOT assume the Authorization Server is on the same domain as the Issuer.
+Requirement: If the Authorization Server is a separate entity, then DIIP-compliant Issuers MUST include the issuer_state parameter in the Credential Offer during the Authorization Code Flow.
+Requirement: If the Authorization Server is a separate entity, then DIIP-compliant Authorization Servers MUST issue Access Tokens as JWTs, compliant with the JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens. The issuer_state value that it received via the Authorization Request from the Wallet MUST be included as a claim in the Access Token JWT.
+Requirement: If the Authorization Server is a separate entity, then DIIP-compliant Issuers MUST issue the pre-authorized_code as a JWT when using the Pre-Authorized Code Flow. This JWT MUST be signed by the Issuer and MUST contain the issuer_state as a claim. The Authorization Server MUST validate this JWT and then include the extracted issuer_state into the Access Token JWT it issues to the Wallet.
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.
+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.
@@ -184,7 +189,7 @@ § OID4VCI
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.
+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.
@@ -197,7 +202,7 @@ § 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, rhe Verifier may send an Authorization Request using either of these 3 options:
+According to OID4VP, the Verifier may send an Authorization Request using either of these 3 options:
- Passing as URL with encoded parameters
- Passing a request object as value
@@ -229,6 +234,8 @@ § Terminolo
- Agent
- A software application or component that an Issuer uses to issue Digital Credentials or that a Verifier uses to request and verify them.
+- Authorization Server
+- A software application or component that an Issuer uses to authorize the issuance of Digital Credentials to a Wallet. Authorization Servers in the context of OID4VCI can either be part of the Issuer's Agent or a separate entity that authorizes on behalf of the Issuer.
- Holder
- An entity that possesses or holds Digital Credentials and can present them to Verifiers.
- DID
@@ -271,6 +278,8 @@
-
-
Verifier Agents publishi the Verifier's Entity Configurations as specified in OIDF Wallet Architectures. (Simplified explanation: sign the OID4VP verifier metadata as a JWT and publish it in the .well-known path.)
+Verifier Agents publish the Verifier's Entity Configurations as specified in OIDF Wallet Architectures. (Simplified explanation: sign the OID4VP verifier metadata as a JWT and publish it in the .well-known path.)
-
If a Digital Credential contains a termsOfUse object with an attribute federations, a DIIP-compliant Wallet MUST warn the user before sharing Digital Credentials or Verifiable Presentations with a Verifier for which a trust chain cannot be resolved using the Trust Anchor in the value of the federations attribute.
@@ -362,15 +371,15 @@ § Referen
- Abstract
- Structure of this Document
- Goals
- Profile
diff --git a/spec/spec.md b/spec/spec.md
index f59fe59..1b0a7bc 100644
--- a/spec/spec.md
+++ b/spec/spec.md
@@ -9,6 +9,7 @@ Decentralized Identity Interop Profile v4
Editors:
~ [Eelco Klaver](https://www.linkedin.com/in/eklaver/) (Credenco)
~ [Harmen van der Kooij](https://www.linkedin.com/in/harmenvanderkooij/) (FIDES Labs)
+~ [Nander Stabel](https://www.linkedin.com/in/nanderstabel/) (Impierce Technologies)
~ [Niels Klomp](https://www.linkedin.com/in/niels-klomp/) (4Sure Technology Solutions)
~ [Niels van Dijk](https://www.linkedin.com/in/creativethings/) (SURF)
~ [Samuel Rinnetmäki](https://www.linkedin.com/in/samuel/) (Findynet)
@@ -147,17 +148,25 @@ OID4VCI [issuance flow variations](https://openid.net/specs/openid-4-verifiable-
In many situations, [[ref: Digital Credential]]s are issued on the [[ref: 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 ([[ref: PKCE]]) defines a way to mitigate against authorization code interception attack. Pushed authorization request ([[ref: 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.
+Authorization Code Flow provides a more advanced way of implementing credential issuance. Proof Key for Code Exchange ([[ref: PKCE]]) defines a way to mitigate against authorization code interception attack. Pushed authorization request ([[ref: PAR]]) allows clients to push the payload of an authorization request directly to the [[ref: 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 [[ref: Wallet]]s MUST NOT assume the Authorization Server is on the same domain as the [[ref: Issuer]].**
+When the [[ref: Issuer]] and the [[ref: Authorization Server]] are separate entities, the [[ref: OID4VCI]] specification lacks a standard mechanism for the [[ref: Issuer]] to link a credential request back to its originating offer. To bridge this interoperability gap, DIIP mandates a specific flow using the `issuer_state` parameter and JWT-based Access Tokens.
+
+**Requirement: DIIP-compliant [[ref: Wallet]]s MUST NOT assume the [[ref: Authorization Server]] is on the same domain as the [[ref: Issuer]].**
+
+**Requirement: If the [[ref: Authorization Server]] is a separate entity, then DIIP-compliant [[ref: Issuer]]s MUST include the `issuer_state` parameter in the Credential Offer during the *Authorization Code Flow*.**
+
+**Requirement: If the [[ref: Authorization Server]] is a separate entity, then DIIP-compliant [[ref: Authorization Server]]s MUST issue Access Tokens as JWTs, compliant with the [[ref: JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens]]. The `issuer_state` value that it received via the Authorization Request from the [[ref: Wallet]] MUST be included as a claim in the Access Token JWT.**
+
+**Requirement: If the [[ref: Authorization Server]] is a separate entity, then DIIP-compliant [[ref: Issuer]]s MUST issue the `pre-authorized_code` as a JWT when using the *Pre-Authorized Code Flow*. This JWT MUST be signed by the [[ref: Issuer]] and MUST contain the `issuer_state` as a claim. The [[ref: Authorization Server]] MUST validate this JWT and then include the extracted `issuer_state` into the Access Token JWT it issues to the [[ref: Wallet]].**
**Requirement: DIIP-compliant implementations MUST support [[ref: PKCE]] with Code Challenge Method Parameter `S256` to prevent authorization code interception attacks.**
-**Requirement: DIIP-compliant implementations MUST support [[ref: PAR]] with the [[ref: Issuer]]'s Authorization Server using `require_pushed_authorization_requests` set to `true` ensuring integrity and authenticity of the authorization request.**
+**Requirement: DIIP-compliant implementations MUST support [[ref: PAR]] with the [[ref: Issuer]]'s [[ref: 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](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#name-pre-authorized-code-flow-2) have been described in the [[ref: 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.
@@ -175,7 +184,7 @@ It should be noted that various [Security Considerations](https://openid.net/spe
[[ref: 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.
+The `scope` parameter is a light-weight way of using an external [[ref: Authorization Server]]. The `authorization_details` makes the flow much more configurable and structured. If an issuer agent does not support an external [[ref: Authorization Server]], the scope parameter is not needed.
**Requirement: DIIP-compliant [[ref: Wallet]]s MUST support the `authorization_details` parameter using the `credential_configuration_id` parameter in the Authorization Request.**
@@ -242,6 +251,9 @@ This section consolidates in one place common terms used across open standards t
[[def: Agent]]
~ A software application or component that an [[ref: Issuer]] uses to issue [[ref: Digital Credential]]s or that a [[ref: Verifier]] uses to request and verify them.
+[[def: Authorization Server]]
+~ A software application or component that an [[ref: Issuer]] uses to authorize the issuance of [[ref: Digital Credential]]s to a [[ref: Wallet]]. Authorization Servers in the context of [[ref OID4VCI]] can either be part of the [[ref: Issuer]]'s [[ref: Agent]] or a separate entity that authorizes on behalf of the [[ref Issuer]].
+
[[def: Holder]]
~ An entity that possesses or holds [[ref: Digital Credential]]s and can present them to [[ref: Verifier]]s.
@@ -298,6 +310,9 @@ This section consolidates in one place common terms used across open standards t
[[def: PKCE]]
~ [RFC 7636 Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636). Status: RFC - Proposed Standard.
+[[def: JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens]]
+~ [RFC 9068 JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens](https://datatracker.ietf.org/doc/html/rfc9068). Status: RFC - Proposed Standard.
+
[[def: SD-JWT VC]]
~ [SD-JWT-based Verifiable Credentials (SD-JWT VC) - draft 08](https://datatracker.ietf.org/doc/draft-ietf-oauth-sd-jwt-vc/08/). Status: WG Document.