// generate-kat.mjs — recompute the pinned ciphertext for self-test.ts (PCH-01-020). // // Run: node scripts/generate-kat.mjs // // Uses the SAME parameters as deriveKatKey/runSelfTest in // src/background/self-test.ts (PBKDF2 1000 iters SHA-256 → AES-256-GCM). Paste // the printed hex into KAT_EXPECTED_CIPHERTEXT_HEX. It MUST NOT change once // committed — a different value means WebCrypto changed under us. const KAT_PLAINTEXT = "peach self-test vector v1"; const KAT_PASSWORD = "kat-fixed-password-do-not-use"; const SALT = Buffer.from("1719d355fb0e9b33cc95bca2298a00c9", "hex"); const NONCE = Buffer.from("6b65792d6e6f6e63652d3031", "hex"); const km = await crypto.subtle.importKey( "raw", new TextEncoder().encode(KAT_PASSWORD), "PBKDF2", false, ["deriveKey"], ); const key = await crypto.subtle.deriveKey( { name: "PBKDF2", salt: SALT, iterations: 1000, hash: "SHA-256" }, km, { name: "AES-GCM", length: 256 }, false, ["encrypt"], ); const ct = await crypto.subtle.encrypt( { name: "AES-GCM", iv: NONCE }, key, new TextEncoder().encode(KAT_PLAINTEXT), ); console.log(Buffer.from(ct).toString("hex"));