なりすましと改ざんを防げます——あなたが暗号を一行も書かずに。出す手紙には自動で封蝋が捺され、届いた手紙は自動で検められる。偽の差出人の手紙は、あなたのコードに届く前に、この部屋で止まります。
現場の生々しさも見ておいてください。作法の新旧(RFC 9421とdraft-cavage)が混在する海で、まず覚えのある作法で捺し、断られたら持ち替えて、通ったほうを帳面に書く(double-knock)。最先端のMastodonが新作法に500を返すのでフォールバックを広げた、というFIXMEも貼ってあります。儀典は、教科書より現場が先に動く。
見どころ
- createProof(proof.ts)は、JCSで並べ直し→SHA-256で影→proofの影と本文の影を継いで64バイト→Ed25519で捺す。Ed25519以外の鍵は門前払い
- verifyProofInternalは、覚えていた鍵がEd25519でなかったら取り寄せ直して自分自身に再帰する(proofを剥がし直さないため)
- RFC 9421 §5のAccept-Signatureチャレンジにも応える——「この作法で捺し直して」と言われたら、一度で応じる
- key.tsのgenerateCryptoKeyPairはRSA-4096とEd25519の二対。ぜんぶWeb Crypto(crypto.subtle)で、外部の暗号ライブラリなし
経文の一節
const proofCanon = serialize(proofConfig);
const proofBytes = encoder.encode(proofCanon);
const proofDigest = await crypto.subtle.digest("SHA-256", proofBytes);
const digest = new Uint8Array(proofDigest.byteLength + msgDigest.byteLength);
digest.set(new Uint8Array(proofDigest), 0);
digest.set(new Uint8Array(msgDigest), proofDigest.byteLength);
const sig = await crypto.subtle.sign("Ed25519", privateKey, digest);