You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* 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.
# WE BUILD - Conformance Specification: Credential Issuance
2
2
3
3
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.
5
11
6
12
**Authors / Contributors**: WP4 Architecture
7
13
@@ -11,6 +17,7 @@ Date: 15 July 2026
11
17
* Nikolaos Triantafyllou, University of Aegean, Greece
* Credential Issuers and their Authorisation Servers
83
95
* Support for:
84
96
* Wallet-initiated issuance
97
+
* Re-issuance of previously issued attestations
85
98
* Issuer-initiated issuance via Credential Offer, using the Authorisation Code grant or the Pre-Authorised Code grant
86
99
87
100
This document describes:
@@ -157,22 +170,19 @@ This section presents the flows as text-based sequence descriptions.
157
170
1. The Holder chooses a credential type, for example, a PID, QEAA or business credential.
158
171
2. The WU selects the appropriate Issuer and the corresponding `scope` value.
159
172
160
-
161
173
### 6.1.3 Pushed Authorisation Request (PAR)
162
174
163
175
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`
171
183
1. The WU sends this request to the Issuer’s PAR endpoint, with client authentication bound to the WUA. \
172
-
173
184
2. The PAR endpoint returns a `request_uri` and a validity period.
174
185
175
-
176
186
### 6.1.4 User authorisation
177
187
178
188
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.
183
193
### 6.1.5 Token request
184
194
185
195
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
191
201
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
194
204
195
205
### 6.1.6 Credential request
196
206
197
207
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
201
211
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
206
216
207
-
3. The Issuer returns the issued SD-JWT-VC.
217
+
5. The Issuer returns the issued SD-JWT-VC.
208
218
209
219
210
220
### 6.1.7 Storage
@@ -310,6 +320,47 @@ When the Credential Issuer cannot immediately produce one or more credentials:
310
320
311
321
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.
312
322
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
+
313
364
# 7. Normative Requirements
314
365
315
366
This section summarises the mandatory requirements for WE BUILD implementations.
@@ -395,7 +446,7 @@ Issuers **MUST**:
395
446
396
447
Issuers **SHOULD**:
397
448
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.
399
450
400
451
> [!NOTE]
401
452
> 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**:
483
534
484
535
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.
485
536
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
+
486
555
# 8. Interface Definitions
487
556
488
557
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.
586
655
*`expires_in`
587
656
* optional `refresh_token`
588
657
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**
590
677
591
678
In line with the OpenID4VCI [1] Token Error Response, the AS returns:
592
679
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
594
681
*`invalid_request`: a Transaction Code was provided but not expected, or expected but not provided
595
682
*`invalid_client`: the Token Request lacks the client authentication required by this profile
596
683
@@ -611,7 +698,7 @@ In line with the OpenID4VCI [1] Token Error Response, the AS returns:
611
698
**Response**
612
699
* SD-JWT-VC credential and any associated metadata defined by the OpenID4VCI SD-JWT-VC profile
613
700
614
-
## 8.7 Deferred Credential Endpoint
701
+
## 8.6 Deferred Credential Endpoint
615
702
616
703
**Direction:** WU → Issuer \
617
704
**Method:** POST
@@ -646,7 +733,7 @@ If the Deferred Credential Request is invalid, the Issuer returns an error respo
646
733
* <code>invalid_transaction_id:</code> Indicates that the `transaction_id` was not issued by the Credential Issuer or has already been used.
647
734
* 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`.
648
735
649
-
## 8.8 Metadata Endpoints
736
+
## 8.7 Metadata Endpoints
650
737
651
738
Issuers **MUST** publish:
652
739
@@ -666,20 +753,22 @@ An implementation **conforms to this specification as a Wallet Provider** if it:
666
753
1. Implements the WU requirements in Sections 6 and 7.
667
754
2. Supports the interfaces defined for WU behaviour in Section 8.
668
755
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.
669
757
670
758
An implementation **conforms to this specification as an Issuer** if it:
671
759
672
760
1. Implements the Issuer requirements in Sections 6 and 7.
673
761
2. Publishes server metadata, including type to `scope` mappings.
674
762
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).
675
764
676
765
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.
677
766
678
767
# References
679
768
680
769
[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).
681
770
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)
683
772
684
773
[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).
685
774
@@ -692,3 +781,5 @@ Profiles may define additional constraints for specific WE BUILD credential type
692
781
[7] WE BUILD (2026) Conformance Specification CS-04: Individual Wallet Unit Attestation (WUA) Lifecycle. webuild-consortium/wp4-architecture.
693
782
694
783
[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