# noble-post-quantum, vendored

Pinned copies of the files `public/ent-sig.js` needs for identity signatures (ML-DSA, SLH-DSA, Falcon Round 3 and
Ed25519). They are served as plain ES modules: no build step, no bundler, no WASM, nothing fetched from a CDN.

| Package | Version | Licence | npm tarball integrity (sha512) |
|---|---|---|---|
| `@noble/post-quantum` | 0.7.1 | MIT, (c) 2024 Paul Miller | `+P9981IiAnVh+rmcubozzVwrEy3XsN/tMhTnvsjV9VDaYpOnNCqWqKo2FLWxbu92YHfjGIlE5XnW175UK+ln+Q==` |
| `@noble/hashes` | 2.4.0 | MIT, (c) 2022 Paul Miller | `X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==` |
| `@noble/curves` | 2.4.0 | MIT, (c) 2022 Paul Miller | `P4/62zrgfH33CneE3Dn4WhJVA22YUU0eR51wKIan4NVRvwsA0YnPTwWGpNbpuacSujmSFLvyzpyuR30+fbq2Ew==` |
| `@noble/ciphers` | 2.4.0 | MIT, (c) 2022 Paul Miller | `AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==` |

Each package's `LICENSE` file sits in its folder here. Source: https://github.com/paulmillr/noble-post-quantum and its
sibling repositories. Vendored 2026-10-09.

## What was changed

One thing: bare import specifiers were rewritten to relative paths so a browser can load the files without an import
map (`'@noble/hashes/sha3.js'` becomes `'../hashes/sha3.js'`, one more `../` for files in `curves/abstract/`). Only
`import ... from` lines are touched; comments and code are byte for byte upstream. Eight files have such imports; the
table gives the upstream SHA-256 for those, and "same" for the nineteen files that are untouched.

Only the files reachable from `post-quantum/ml-dsa.js`, `post-quantum/slh-dsa.js`, `post-quantum/falcon.js` and
`curves/ed25519.js` are here (27 files). `@noble/ciphers` is present because Falcon's sampler uses ChaCha20 and its
known-answer tests use the AES-CTR DRBG.

## What to know before relying on it

- The library's own README says it has **not been independently audited**; its author self-audited it at 0.6.1. Do not
  describe it as audited.
- It does **not claim constant-time execution**. Falcon signing in particular uses floating point and data-dependent
  sampling. Here these schemes sign a coin's identity (provenance) in the launcher's own browser. They guard no money:
  the vault's lock is the hash-based signature the Solana program checks, from `program/client`.
- `falcon.js` is **Falcon Round 3**, not FN-DSA. FIPS 206 is still a draft and is expected to be incompatible.
  Falcon keys are implementation specific: a seed gives the same key only with this exact build.
- Known-answer tests: `node scripts/qa/sig-kat.mjs` (pinned subset, offline) and `--official` (the full NIST ACVP
  files for ML-DSA and SLH-DSA, the Round 3 and PQClean KATs for Falcon, RFC 8032 for Ed25519).

## Updating

Download the four tarballs with `npm pack <name>@<version>` into a scratch folder (do not `npm install` them: the
server's own `@noble/hashes` and `@noble/curves` are older majors and must stay), check each tarball's integrity
against the registry, copy the import closure of the four entry files, apply the rewrite above, then refresh this
table (`shasum -a 256`) and run both test modes plus `node scripts/qa/sig-check.cjs`.

## Files

| File | Bytes | SHA-256 as vendored | SHA-256 upstream | Changed |
|---|---:|---|---|---|
| `ciphers/_arx.js` | 17063 | `ead142ba410404c0698bb80e0d6f77780799bb77a9e3b098cf0f9fca1c486e37` | same | no |
| `ciphers/_poly1305.js` | 12223 | `5d2afd73b40dbafb7b6740c6e6388e7123c79a4e57306861b28c5734925fa84d` | same | no |
| `ciphers/_polyval.js` | 13065 | `735b078133e0c5a97dd984a21389f152dc7958b283f52504f6f0906ded243fa5` | same | no |
| `ciphers/aes.js` | 79900 | `941ebefe14c48cd1401ffe52f329d4e6ff14f3f596681b211a33cde21de3a90c` | same | no |
| `ciphers/chacha.js` | 18422 | `5f1c00575e227b75163f4bac50b79442dec50ee3047c46c18887808ba8af0a69` | same | no |
| `ciphers/utils.js` | 34005 | `a443ec1f60d1aaa25d1b7d8c102d33c0e8e6d683ada1ad17be9c32e69170ff95` | same | no |
| `curves/abstract/curve.js` | 35711 | `dbaeee3b41ff47efb76b78e14170fe4dda7c7ecdc387c402f16c5118e0bac356` | same | no |
| `curves/abstract/edwards.js` | 32323 | `f24a9c221a549a8fff259eb8f245ab0dc17679b13c532c3970d91acc4df9fffd` | same | no |
| `curves/abstract/fft.js` | 26024 | `a4b2ff7ca33f4acc85d61f0e83ec3303c3f6b38ecc19b20d0f6462d820e518cf` | same | no |
| `curves/abstract/frost.js` | 45398 | `b13be328575b5e751ad803753c13bda47fef3991368105ebc8abf7fa27187179` | `9a95f1fdf7e17b9d93a16049db675ee2967ed2a04cf59b1bd981d4662acbedf5` | import paths |
| `curves/abstract/hash-to-curve.js` | 26273 | `e3c97e7d0827b728b14e3311ed11d8e386d8a70d8fc77e0b9fd2a3090f19d955` | same | no |
| `curves/abstract/modular.js` | 39844 | `9ced3aa10598277a735e54f7b61d88e929d565da884ba5385f9006ebb3b6aab2` | same | no |
| `curves/abstract/montgomery.js` | 14721 | `cdafa8816dad5a24475ec51952c5f71fdd5d1b46880ab982694c4f8ff605fc46` | same | no |
| `curves/abstract/oprf.js` | 18336 | `2ca36b3e4930092db1f91559410e86975816c036e248067bc65a8055aa1c504c` | same | no |
| `curves/ed25519.js` | 30050 | `c2da2a55504457ae152e2e3167131919230c0e705f33f1762e3d11cfa7295bbf` | `e13f6c50c36feb0d18bf7986d5f881bcefb5f1f5b16de3cc5ee7693254c7a0b5` | import paths |
| `curves/utils.js` | 23217 | `721216668546d48385b5bca2f28b235ac21186cf12084f63e62e8411aa13ab7e` | `be9ff86aef76419376e4d66cf01a134f3117f1f8dd62d81f1b79100145503367` | import paths |
| `hashes/_md.js` | 9175 | `60cf3010fda89e3e4d3f0e7ff1ce249e9c467f34b4fd41b6fd6101d9f69be763` | same | no |
| `hashes/_u64.js` | 4794 | `b09da8c07fe8187c07649494cdb7cd0bcf13df90b506a9473d19e4d5f8c2e102` | same | no |
| `hashes/hmac.js` | 3118 | `fec9f8f3aeda785ea2de91cc4c059d54ef98196261c026c43f48341007ae52c9` | same | no |
| `hashes/sha2.js` | 18997 | `471746bba6ec4c6238ca41358d1d3b40b6ff31cf3363f0b4d550c649c1a8e83b` | same | no |
| `hashes/sha3.js` | 17469 | `9a81e1edb24eae27b335533220167609cfb58008c5690e140ce478acdc669f32` | same | no |
| `hashes/utils.js` | 26035 | `037ad49adb78168b6b699598fd33f85f7877456b1d28b4d032e2a1a16807947c` | same | no |
| `post-quantum/_crystals.js` | 9148 | `0ebd9e698272ad6ff2f05479570f3440c36d96e6ac633c107627fa2ee71ec86a` | `f8a50221e4d2e7e849e8e4f7443ecff2f722581aef592c907ed57a5480c72885` | import paths |
| `post-quantum/falcon.js` | 132641 | `979616c0236d4d5e30d3b2fa800f1d625ac16c00e74b970ab51515a5ae9c54ab` | `0db64ec731a1bd98215b7d43bf8ce74101202354752904b2e7a703cf9276368e` | import paths |
| `post-quantum/ml-dsa.js` | 33757 | `2765f2c3a29739883dcf1f010d95d3da58cc5ecab659866f7fb91ee48444fc0b` | `7c64e733930b115b72bd0585731d8202f1caa819e081cc1e682a19d1fcbcfbda` | import paths |
| `post-quantum/slh-dsa.js` | 39820 | `807cac651bfd432f9d3b7cbf0aed45a40c823ed029595f14eabda8b0d6c01a63` | `95c9292df4c2b371f6547d63ebe933d50c058f8068543285c665f4b54e14abe5` | import paths |
| `post-quantum/utils.js` | 22309 | `081d259b2f9d77537d098e11d13ccad035723f0129651b130e8ecc3031ad9caf` | `01e9046ea3e45fe7569d3ae2881515d0a9446882d602255ab7627915aa0fd2af` | import paths |
