ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
The actual maths behind the padlock icon, one step at a time.
Each module runs a real algorithm (XOR, SHA-256, HMAC, PBKDF2, AES, RSA, Diffie-Hellman)
one visible step at a time, forwards and backwards, on a shared timeline. Every step
implementation is written by hand in plain TypeScript and checked against Node's crypto
module and the published test vectors. What you watch is the computation itself, not an
animation of it.
Status: release candidate. A preview is deployed, and the production URL will be added
here once it's promoted.
Each module builds on the one before it.查看完整 README ↗The actual maths behind the padlock icon, one step at a time.
Each module runs a real algorithm (XOR, SHA-256, HMAC, PBKDF2, AES, RSA, Diffie-Hellman)
one visible step at a time, forwards and backwards, on a shared timeline. Every step
implementation is written by hand in plain TypeScript and checked against Node's crypto
module and the published test vectors. What you watch is the computation itself, not an
animation of it.
Status: release candidate. A preview is deployed, and the production URL will be added here once it's promoted.
Each module builds on the one before it.
| # | Module | What you step through |
|---|---|---|
| 1 | Bits, bytes and XOR | Text to UTF-8 bytes, hex and binary. XOR as a reversible mask, the one-time pad, and what reusing its key gives away. |
| 2 | Hashing and MACs | SHA-256 through padding, the message schedule and 64 rounds. The avalanche effect, length extension, and how HMAC fixes it. |
| 3 | Passwords and salts | Why an unsalted hash falls to a precomputed table, what a salt changes, and PBKDF2's iterations stepped for real. |
| 4 | AES | One 16-byte block through AES-128, round by round on a 4×4 grid. Then ECB and its penguin, CBC with padding, and CTR. |
| 5 | RSA | Primes small enough to check on paper: n, φ(n), d by extended Euclid, then encrypt, decrypt, sign, verify, and malleability. |
| 6 | Diffie-Hellman | The paint-mixing analogy, then real modular exponentiation. What an eavesdropper sees, and a man-in-the-middle. |
| 7 | Putting it together: TLS 1.3 | Planned for phase 2: the RFC 8448 handshake with real values. |
Any state can be shared. The URL carries the run's inputs and current step as
?s=<base64url JSON>, which is validated with Zod when the link is opened. The same input
always replays the same run.
| Hashing: one word of the SHA-256 message schedule | Passwords: two users, one unsalted hash |
|---|---|
| RSA: d by extended Euclid, row by row | Diffie-Hellman: the paint analogy |
An animation looks convincing whether or not it's right, so the site has to be checkable.
No crypto library in the core. src/core implements every algorithm itself, byte
encodings included. A lint rule forbids importing node:crypto, Web Crypto or any crypto
package there, and tests/boundaries.test.ts proves the rule fires. If the core called
the real thing, comparing it with the real thing would prove nothing.
Differential tests in tests/differential/ compare the core with independent
sources:
| Algorithm | Published vectors | Against Node |
|---|---|---|
| SHA-256 | FIPS 180-4 examples, including one million "a" | createHash on 1,000 seeded inputs, plus every padding edge (lengths 0–130) |
| HMAC-SHA-256 | RFC 4231 | createHmac on 500 seeded keys, including 63-, 64- and 65-byte keys |
| PBKDF2 | RFC 7914 §11 | pbkdf2Sync on 200 seeded cases |
| AES-128 | FIPS 197 Appendices A, B and C.1; SP 800-38A Appendix F (ECB, CBC, CTR) | createCipheriv and createDecipheriv on 1,000 seeded cases |
| RSA | none | OpenSSL raw RSA (RSA_NO_PADDING) over several key sizes |
| Diffie-Hellman | RFC 3526 group 14 | createDiffieHellman; toy groups, which OpenSSL refuses, against repeated multiplication |
The AES test checks every intermediate state against the FIPS 197 appendix, not just the
ciphertext. XOR and UTF-8 have no library to compare against, so they're checked against
TextEncoder and XOR's own algebra in src/core.
Stepped equals fast. The version you step through and the fast version share their code, and the tests check that they reach the same answer.
Citations. Every step names the section of the standard it comes from.
tests/citations.test.ts fails if a citation doesn't resolve, and
tests/accuracy-doc.test.ts fails if docs/ACCURACY.md doesn't list
it.
Determinism. tests/determinism.test.ts runs every built-in scenario twice and
requires identical output, so a share link always replays the same run.
docs/ACCURACY.md has the full list of sources by module, with the tests behind each one.
Privacy. Everything runs in your browser, and the Content-Security-Policy blocks connections to any other origin. A password you type is never put in a share link or in local storage. The deployed site counts page views with Vercel Web Analytics. The query string is removed before a view is sent, so the inputs in a share link are never reported.
npm install
npm run dev # http://localhost:3000
npm run verify # lint, typecheck, unit tests with coverage, build, JS budget
npm run test:e2e # Playwright + axe against a production build on port 3100
npm run format
Before the first npm run test:e2e, install the Playwright browser with
npx playwright install chromium.
Built with Next.js 16 (App Router), TypeScript, Tailwind CSS v4, Zustand and Zod, and tested with Vitest and Playwright. There's no database and no server-side computation. Every route is prerendered.
src/core/ pure TypeScript step logic: no React, no crypto library, no clock
src/components/ shared UI: timeline, byte grid, bit-diff strip, modular clock
src/modules/<name>/ one folder per module; renders the core's events, never computes crypto
src/app/ routes
tests/differential/ core vs node:crypto and the published vectors
e2e/ Playwright + axe on every route, light and dark
Dependencies point inward (app → modules → components → core), and ESLint boundary rules
enforce that. The core turns an input into an ordered list of typed events, and the UI
only renders them. Randomness comes from a seeded mulberry32 generator and time from a
virtual timeline. Both are vendored from
Internet Visualizer (see
VENDORED.md). perf/bundles.mjs checks that each module route stays within
a budget of 170 KB of gzipped first-load JS.
The phase-by-phase plan is in docs/implementation/.
MIT
Coverage. src/core must keep 95% statement, branch, function and line coverage.