Skip to content

Commit f3a4b64

Browse files
authored
244 reissuance in cs01 (#257)
* Add re-issuance chapter to CS01 (closes #244) * Update conformance-specs/cs-01-credential-issuance.md * Fix: Indentation issues when merging * Fix: Add George Fourtounis to contributors list Added George Fourtounis from Grnet, Greece to the contributors list.
1 parent c1cd3a7 commit f3a4b64

1 file changed

Lines changed: 125 additions & 34 deletions

File tree

conformance-specs/cs-01-credential-issuance.md

Lines changed: 125 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
# WE BUILD - Conformance Specification: Credential Issuance
22

33
Version 1.1
4-
Date: 15 July 2026
4+
Date: 03 August 2026
5+
6+
**Revision history**
7+
8+
* Version 1.2 (15 July 2026): Added the re-issuance chapter, resolving issue [#244](https://github.com/webuild-consortium/wp4-architecture/issues/244).
9+
* Version 1.1 (10 July 2026): Added the pre-authorised code-flow to support payments
10+
* Version 1.0 (28 November 2025): Initial version.
511

612
**Authors / Contributors**: WP4 Architecture
713

@@ -11,6 +17,7 @@ Date: 15 July 2026
1117
* Nikolaos Triantafyllou, University of Aegean, Greece
1218
* Malin Norlander, Bolagsverket, Sweden
1319
* Tomasz Blachowicz, Mastercard, Poland
20+
* George Fourtounis, Grnet, Greece
1421

1522
Table Of Contents
1623

@@ -38,6 +45,10 @@ Table Of Contents
3845
- [6.2.6 Token request (Pre-Authorised Code grant)](#626-token-request-pre-authorised-code-grant)
3946
- [6.2.7 Credential Request, validation and storage](#627-credential-request-validation-and-storage)
4047
- [6.3 Deferred Credential Request](#63-deferred-credential-request)
48+
- [6.4 Re-issuance Flow](#64-re-issuance-flow)
49+
- [6.4.1 Re-issuance triggers](#641-re-issuance-triggers)
50+
- [6.4.2 Re-issuance using the Refresh Token grant](#642-re-issuance-using-the-refresh-token-grant)
51+
- [6.4.3 Fallback to the full authorisation flow](#643-fallback-to-the-full-authorisation-flow)
4152
- [7. Normative Requirements](#7-normative-requirements)
4253
- [7.1 Common requirements (WU and Issuer)](#71-common-requirements-wu-and-issuer)
4354
- [7.2 Credential Offer](#72-credential-offer)
@@ -46,14 +57,15 @@ Table Of Contents
4657
- [7.5 Credential Endpoint](#75-credential-endpoint)
4758
- [7.6 Deferred Credential Endpoint](#76-deferred-credential-endpoint)
4859
- [7.7 Server Metadata](#77-server-metadata)
60+
- [7.8 Re-issuance](#78-re-issuance)
4961
- [8. Interface Definitions](#8-interface-definitions)
5062
- [8.1 WU Invocation Interface](#81-wu-invocation-interface)
5163
- [8.2 Credential Offer Interface](#82-credential-offer-interface)
5264
- [8.3 PAR Endpoint](#83-par-endpoint)
5365
- [8.4 Token Endpoint](#84-token-endpoint)
5466
- [8.5 Credential Endpoint](#85-credential-endpoint)
55-
- [8.7 Deferred Credential Endpoint](#87-deferred-credential-endpoint)
56-
- [8.8 Metadata Endpoints](#88-metadata-endpoints)
67+
- [8.6 Deferred Credential Endpoint](#86-deferred-credential-endpoint)
68+
- [8.7 Metadata Endpoints](#87-metadata-endpoints)
5769
- [9. Conformance](#9-conformance)
5870
- [References](#references)
5971

@@ -82,6 +94,7 @@ This specification defines:
8294
* Credential Issuers and their Authorisation Servers
8395
* Support for:
8496
* Wallet-initiated issuance
97+
* Re-issuance of previously issued attestations
8598
* Issuer-initiated issuance via Credential Offer, using the Authorisation Code grant or the Pre-Authorised Code grant
8699

87100
This document describes:
@@ -157,22 +170,19 @@ This section presents the flows as text-based sequence descriptions.
157170
1. The Holder chooses a credential type, for example, a PID, QEAA or business credential.
158171
2. The WU selects the appropriate Issuer and the corresponding `scope` value.
159172

160-
161173
### 6.1.3 Pushed Authorisation Request (PAR)
162174

163175
1. The WU constructs an authorisation request containing, at a minimum:
164-
* `client_id`
165-
* `scope` identifying the credential type
166-
* `code_challenge` using PKCE `S256`
167-
* `redirect_uri`
168-
* `response_type=code`
169-
* `state`
170-
* `nonce`
176+
* `client_id`
177+
* `scope` identifying the credential type
178+
* `code_challenge` using PKCE `S256`
179+
* `redirect_uri`
180+
* `response_type=code`
181+
* `state`
182+
* `nonce`
171183
1. The WU sends this request to the Issuer’s PAR endpoint, with client authentication bound to the WUA. \
172-
173184
2. The PAR endpoint returns a `request_uri` and a validity period.
174185

175-
176186
### 6.1.4 User authorisation
177187

178188
1. The WU directs the Holder’s user-agent to the Authorisation Endpoint with the `request_uri` obtained from PAR.
@@ -183,28 +193,28 @@ This section presents the flows as text-based sequence descriptions.
183193
### 6.1.5 Token request
184194

185195
1. The WU sends a token request to the Token Endpoint, including:
186-
* `grant_type=authorization_code`
187-
* `code`
188-
* `redirect_uri`
189-
* `code_verifier` matching the earlier `code_challenge`
190-
* client authentication using WUA
196+
* `grant_type=authorization_code`
197+
* `code`
198+
* `redirect_uri`
199+
* `code_verifier` matching the earlier `code_challenge`
200+
* client authentication using WUA
191201
2. The Token Endpoint validates the request and returns:
192-
* sender-constrained `access_token`
193-
* optional `refresh_token` for credential refresh
202+
* sender-constrained `access_token`
203+
* optional `refresh_token` for credential refresh
194204

195205
### 6.1.6 Credential request
196206

197207
1. The WU sends a request to the Credential Endpoint containing:
198-
* `Authorization: Bearer {access_token}`
199-
* the requested credential format (SD-JWT-VC / mdoc)
200-
* a `proof` object using the `JWT` proof type that binds the credential to the WU’s subject key
208+
* `Authorization: Bearer {access_token}`
209+
* the requested credential format (SD-JWT-VC; see NOTE **CS01_01**)
210+
* a `proof` object using the `JWT` proof type that binds the credential to the WU’s subject key
201211

202-
2. The Credential Issuer validates:
203-
* the access token and its sender-constraining mechanism
204-
* the proof JWT
205-
* issuance policy
212+
3. The Credential Issuer validates:
213+
* the access token and its sender-constraining mechanism
214+
* the proof JWT
215+
* issuance policy
206216

207-
3. The Issuer returns the issued SD-JWT-VC.
217+
5. The Issuer returns the issued SD-JWT-VC.
208218

209219

210220
### 6.1.7 Storage
@@ -310,6 +320,47 @@ When the Credential Issuer cannot immediately produce one or more credentials:
310320

311321
4. Batch requests may contain a mix of immediate and deferred items. Each deferred item receives its own `transaction_id` and can be polled independently.
312322

323+
## 6.4 Re-issuance Flow
324+
325+
Re-issuance is the replacement of an attestation that already exists in a Wallet Unit by an attestation of the same attestation type, issued by the same Attestation Provider to the same Wallet Unit. Re-issuance keeps a valid technical attestation available throughout the administrative validity of the underlying attestation, is always initiated by the WU, and, to the maximum extent possible, requires no User authentication or interaction (ARF 2.9 [6], Annex 2, Topic 10, ISSU_42; Discussion Paper for Topic B [9]).
326+
327+
**Actors**: Holder, WU, Issuer (AS and Credential Issuer).
328+
329+
### 6.4.1 Re-issuance triggers
330+
331+
Re-issuance can be triggered by:
332+
333+
* **Approaching end of technical validity**: the WU initiates re-issuance ahead of expiry, some time before the existing attestation expires (ARF 2.9 [6], ISSU_50).
334+
* **Attribute value changes**: when the value of one or more attributes changes, the Issuer revokes the existing attestation and, where the User's contact details are known, notifies the User out of band with a request to obtain a re-issued attestation (ARF 2.9 [6], VCR_09).
335+
* **Depletion of once-only or batch credentials**: the WU initiates re-issuance when the supply of single-use or batch-issued attestations is exhausted.
336+
* **Manual re-issuance**: the User manually initiates re-issuance of an attestation from the WU (ARF 2.9 [6], ISSU_58).
337+
338+
### 6.4.2 Re-issuance using the Refresh Token grant
339+
340+
The primary re-issuance mechanism is the OpenID4VCI Refresh Token grant at the Token Endpoint, so that re-issuance requires no User authentication or interaction to the maximum extent possible.
341+
342+
1. During the original issuance, the Issuer returns a `refresh_token` alongside the `access_token` (section 6.1.5). The refresh token is sender-constrained (DPoP-bound) and bound to the WU that received the original attestation (section 7.8).
343+
2. When a re-issuance trigger occurs, the WU sends a token request to the Token Endpoint, including:
344+
* `grant_type=refresh_token`
345+
* the `refresh_token` issued during the previous exchange
346+
* a DPoP proof using the key to which the refresh token is bound
347+
* client authentication using the WIA, as at the original Token Request (section 7.4)
348+
4. The Token Endpoint validates the refresh token, the DPoP proof and the WIA, verifies that re-issuance is to the same WU as the existing attestation, and returns:
349+
* a new sender-constrained `access_token`
350+
* a rotated `refresh_token` for the next re-issuance
351+
5. The WU sends a Credential Request to the Credential Endpoint as in section 6.1.6, using the new access token, and presenting a fresh Key Attestation where required, so that the Issuer can verify that the re-issued device-bound attestation is bound to the same WSCA/WSCD as the attestation it replaces (section 7.8).
352+
6. The Issuer returns the re-issued attestation in the profiled credential format.
353+
7. The WU validates and stores the re-issued attestation, compares its attribute values with those of the existing attestation and notifies the User of any differences, and deletes the replaced attestation after successful re-issuance (section 7.8).
354+
355+
Because no authorisation code is involved, no front-channel User interaction takes place in this flow.
356+
357+
### 6.4.3 Fallback to the full authorisation flow
358+
359+
Where no valid refresh token exists, or the Authorisation Server requires re-authentication (for example, after attribute value changes), the WU falls back to the full Authorisation Code Flow with PAR (section 6.1) or processes a new Credential Offer (section 6.2). The remainder of the flow, including authorisation, token request, credential request and storage, is identical to those flows.
360+
361+
> [!NOTE]
362+
> CS01_02: Batch issuance and batch re-issuance per ARF 2.9 [6] and the Discussion Paper for Topic B [9] will be specified in a subsequent version of this document.
363+
313364
# 7. Normative Requirements
314365

315366
This section summarises the mandatory requirements for WE BUILD implementations.
@@ -395,7 +446,7 @@ Issuers **MUST**:
395446

396447
Issuers **SHOULD**:
397448

398-
1. Support refresh tokens for credential refresh, following OpenID4VCI guidance on refresh usage and lifetime.
449+
1. Support refresh tokens for credential refresh, following OpenID4VCI guidance on refresh usage and lifetime. Where re-issuance is supported, sender-constrained refresh tokens are REQUIRED and are specified normatively in section 7.8.
399450

400451
> [!NOTE]
401452
> Because the WIA `cnf` key is used as the DPoP key (WUs item 3 above), for WUA-based issuance the Access Token is DPoP-bound (section 7.1).
@@ -483,6 +534,24 @@ Issuers **MAY**:
483534

484535
1. Publish a `key_attestations_required` object in Credential Issuer metadata stating the minimum acceptable `key_storage` and `user_authentication` levels (ISO 18045 AVA_VAN), per OpenID4VCI [1] Appendix D. The KA claims are defined in CS-04 [7] / TS-03 [5], clause 2.3.2.
485536

537+
## 7.8 Re-issuance
538+
539+
Issuers **MUST**:
540+
541+
1. Issue sender-constrained refresh tokens (DPoP-bound) where re-issuance is supported, and support the OpenID4VCI features that enable re-issuance of attestations (ARF 2.9 [6], ISSU_63; OpenID4VCI [1], section 14.5).
542+
2. Verify that a re-issued device-bound attestation is bound to the same WSCA/WSCD as the attestation it replaces, using the DPoP-bound refresh token and, where required, a fresh Key Attestation, reusing the KA mechanism defined in section 7.5 and CS-04 [7] (ARF 2.9 [6], ISSU_65).
543+
3. Define the refresh token lifetime and rotation relative to the administrative validity of the credential, and return explicit errors when re-issuance is refused.
544+
545+
WUs **MUST**:
546+
547+
1. Request re-issuance some time before the existing attestation expires (ARF 2.9 [6], ISSU_50).
548+
2. Give the User the option to manually initiate re-issuance for any attestation, attempt to start the process immediately when the User does so, and notify the User if the request did not succeed (ARF 2.9 [6], ISSU_58).
549+
3. Compare the attribute values of the re-issued attestation with those of the existing attestation and notify the User of any differences (ARF 2.9 [6], ISSU_59).
550+
4. Handle re-issuance refusals gracefully, for example by retrying after an appropriate delay and applying back-off, consistent with section 7.6 (ARF 2.9 [6], ISSU_60).
551+
5. Delete the replaced attestation after successful re-issuance and no longer present it (ARF 2.9 [6], ISSU_62).
552+
553+
**Wallet Unit Attestation.** On the `refresh_token` grant, the WU re-presents the WIA as client authentication at the Token Endpoint, in the same way as on the original Token Request (section 7.4), together with the DPoP proof for the key to which the refresh token is bound. Re-issuance of the WIA and KA themselves takes place without User action (ARF 2.9 [6], ISSU_42). Where the WUA has rotated, the WU presents the current valid WIA and, at the Credential Endpoint, a Key Attestation for the current keys, which the Issuer verifies as for first issuance. CS-04 [7] is authoritative for WUA structure, validity, revocation and binding, and this specification references it rather than restating those rules (section 7.1, item 6).
554+
486555
# 8. Interface Definitions
487556

488557
This section defines the logical interfaces for conformance. Exact URL paths are deployment-specific and discovered through metadata.
@@ -586,11 +655,29 @@ All PAR requests MUST be client-authenticated according to Section 7.4.
586655
* `expires_in`
587656
* optional `refresh_token`
588657

589-
**Error Response (Pre-Authorised Code grant)**
658+
**Refresh Token grant**
659+
660+
For re-issuance (section 6.4), the Token Endpoint also supports the `refresh_token` grant.
661+
662+
**Request (logical fields)**
663+
664+
* `grant_type=refresh_token`
665+
* `refresh_token` issued during a previous token exchange
666+
* DPoP proof for the key to which the refresh token is bound
667+
* client authentication using the WIA, as for the `authorization_code` grant
668+
669+
**Response**
670+
671+
* `access_token` (sender-constrained)
672+
* `token_type`
673+
* `expires_in`
674+
* `refresh_token` (rotated for the next re-issuance)
675+
676+
**Error Respond**
590677

591678
In line with the OpenID4VCI [1] Token Error Response, the AS returns:
592679

593-
* `invalid_grant`: the `pre-authorized_code` is invalid, expired or already used, or the Transaction Code value is wrong
680+
* `invalid_grant` (for example, an expired, revoked or unknown refresh token), the WU MUST fall back to the full Authorisation Code Flow with PAR (section 6.1) or a new Credential Offer (section 6.2). The `pre-authorized_code` is invalid, expired or already used, or the Transaction Code value is wrong
594681
* `invalid_request`: a Transaction Code was provided but not expected, or expected but not provided
595682
* `invalid_client`: the Token Request lacks the client authentication required by this profile
596683

@@ -611,7 +698,7 @@ In line with the OpenID4VCI [1] Token Error Response, the AS returns:
611698
**Response**
612699
* SD-JWT-VC credential and any associated metadata defined by the OpenID4VCI SD-JWT-VC profile
613700

614-
## 8.7 Deferred Credential Endpoint
701+
## 8.6 Deferred Credential Endpoint
615702

616703
**Direction:** WU → Issuer \
617704
**Method:** POST
@@ -646,7 +733,7 @@ If the Deferred Credential Request is invalid, the Issuer returns an error respo
646733
* <code>invalid_transaction_id:</code> Indicates that the `transaction_id` was not issued by the Credential Issuer or has already been used.
647734
* If the Credential Issuer can no longer issue the credential(s), it returns `credential_request_denied`. The WU stops retrying for the given `transaction_id`.
648735

649-
## 8.8 Metadata Endpoints
736+
## 8.7 Metadata Endpoints
650737

651738
Issuers **MUST** publish:
652739

@@ -666,20 +753,22 @@ An implementation **conforms to this specification as a Wallet Provider** if it:
666753
1. Implements the WU requirements in Sections 6 and 7.
667754
2. Supports the interfaces defined for WU behaviour in Section 8.
668755
3. Uses SD-JWT-VC and OpenID4VCI as profiled by the OpenID4VC High Assurance Interoperability Profile Implementer’s Draft, Section 4.
756+
4. Implements the WU re-issuance requirements in sections 6.4 and 7.8.
669757

670758
An implementation **conforms to this specification as an Issuer** if it:
671759

672760
1. Implements the Issuer requirements in Sections 6 and 7.
673761
2. Publishes server metadata, including type to `scope` mappings.
674762
3. Provides the PAR, Token, Credential and WU invocation interfaces described in Section 8.
763+
4. Implements the Issuer re-issuance requirements in sections 6.4 and 7.8, including the Refresh Token grant at the Token Endpoint (section 8.4).
675764

676765
Profiles may define additional constraints for specific WE BUILD credential types, such as PID, QEAA, or business credentials. Such profiles MUST NOT relax the mandatory requirements in this document. The specific issuance will be taken into a separate CS.
677766

678767
# References
679768

680769
[1] OpenID Foundation (2025) OpenID for Verifiable Credential Issuance 1.0. OpenID Foundation. Available at: [https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html) (Accessed: 24 November 2025).
681770

682-
[2] OpenID Foundation (2025) OpenID4VC High Assurance Interoperability Profile – draft 03. OpenID Foundation. Available at: [https://openid.net/specs/openid4vc-high-assurance-interoperability-profile-1_0-ID1.html](https://openid.net/specs/openid4vc-high-assurance-interoperability-profile-1_0-ID1.html) (Accessed: 24 November 2025)
771+
[2] OpenID Foundation (2025) OpenID4VC High Assurance Interoperability Profile 1.0 - Implementers Draft 1. OpenID Foundation. Available at: [https://openid.net/specs/openid4vc-high-assurance-interoperability-profile-1_0-ID1.html](https://openid.net/specs/openid4vc-high-assurance-interoperability-profile-1_0-ID1.html) (Accessed: 24 November 2025)
683772

684773
[3] IETF (2025) SD‑JWT‑based Verifiable Credentials. IETF. Available at: https://www.ietf.org/archive/id/draft-ietf-oauth-sd-jwt-vc-09.html (Accessed: 24 November 2025).
685774

@@ -692,3 +781,5 @@ Profiles may define additional constraints for specific WE BUILD credential type
692781
[7] WE BUILD (2026) Conformance Specification CS-04: Individual Wallet Unit Attestation (WUA) Lifecycle. webuild-consortium/wp4-architecture.
693782

694783
[8] IETF (2023) RFC 9449: OAuth 2.0 Demonstrating Proof of Possession (DPoP). Available at: [https://www.rfc-editor.org/rfc/rfc9449](https://www.rfc-editor.org/rfc/rfc9449) (Accessed: 5 June 2026).
784+
785+
[9] European Digital Identity Cooperation Group (2025) The European Digital Identity Wallet Architecture and Reference Framework, Discussion Paper for Topic B: Re-issuance and batch issuance of PIDs and Attestations, version 0.9, 17 February. Available at: [https://github.com/eu-digital-identity-wallet/eudi-doc-architecture-and-reference-framework/blob/v2.9.0/docs/discussion-topics/b-re-issuance-and-batch-issuance-of-pids-and-attestations.md](https://github.com/eu-digital-identity-wallet/eudi-doc-architecture-and-reference-framework/blob/v2.9.0/docs/discussion-topics/b-re-issuance-and-batch-issuance-of-pids-and-attestations.md) (Accessed: 10 July 2026).

0 commit comments

Comments
 (0)