ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Real BIP-340 Schnorr over secp256k1: keygen, sign, verify, nonce-reuse key recovery, and the linearity behind Schnorr aggregate signing.
EducationTypeScript · CSSGitHub @systemslibrarianOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Browser-based Schnorr signature demo — BIP-340. Sign and verify over secp256k1, then reuse one nonce across two messages and watch the private key fall out by algebra. Real curve arithmetic. No backend.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
An interactive, browser-only lab for BIP-340 Schnorr signatures. Generate a key, sign a message, and verify it with real elliptic-curve arithmetic — then step through the signing equation, reuse a nonce to watch the private key fall out by algebra, and see how two signatures add into one.
Not production cryptography — a teaching demo. Keys are generated per-session in memory and never stored or transmitted. There is no backend. For real signing, use the audited @noble/curves schnorr implementation — which this demo cross-checks against byte-for-byte.Read the full README ↗Schnorr Signatures · BIP-340 · secp256k1
An interactive, browser-only lab for BIP-340 Schnorr signatures. Generate a key, sign a message, and verify it with real elliptic-curve arithmetic — then step through the signing equation, reuse a nonce to watch the private key fall out by algebra, and see how two signatures add into one.
Not production cryptography — a teaching demo. Keys are generated per-session in memory and never stored or transmitted. There is no backend. For real signing, use the audited
@noble/curvesschnorrimplementation — which this demo cross-checks against byte-for-byte.
Schnorr is the signature ECDSA wishes it were: one clean, linear equation.
sign: s = k + e·x e = tagged-hash(R.x ‖ P.x ‖ m)
verify: s·G = R + e·P R = k·G, P = x·G
The primitives are BIP-340 Schnorr over secp256k1 (x-only public keys, tagged hashes, 64-byte signatures) with BIP-340 deterministic nonce derivation. Group arithmetic comes from @noble/curves; the BIP-340 layer itself — tagged hashes, the commit/challenge/respond equation, x-only/even-y encoding, and verification — is hand-rolled in src/schnorr/bip340.ts so every intermediate value is inspectable. The security model is standard EUF-CMA signatures: unforgeable without the private key, provided the nonce is never reused.
That last clause is the whole drama of this lab. Schnorr's linearity is exactly what makes multisig and threshold signing possible — and exactly what turns one reused nonce into total key compromise.
R, challenge e, respond s), the 64-byte signature, and a compute-both-sides verification that shows s·G and R + e·P byte-for-byte. A "Break it" button flips one message byte and watches the real verifier reject it, an optional BIP-340 details disclosure exposes the even-y/parity normalization on real intermediates, and copy/export/shareable-verify-link actions handle only public artifacts (private key copy is separately marked).s·G against R + e·P. Curated presets cover a valid signature and the malformed rejections (off-curve key, out-of-range scalar, changed message, wrong length).s·G = (k + e·x)·G = R + e·P. Motion is tied to your clicks; nothing loops on its own.x = (s₁ − s₂)·(e₁ − e₂)⁻¹ mod n and shows the recovered key equals the real secret. Isolated and clearly marked broken — never the default path.verify(), including the malformed cases that must be rejected (point off the curve, out-of-range scalars, negated values). Each row expands to its full artifacts and the exact failing stage, and can be sent to the Verify Workbench. Green means our verdict matched the spec.s₁, s₂ that literally add into one combined signature the ordinary verifier accepts against the summed key — the seed of Schnorr multisig, pointing to MuSig2 and FROST.Several exhibits end with an optional quick check — a one-question prediction with an immediate explanation — targeting a common misconception. The lab stays fully usable whether or not you answer them.
@noble/curves, libsecp256k1, or an equivalent audited library.https://systemslibrarian.github.io/crypto-lab-schnorr-forge/
Sign a message, flip a byte and watch verification fail, force a nonce reuse and recover a key, and combine two signers into one signature — all in the browser, no install.
k leak the private key by subtraction (Exhibit 4). The same root cause sank the Sony PlayStation 3 signing key (2010) and has drained Bitcoin wallets — those were ECDSA, where the recovery algebra differs in detail, but the fatal ingredient is identical: one k used twice.R/s, off-curve points, and out-of-range scalars (Exhibit 5).BIP-340 Schnorr is deployed in Bitcoin Taproot (activated 2021) for single-key and multisig spending, and underpins MuSig2 key aggregation and FROST threshold signing. The same commit-challenge-respond structure is the Schnorr identification protocol behind much of the zero-knowledge and threshold-signature literature.
What "not production crypto" concretely means here:
@noble/curves (which is independently audited) and the official vectors — but it has not itself received an independent security audit.bitcoin/bips bip-0340/test-vectors.csv; the differential oracle is @noble/curves v2. Group arithmetic (point mul/add, field sqrt, scalar inverse) is Noble's; tagged hashes, the sign/verify equation, x-only/even-y encoding, nonce-reuse recovery, and the textbook aggregation teaser are hand-rolled. The aggregation panel is intentionally textbook full-point Schnorr, not BIP-340.Bottom line: great for learning exactly what BIP-340 signs and why a signature passes or fails; never for protecting real funds.
npm install
npm run dev # http://localhost:5173/crypto-lab-schnorr-forge/
npm run build # typecheck + production build to dist/
npm test # unit tests incl. BIP-340 KATs
npm run size-budget # compressed-bundle budget (build first)
npm run test:a11y # WCAG 2.1 AA axe gate, both themes (build first)
npm run test:e2e # functional flows on Chromium + a mobile viewport
npm run test:e2e:all # full matrix: Chromium, Firefox, WebKit, mobile
src/**/*.test.ts), run in CI on every push and before every merge.src/schnorr/vectors.ts holds all 19 official test vectors; src/schnorr/vectors.test.ts checks verification against every row and reproduces the exact expected signature for the 8 signing vectors. Our signatures are additionally cross-checked byte-for-byte against @noble/curves schnorr in a differential sweep across 40 keys/messages/aux/lengths (src/schnorr/bip340.test.ts), and every verifier rejection branch and pipeline stage is named in a test.src/schnorr/field.test.ts proves malformed hex fails closed (no partial parse) and exercises scalar/coordinate boundaries (0, 1, n-1, p).src/schnorr/attack.test.ts proves nonce-reuse recovery returns the exact private key across many keys, and fails closed when nonces differ or messages coincide.@axe-core/playwright scans the production build for zero WCAG 2.1 A/AA violations in both themes (e2e/a11y.spec.ts).All arithmetic runs in the browser in a few milliseconds per operation. There is no backend and no network I/O after the initial static load. A CI compressed-size budget (scripts/size-budget.mjs) holds the bundle to ≤ 35 kB gzip JS and ≤ 10 kB gzip CSS (currently ~27 kB / ~3 kB).
Part of the Crypto Lab suite.
"So whether you eat or drink or whatever you do, do it all for the glory of God." — 1 Corinthians 10:31
e2e/flows.spec.ts.github/workflows/ci.yml) runs typecheck, unit tests, build, the size budget, the a11y gate, and the cross-browser flows before merge, with no Pages write permissions; deploy.yml re-runs the gates and ships to Pages only from main.