dumbtv
dumbtv가 ADB로 Fire TV에서 광고·추적·업데이트 알림을 제거, 루트·앱 변경 없이, 무료 오픈소스
실제 출력으로 두 랜덤니스 비콘 검증: NIST Beacon 2.0 펄스와 drand 엔트로피 라운드
Verify two deployed randomness beacons from their real outputs: NIST Beacon 2.0 pulses (SHA-512 hash chain, skiplist, precommitment, RSA signature) and drand League of Entropy rounds (threshold BLS si
보안TypeScript · JavaScriptGitHub @systemslibrarian온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Browser-based randomness-beacon demo — recompute real NIST Beacon 2.0 pulses byte by byte, walk their SHA-512 hash chain and skiplist, verify drand rounds with a BLS12-381 pairing, and see what no check proves: whether the operator knew the value first.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Recompute real NIST Randomness Beacon pulses byte by byte, walk their SHA-512 hash chain and skiplist, verify real drand League of Entropy rounds with a BLS12-381 pairing, and find the one thing no check can tell you: whether the operator knew the number first.
Not production crypto — a teaching demo. To consume a beacon, use the operator's maintained client and pin its keys.README 전문 보기 ↗NIST Beacon 2.0 · NISTIR 8213 · drand threshold BLS
Recompute real NIST Randomness Beacon pulses byte by byte, walk their SHA-512 hash chain and skiplist, verify real drand League of Entropy rounds with a BLS12-381 pairing, and find the one thing no check can tell you: whether the operator knew the number first.
Not production crypto — a teaching demo. To consume a beacon, use the operator's maintained client and pin its keys.
A randomness beacon publishes a fresh random value on a schedule for anyone to use: audit sampling, lotteries, committee selection. This lab verifies two that are in service, using their own published outputs, pinned in the repository:
outputValue is SHA-512 over a byte serialization of nineteen fields plus an RSA PKCS #1 v1.5 / SHA-512 signature. Pulses link to the previous pulse and to the first pulse of the hour, day, month and year, and each pulse publishes precommitmentValue = SHA-512(next localRandomValue).default chain (pedersen-bls-chained: public key on G1, signatures on G2, message SHA-256(previous_signature ‖ uint64_be(round))) and quicknet (bls-unchained-g1-rfc9380: signatures on G1, message SHA-256(uint64_be(round))). Randomness is SHA-256(signature). The group key is threshold-shared, so no single member can sign a round.Security model. A beacon is judged on four properties: unpredictability, uniqueness (bias resistance), public verifiability and liveness. Verification can establish integrity (nothing changed after publication) and origin (the key holder signed it). It cannot establish how the key holder chose the value. For NIST that matters directly: the engine holds each localRandomValue a full pulse before revealing it.
What this lab measured, rather than assumed. It tested every serialization variant against 56 real pulses:
| Question | NISTIR 8213 draft text | What beacon.nist.gov computes |
|---|---|---|
| Length prefix of strings and hashes | 8-byte uint64 (eq. 4) | 4 bytes |
external.statusCode | uint64 (Algorithm 2, line 11) | 4 bytes |
outputValue preimage | signature serialized with its length | raw 512-byte signature, no prefix |
certificateId | hash of the PEM file (§4.8.2) | SHA-512 of the certificate's DER bytes |
The draft-text reading reproduces none of the 56 pulses. src/nist/nist.test.ts pins each row as a regression test.
A dated finding (captured 2026-10-01). NIST rotated its signing certificate at pulse 1925734 (2026-09-03 21:08 UTC). That pulse self-reports statusCode 6 (a gap plus a certificate change) after 10 missing pulses. Every pulse since then carries a 4096-bit signature, while the certificate its certificateId names (CN=engine.beacon.nist.gov, valid 2026-09-03 to 2027-03-20) has a 2048-bit key. Those signatures cannot be verified against the certificate they name, though every hash, link and precommitment still checks. Pulse 1925733, the last under the previous 4096-bit certificate, verifies completely. scripts/live-check.mjs re-asks the live service weekly and fails if this changes.
Real vs simulated. Every pulse, certificate and round is real and unmodified, and every check is real cryptography: SHA-512 and SHA-256 from @noble/hashes; RSA through WebCrypto plus a hand-rolled s^e mod n recovery so the padding can be shown; BLS12-381 hash-to-curve and pairings from @noble/curves. Act 6's threshold beacon is real BLS arithmetic with simulated signers and a trusted dealer. drand itself uses distributed key generation.
What it does not prove. It does not show that NIST did not know or choose a value, or that fewer than the threshold of drand members colluded. It does not validate the certificate's own signature or its chain to a CA, NIST's hardware or entropy sources, drand's key ceremony, or the external.value field, which is all zeros in every pinned pulse.
outputValue compared digit by digit. Break it two ways: switch to the draft's 8-byte prefixes, or flip one bit of localRandomValue.day links. Remove any pulse and the path breaks at exactly that hop.00 01 FF…FF 00 ‖ DigestInfo ‖ H block), precommitment. Pulse 1925733 passes everything and is the negative-claim exhibit: VERIFIED — AND KNOWN TO THE OPERATOR FIRST. Post-rotation pulses show the signature/key size mismatch.external.statusCode, raw signature in the output hash, DER for certificateId.https://systemslibrarian.github.io/crypto-lab-pulse-chain/
Recompute and tamper with real pulses, verify and break drand rounds, operate a toy threshold beacon, and compare the two beacons on four properties. The page makes no network requests; all data is pinned.
uint64 external status, PEM-hashed certificateId) rejects every real pulse. This lab only found the deployed layout by testing variants against published values.outputValue proves nothing, so the lab checks both.randomness. Deriving it as SHA-256(signature) is correct, but there is then nothing published to compare against. This lab keeps the v1 value for that comparison.beacon.nist.gov), Version 2.0 Beta, described in NISTIR 8213 (Draft); used for public demonstrations of verifiable randomness and as one input in combined-beacon designs.api.drand.sh): default since 2020, quicknet since 2023. Used for timelock encryption (tlock), leader election, and on-chain randomness.npm ci
npm run dev # http://localhost:5173/crypto-lab-pulse-chain/
npm test # Vitest: unit tests and KATs
npm run build # both typechecks, then vite build
npx playwright install chromium # never --with-deps
npm run test:a11y # every Playwright spec: WCAG gate + claims suite
npm run mutate # mutation runner (slow; ~10 min)
node scripts/live-check.mjs # ask the live beacons whether the pinned facts still hold
The Playwright preview runs on port 4717. If your machine's pre-installed Chromium differs from the pinned Playwright build, set PW_CHROMIUM=/path/to/chrome; CI never sets it.
| Suite | Count | What it checks |
|---|---|---|
Vitest (npm test) | 52 tests | 56 real NIST pulses under both layouts, 2 certificates, RSA verify and recovery, hash chain, precommitment, skiplist; 13 real drand rounds by pairing and randomness; threshold toy; byte and DER helpers |
| Spec KATs | 7 vectors | RFC 9380 Appendix J.9.1 hash-to-G1 (5), FIPS 180-4 SHA-512 and SHA-256 "abc" (2), in src/fixtures/kat.json |
Claims suite (e2e/claims.spec.ts) | 30 tests | Headline values re-derived in Node by an independent route; every failure code reached through its control; retirement and a no-op guard; the §4.1d negative claim |
a11y gate (e2e/a11y.spec.ts) | 2 tests (1280px and 380px), 31 scanned states each | axe WCAG 2.1 A/AA (violations and incomplete), arithmetic text contrast, non-text contrast (empty baseline), reflow at 380px, keyboard-reachable scrollers, no invisible focus targets |
Mutation runner (npm run mutate) | 16 mutations, 16 killed | Concrete patches with owning tests; a kill requires the owner to pass unmutated in the same run, the patch to apply, the bundle hash to move, and the mutant to build |
Fixtures: src/fixtures/nist.json (captured from beacon.nist.gov on 2026-10-01), src/fixtures/drand.json (captured from api.drand.sh on 2026-10-01, with each round's v1 randomness), src/fixtures/kat.json. Nothing in them is computed by the lab.
The e2e directory has its own tsconfig.e2e.json. The gate files are copied from crypto-lab-schnorr-forge, which is written without noUncheckedIndexedAccess, and the lab's own source keeps that stricter setting. npm run build typechecks both.
CI (.github/workflows/): deploy.yml runs unit tests and builds on supported Node 22/24, then every Playwright spec before deploying, and gates and auto-merges non-major grouped Dependabot bumps. Major bumps stay open for human review. mutation.yml runs the mutation runner on changes to src/, e2e/ or the runner itself. live-check.yml runs the drift check weekly.
A BLS12-381 pairing in pure JavaScript takes tens of milliseconds, and Act 5 computes two per verification. Act 6 deals five G2 key shares and verifies each partial on demand. RSA verification goes through WebCrypto and is asynchronous, so Acts 2 and 4 render when their verifications resolve. The page marks #exhibits[data-ready] once all of them have.
One of the browser demos in 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