Lion Cipher Lab
Revoke verifiable credentials with a Bitstring Status List (build the issuer and verifier from scratch)
- Identity & Access Management
- Advanced
- ~75 min
- Free · no account required
Why it matters
Issuing a credential is the easy half. The half that decides whether a digital-identity system is trustworthy is being able to KILL one -- a leaked employee badge, a diploma issued in error, a driver's licence for a suspended driver -- before it expires on its own. The classic answer, OCSP, made every verifier phone the issuer with the exact certificate being checked, which leaks who is verifying whom (and browsers quietly gave up on it). The W3C Bitstring Status List is the privacy-preserving replacement the verifiable-credential world standardized on: the verifier downloads one big list and…
What you'll learn
- the status-list model: one giant compressed bitstring where each credential owns a single bit
- implementing W3C Bitstring Status List v1.0 from scratch -- bit math, the 131,072-bit minimum, and the GZIP-then-base64url 'multibase' encoding
- issuing verifiable credentials that carry a credentialStatus (BitstringStatusListEntry) for revocation AND suspension
- building a verifier that fetches the whole list, verifies the issuer's signature, decodes the bitstring, and decides valid / revoked / suspended
- herd privacy: why the verifier downloads the entire list, and why a too-small or sequentially-indexed list de-anonymizes the people being checked
- the judgment: status lists vs CRL/OCSP, why the list itself must be signed, caching/freshness trade-offs, and why 'not revoked' never means 'the claims are still true'
Steps in this lab
- The problem: you issued a credential -- now how do you kill it, privately?
- The core idea: one bit per credential, and why the verifier grabs the whole list
- Build the engine from scratch (statuslist.py)
- Build the issuer: allocate the lists, assign random indices, issue credentials (issuer.py)
- Serve it, then build the verifier (verifier.py)
- Run the happy path: a valid credential is accepted
- Revoke one credential: flip the bit, re-sign, re-publish (revoke.py)
- Suspension vs revocation: reversible vs permanent
- Failure mode: an unsigned or stale list lets an attacker un-revoke
- Herd privacy is fragile: a too-small or sequential list de-anonymizes
- Judgment: when a status list, when something else, and what it never tells you