Privacy receipts

Check a privacy receipt

Every dataset we value gets a signed receipt: what personal details we removed, which anonymizer version did it and the regression checks that version passed, and a re-scan of everything we produced. Paste one below to confirm it's genuine and unchanged.

Checked against our published key. Nothing you paste is stored.
Don't want to trust this page?

Receipts are signed with Ed25519. Our public key is published at /.well-known/goldspring-receipt-keys.json (current key gm-07603cbb0c6017e8). Any change to any field breaks the signature. This script checks a receipt with nothing but Node:

// Node 18+: node verify.mjs receipt.json
import { readFileSync } from "node:fs";
import { createPublicKey, verify } from "node:crypto";

// reads the signing key at request time (it comes from the environment)
export const dynamic = "force-dynamic";
const r = JSON.parse(readFileSync(process.argv[2], "utf8"));
const keys = await (await fetch("https://<this site>/.well-known/goldspring-receipt-keys.json")).json();
const key = keys.keys.find((k) => k.keyId === r.signature.keyId);
const { signature, ...body } = r;
const canon = (v) => v === null || typeof v !== "object" ? JSON.stringify(v)
  : Array.isArray(v) ? "[" + v.map(canon).join(",") + "]"
  : "{" + Object.keys(v).sort().map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
console.log(verify(null, Buffer.from(canon(body)), createPublicKey(key.publicKeyPem), Buffer.from(signature.value, "base64")) ? "valid" : "INVALID");