testDpopProofsVerify
tcmts.atproto.test.testDpopProofsVerify · #get7kbfw · term
import { dpopProof } from "#codebase/tcmts/atproto";
import crypto from "node:crypto";
export const testDpopProofsVerify = () => {
const pair = crypto.generateKeyPairSync("ec", { namedCurve: "P-256" });
const key = pair.privateKey.export({ format: "jwk" });
const jwt = dpopProof(key, "POST", "https://pds.example/xrpc/x?y=1#z", "n1", "tok");
const [h, p, sig] = jwt.split(".") as [string, string, string];
const header = JSON.parse(Buffer.from(h, "base64url").toString()) as {
typ: string;
alg: string;
jwk: crypto.JsonWebKey;
};
const payload = JSON.parse(Buffer.from(p, "base64url").toString()) as Record<string, unknown>;
if (header.typ !== "dpop+jwt" || header.alg !== "ES256" || "d" in header.jwk)
throw new Error(JSON.stringify(header));
if (
payload.htm !== "POST" ||
payload.htu !== "https://pds.example/xrpc/x" ||
payload.nonce !== "n1"
)
throw new Error(JSON.stringify(payload));
if (payload.ath !== crypto.createHash("sha256").update("tok").digest("base64url"))
throw new Error("ath");
const ok = crypto.verify(
"sha256",
Buffer.from(`${h}.${p}`),
{ key: crypto.createPublicKey({ key: header.jwk, format: "jwk" }), dsaEncoding: "ieee-p1363" },
Buffer.from(sig, "base64url"),
);
if (!ok) throw new Error("the proof's signature doesn't verify with its key");
}
uses