ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.