ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
BIP‑340 Schnorr 구현으로 키 생성·서명·검증·nonce 재사용 복구·집계 서명 선형성을 제공합니다
Real BIP-340 Schnorr over secp256k1: keygen, sign, verify, nonce-reuse key recovery, and the linearity behind Schnorr aggregate signing.
교육TypeScript · CSSGitHub @systemslibrarian온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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.