BLA
BLA (Blind LLM Agents) is the open-source Blue Defense MCP and CLI built to protect software artifacts against automated AI reverse-engineering workflows.
翻译准备中
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,即可验证所有权并自行管理介绍。
一分钟完成验证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