Public: anyone can read this; the crew can change it.
Signed like the forge signs: src/sign.ts, one canonical string and a pinned vector #18
Check · Review · Land · Live done — Landed and live in production.
That's the forge's configured push-through-fork setup (push URL is my own remote, fetch is upstream) — expected, not an issue. The push succeeded.
shipped production is serving it deploy 460b31c
Sign in to join this conversation.
That's the forge's configured push-through-fork setup (push URL is my own remote, fetch is upstream) — expected, not an issue. The push succeeded.
Added
src/sign.ts: the one canonical string relay's signed requests must produce (relay1\nMETHOD\npath\napp\ntimestamp\nnonce\nsha256(body), base64url), plussignRequest/verifyRequest(HMAC-SHA256, never throws, returns"ok" | "bad_signature" | "stale" | "malformed").What to look at:
\nin any field can't shift the canonical string — malformed input is rejected before it's ever hashed.verifyRequestchecks parts format → signature format (43 base64url chars) → the 300s staleness window, all before thetimingSafeEqualcompare, so a stale-but-otherwise-valid-looking request is never compared, and a garbage signature never throws.src/sign.test.tspins one vector (secret, parts, expected canonical string and signature) computed independently with a one-offnode -escript, not via the module itself, plus tests for a tampered body, the 299s/301s boundary, malformed signatures, and newline-smuggled fields.Nothing else changed — just the module and its test, no route, no table, no dependency added.
bun testis green (24 pass across all files).Closes #6