Internet Identity Card - release signing key Https Card - Internet Identity Card Ltd - UK Company No. 09168431 ALGORITHM Ed25519 PUBLIC KEY ecW/P2ENdZdMG3DYnkqyG2Zqu7fzcTaAbabpX44VGbY= FINGERPRINT SHA-256 37b4a00707104c1727e4e225d280c34373a5d3b9031472d9d9297b54b42f194d Ed25519 is used because a verifier must be able to check the signature with tooling they already have. A post-quantum release signature is the better long-term answer, but a signature nobody can verify protects nothing today. WHY THIS FILE EXISTS Each release of the generator carries its own SHA-256 in a meta tag and checks itself against it at runtime. That detects transmission corruption. It does not detect tampering: anyone modifying the file recomputes and rewrites the embedded value, and the green tick still appears. This key closes that gap. It signs the release from outside the file, so the reference is not something an attacker controls. WHAT IS PUBLISHED HERE, AND WHAT IS NOT The generator is not published. It is distributed directly, as a file. What is published here is everything needed to check a copy you already hold: release-key.pub the public key internet-identity-card-v10_2_2.html.sig detached signature internet-identity-card-v10_2_2.html.manifest.json signed release record If your copy of the generator does not match the hash and signature below, it is not the release we published, whatever it looks like. HOW TO VERIFY A RELEASE 1. Confirm this key is genuinely ours. Compare the fingerprint above against the independently published copies: - this file, https://www.internetidentitycard.com/release-key.txt - the Zenodo record (timestamped by CERN, immutable after deposit) - the blockchain anchor of the release manifest The Zenodo and blockchain copies are the ones that matter: they are outside our control after publication, which is what makes them evidence rather than assertion. If the fingerprints disagree, stop. 2. Check the artifact hash against the release manifest. shasum -a 256 internet-identity-card-v10_2_2.html The value must match SHA-256 below and the "sha256" field of the manifest. 3. Verify the detached signature. With Python and PyNaCl: python3 -c " import base64,sys from nacl.signing import VerifyKey vk=VerifyKey(base64.b64decode(open('release-key.pub').read().strip())) vk.verify(open(sys.argv[1],'rb').read(), base64.b64decode(open(sys.argv[2]).read().strip())) print('signature valid')" internet-identity-card-v10_2_2.html \ internet-identity-card-v10_2_2.html.sig A valid signature proves the bytes were signed by the holder of this private key. It does not, by itself, prove the key is ours. Step 1 is what establishes that, and it cannot be skipped. CURRENT RELEASE ARTIFACT internet-identity-card-v10_2_2.html SHA-256 b9564a01b055813169d2683f705c6bf1cea741ceb43f8cd5225760769ca5f9b1 BYTES 555571 SIGNED 2026-09-20T13:11:33.906696+00:00 SIGNATURE internet-identity-card-v10_2_2.html.sig MANIFEST internet-identity-card-v10_2_2.html.manifest.json PUBLIC KEY release-key.pub SUPERSEDED RELEASES internet-identity-card-v10_2_1.html SHA-256 a704bed1686d744f0fc01a3eb674b0eb7ef155a372799a76fc99a7ac588eb15a BYTES 549789 SIGNED 2026-09-12T14:00:51.621956+00:00 Superseded by v10.2.2. No detached signature was published for this release, so it could not be verified by the procedure above. Treat it as unsigned and use v10.2.2. KEY HANDLING The private key is held offline in an encrypted container and is not present on any internet-connected machine. If it is ever compromised, a revocation notice will be published at this URL and in the Zenodo record, and a new key issued with a new fingerprint. Treat any release signed by a key whose fingerprint is not published here as unsigned. Generated 2026-09-20 13:11 UTC