Home Terms & Conditions Privacy Policy Documentation Contact About
  1. 0. Choose a use caseHow the issuance starts
  2. 1. Discover the issuerIssuer + authorization server metadata
  3. 2. Authorize & approveAuthenticate, review tokens, request it
  4. 3. The credentialThe issued SD-JWT VC and its disclosures
  5. 4. Refresh itRefresh Token, then the issuer again

← Back to step 1 (discovery & configuration)

SD-JWT VC Issuance — Step 3 of 4: The Issued Credential

The SD-JWT VC the issuer returned, taken apart as RFC 9901 defines it: an issuer-signed JWT whose selectively-disclosable claims appear only as digests, followed by one Disclosure per claim. The holder decides which Disclosures to present; a verifier hashes each one it receives and looks for that digest in the JWT's _sd array.

Tip: click a pane's title to collapse/expand it.

The Credential (Combined Serialization)
 
The credential issuer that minted this credential, and the endpoint it came from.
Which credential configuration was asked for, in which format, and when.

Compact serialization. issuer-signed JWT~Disclosure~~ — the trailing ~ is required when no Key Binding JWT is present.

 

 

A credential's claim values and its validity window both go stale. Step 4 refreshes it the way OID4VCI section 14.5 describes — a Refresh Token for a fresh Access Token, then this issuer's Credential Endpoint again — with no End-User interaction at all.

Issuer-signed JWT

The signed part of the credential. _sd holds one digest per selectively-disclosable claim (plus any decoys the issuer added), cnf holds the holder's public key, and vct says what kind of credential this is.

typ should be the SD-JWT VC media type (dc+sd-jwt; vc+sd-jwt in earlier drafts), and alg must not be none.
 
The issuer-signed claim set, with selectively-disclosable claims represented only by their digests in _sd.
 
Signature verified against the issuer's published keys, plus the structural checks RFC 9901 and SD-JWT VC ask for.
Disclosures

Each Disclosure is base64url([salt, claim name, claim value]). Its digest is base64url(SHA-256(the ASCII of that base64url string)) — recomputed here in the browser and looked up in the JWT's _sd array, which is exactly what a verifier does.

 

Resulting Claim Set

What a verifier ends up with if the holder presents every Disclosure: the always-visible claims plus every disclosed claim, with the SD-JWT machinery (_sd, _sd_alg) removed. Presenting fewer Disclosures yields a smaller claim set — that is the point of selective disclosure.

 
Notify the Issuer

The Credential Response carried a notification_id, which is the issuer asking to be told what became of the credential (OID4VCI section 11). It is optional for the wallet — an issuer cannot assume a notification will arrive — but it is how an issuer learns that a credential it minted was actually accepted, or was rejected, or has since been deleted. The access token from the issuance authorizes the call.

From the Credential Response. The issuer issues one per response, and it identifies the credential being reported on.
notification_endpoint from the credential issuer metadata. An issuer that does not want notifications does not publish one.
The three events the spec defines: credential_accepted (stored successfully), credential_failure (something went wrong), credential_deleted (the End-User removed it).
The Notification Request exactly as it will be sent.
POST it. A successful notification is answered with 204 and no body.