SD-JWT debugger

Decode a Selective Disclosure JWT (RFC 9901) or an SD-JWT VC: every disclosure, its recomputed digest, the recreated claim set and the key-binding JWT — optionally verifying the issuer signature.

Requests are processed in memory on our server by the open-source PHP packages this site documents — nothing is stored, and request bodies are never logged.

Issuer public key (optional — enables signature verification)

How SD-JWT selective disclosure works

The issuer never signs your claims in the clear: each selectively disclosable claim is replaced by the digest of a disclosure[salt, name, value], encoded and hashed. The signed payload carries only digests (_sd arrays and ... array markers); the holder chooses which disclosures to hand over. A verifier recomputes each digest and only accepts disclosures whose digest is actually referenced by the signed payload — that's what the referenced flag shows here.

For presentations, the key-binding JWT proves the holder controls the key the credential was issued to. This tool decodes the KB-JWT but doesn't check it — a real verification needs your expected audience and nonce.

Do it in PHP

use K2gl\Dsse\PublicKey;
use K2gl\SdJwt\SdJwtVerifier;

// Verifies the issuer signature and every disclosure digest (RFC 9901),
// then hands back the recreated claims.
$claims = new SdJwtVerifier()
    ->verify($compactSdJwt, PublicKey::fromJwk($issuerJwk))
    ->claims();

Powered by k2gl/sd-jwt; for dc+sd-jwt verifiable credentials (vct, issuer metadata, status), see k2gl/sd-jwt-vc.