@noble/post-quantum 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,11 +5,11 @@ Auditable & minimal JS implementation of post-quantum public-key cryptography.
5
5
  - 🔒 Auditable
6
6
  - ðŸ”ŧ Tree-shakeable: unused code is excluded from your builds
7
7
  - 🔍 Reliable: tests ensure correctness
8
- - ðŸĶū ML-KEM & CRYSTALS-Kyber: lattice-based kem from FIPS-203
8
+ - ðŸĶū ML-KEM & CRYSTALS-Kyber: lattice-based KEM from FIPS-203
9
9
  - 🔋 ML-DSA & CRYSTALS-Dilithium: lattice-based signatures from FIPS-204
10
10
  - 🐈 SLH-DSA & SPHINCS+: hash-based Winternitz signatures from FIPS-205
11
- - ðŸĄ Hybrid algorithms, combining classic & post-quantum
12
- - ðŸŠķ 16KB (gzipped) for everything, including bundled noble-hashes & noble-curves
11
+ - ðŸĄ Hybrid algorithms, combining classic & post-quantum: Concrete, XWing, KitchenSink
12
+ - ðŸŠķ 16KB (gzipped) for everything, including bundled hashes & curves
13
13
 
14
14
  Take a glance at [GitHub Discussions](https://github.com/paulmillr/noble-post-quantum/discussions) for questions and support.
15
15
 
@@ -33,8 +33,8 @@ Take a glance at [GitHub Discussions](https://github.com/paulmillr/noble-post-qu
33
33
  [post-quantum](https://github.com/paulmillr/noble-post-quantum),
34
34
  5kb [secp256k1](https://github.com/paulmillr/noble-secp256k1) /
35
35
  [ed25519](https://github.com/paulmillr/noble-ed25519)
36
- - [Check out homepage](https://paulmillr.com/noble/)
37
- for reading resources, documentation and apps built with noble
36
+ - [Check out the homepage](https://paulmillr.com/noble/)
37
+ for reading resources, documentation, and apps built with noble
38
38
 
39
39
  ## Usage
40
40
 
@@ -67,16 +67,16 @@ import {
67
67
  slh_dsa_shake_256s,
68
68
  } from '@noble/post-quantum/slh-dsa.js';
69
69
  import {
70
- XWing,
71
- KitchenSinkMLKEM768X25519,
72
- QSFMLKEM768P256, QSFMLKEM1024P384
73
- } from '@noble/post-quantum/hybrids.js';
70
+ ml_kem768_x25519, ml_kem768_p256, ml_kem1024_p384,
71
+ KitchenSink_ml_kem768_x25519, XWing,
72
+ QSF_ml_kem768_p256, QSF_ml_kem1024_p384,
73
+ } from '@noble/post-quantum/hybrid.js';
74
74
  ```
75
75
 
76
76
  - [ML-KEM / Kyber](#ml-kem--kyber-shared-secrets)
77
77
  - [ML-DSA / Dilithium](#ml-dsa--dilithium-signatures)
78
78
  - [SLH-DSA / SPHINCS+](#slh-dsa--sphincs-signatures)
79
- - [Hybrids: XWing, KitchenSink and others](#hybrids-xwing-kitchensink-and-others)
79
+ - [hybrid: XWing, KitchenSink and others](#hybrid-xwing-kitchensink-and-others)
80
80
  - [What should I use?](#what-should-i-use)
81
81
  - [Security](#security)
82
82
  - [Speed](#speed)
@@ -129,8 +129,8 @@ import { randomBytes } from '@noble/post-quantum/utils.js';
129
129
  const seed = randomBytes(32); // seed is optional
130
130
  const keys = ml_dsa65.keygen(seed);
131
131
  const msg = new TextEncoder().encode('hello noble');
132
- const sig = ml_dsa65.sign(keys.secretKey, msg);
133
- const isValid = ml_dsa65.verify(keys.publicKey, msg, sig);
132
+ const sig = ml_dsa65.sign(msg, keys.secretKey);
133
+ const isValid = ml_dsa65.verify(sig, msg, keys.publicKey);
134
134
  ```
135
135
 
136
136
  Lattice-based digital signature algorithm, defined in [FIPS-204](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf). See
@@ -142,7 +142,7 @@ The internals are similar to ML-KEM, but keys and params are different.
142
142
 
143
143
  ```ts
144
144
  import {
145
- slh_dsa_sha2_128f,
145
+ slh_dsa_sha2_128f as sph,
146
146
  slh_dsa_sha2_128s,
147
147
  slh_dsa_sha2_192f,
148
148
  slh_dsa_sha2_192s,
@@ -158,8 +158,8 @@ import {
158
158
 
159
159
  const keys2 = sph.keygen();
160
160
  const msg2 = new TextEncoder().encode('hello noble');
161
- const sig2 = sph.sign(keys2.secretKey, msg2);
162
- const isValid2 = sph.verify(keys2.publicKey, msg2, sig2);
161
+ const sig2 = sph.sign(msg2, keys2.secretKey);
162
+ const isValid2 = sph.verify(sig2, msg2, keys2.publicKey);
163
163
  ```
164
164
 
165
165
  Hash-based digital signature algorithm, defined in [FIPS-205](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.pdf).
@@ -169,23 +169,31 @@ There are many different kinds,
169
169
  but basically `sha2` / `shake` indicate internal hash, `128` / `192` / `256` indicate security level, and `s` /`f` indicate trade-off (Small / Fast).
170
170
  SLH-DSA is slow: see [benchmarks](#speed) for key size & speed.
171
171
 
172
- ### Hybrids: XWing, KitchenSink and others
172
+ ### hybrid: XWing, KitchenSink and others
173
173
 
174
174
  ```js
175
175
  import {
176
- XWing,
177
- KitchenSinkMLKEM768X25519,
178
- QSFMLKEM768P256, QSFMLKEM1024P384
179
- } from '@noble/post-quantum/hybrids.js';
176
+ ml_kem768_x25519, ml_kem768_p256, ml_kem1024_p384,
177
+ KitchenSink_ml_kem768_x25519, XWing,
178
+ QSF_ml_kem768_p256, QSF_ml_kem1024_p384,
179
+ } from '@noble/post-quantum/hybrid.js';
180
180
  ```
181
181
 
182
- XWing is x25519+mlkem768, just like kitchensink.
182
+ Hybrid submodule combine post-quantum algorithms with elliptic curve cryptography:
183
+
184
+ - `ml_kem768_x25519`: ML-KEM-768 + X25519 (CG Framework, same as XWing)
185
+ - `ml_kem768_p256`: ML-KEM-768 + P-256 (CG Framework)
186
+ - `ml_kem1024_p384`: ML-KEM-1024 + P-384 (CG Framework)
187
+ - `KitchenSink_ml_kem768_x25519`: ML-KEM-768 + X25519 with HKDF-SHA256 combiner
188
+ - `QSF_ml_kem768_p256`: ML-KEM-768 + P-256 (QSF construction)
189
+ - `QSF_ml_kem1024_p384`: ML-KEM-1024 + P-384 (QSF construction)
183
190
 
184
191
  The following spec drafts are matched:
185
192
 
186
- - [irtf-cfrg-hybrid-kems](https://datatracker.ietf.org/doc/draft-irtf-cfrg-hybrid-kems/)
187
- - [connolly-cfrg-xwing-kem](https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem/)
188
- - [tls-westerbaan-xyber768d00](https://datatracker.ietf.org/doc/draft-tls-westerbaan-xyber768d00/)
193
+ - [irtf-cfrg-hybrid-kems-07](https://datatracker.ietf.org/doc/draft-irtf-cfrg-hybrid-kems/)
194
+ - [irtf-cfrg-concrete-hybrid-kems-02](https://datatracker.ietf.org/doc/draft-irtf-cfrg-concrete-hybrid-kems/)
195
+ - [connolly-cfrg-xwing-kem-09](https://datatracker.ietf.org/doc/draft-connolly-cfrg-xwing-kem/)
196
+ - [tls-westerbaan-xyber768d00-03](https://datatracker.ietf.org/doc/draft-tls-westerbaan-xyber768d00/)
189
197
 
190
198
  ### What should I use?
191
199
 
@@ -202,11 +210,14 @@ We suggest to use ECC + ML-KEM for key agreement, ECC + SLH-DSA for signatures.
202
210
 
203
211
  ML-KEM and ML-DSA are lattice-based. SLH-DSA is hash-based, which means it is built on top of older, more conservative primitives. NIST guidance for security levels:
204
212
 
205
- - Category 3 (~AES-192): ML-KEM-768, ML-DSA-65, SLH-DSA-[SHA2/shake]-192[s/f]
206
- - Category 5 (~AES-256): ML-KEM-1024, ML-DSA-87, SLH-DSA-[SHA2/shake]-256[s/f]
213
+ - Category 3 (~AES-192): ML-KEM-768, ML-DSA-65, SLH-DSA-192
214
+ - Category 5 (~AES-256): ML-KEM-1024, ML-DSA-87, SLH-DSA-256
207
215
 
208
216
  NIST recommends to use cat-3+, while australian [ASD only allows cat-5 after 2030](https://www.cyber.gov.au/resources-business-and-government/essential-cyber-security/ism/cyber-security-guidelines/guidelines-cryptography).
209
217
 
218
+ It's also useful to check out [NIST SP 800-131Ar3](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar3.ipd.pdf)
219
+ for "Transitioning the Use of Cryptographic Algorithms and Key Lengths".
220
+
210
221
  For [hashes](https://github.com/paulmillr/noble-hashes), use SHA512 or SHA3-512 (not SHA256); and for [ciphers](https://github.com/paulmillr/noble-ciphers) ensure AES-256 or ChaCha.
211
222
 
212
223
  ## Security
@@ -223,37 +234,33 @@ Keep in mind that even hardware versions ML-KEM [are vulnerable](https://eprint.
223
234
 
224
235
  ### Supply chain security
225
236
 
226
- - **Commits** are signed with PGP keys, to prevent forgery. Make sure to verify commit signatures
227
- - **Releases** are transparent and built on GitHub CI.
228
- Check out [attested checksums of single-file builds](https://github.com/paulmillr/noble-post-quantum/attestations)
229
- and [provenance logs](https://github.com/paulmillr/noble-post-quantum/actions/workflows/release.yml)
230
- - **Rare releasing** is followed to ensure less re-audit need for end-users
231
- - **Dependencies** are minimized and locked-down: any dependency could get hacked and users will be downloading malware with every install.
232
- - We make sure to use as few dependencies as possible
233
- - Automatic dep updates are prevented by locking-down version ranges; diffs are checked with `npm-diff`
234
- - **Dev Dependencies** are disabled for end-users; they are only used to develop / build the source code
237
+ - **Commits** are signed with PGP keys to prevent forgery. Be sure to verify the commit signatures
238
+ - **Releases** are made transparently through token-less GitHub CI and Trusted Publishing. Be sure to verify the [provenance logs](https://docs.npmjs.com/generating-provenance-statements) for authenticity.
239
+ - **Rare releasing** is practiced to minimize the need for re-audits by end-users.
240
+ - **Dependencies** are minimized and strictly pinned to reduce supply-chain risk.
241
+ - We use as few dependencies as possible.
242
+ - Version ranges are locked, and changes are checked with npm-diff.
243
+ - **Dev dependencies** are excluded from end-user installs; they're only used for development and build steps.
235
244
 
236
245
  For this package, there is 1 dependency; and a few dev dependencies:
237
246
 
238
247
  - [noble-hashes](https://github.com/paulmillr/noble-hashes) provides cryptographic hashing functionality
239
- - micro-bmark, micro-should and jsbt are used for benchmarking / testing / build tooling and developed by the same author
240
- - prettier, fast-check and typescript are used for code quality / test generation / ts compilation. It's hard to audit their source code thoroughly and fully because of their size
248
+ - jsbt is used for benchmarking / testing / build tooling and developed by the same author
249
+ - prettier, fast-check and typescript are used for code quality / test generation / ts compilation
241
250
 
242
251
  ### Randomness
243
252
 
244
- We're deferring to built-in
245
- [crypto.getRandomValues](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues)
246
- which is considered cryptographically secure (CSPRNG).
253
+ We rely on the built-in
254
+ [`crypto.getRandomValues`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues),
255
+ which is considered a cryptographically secure PRNG.
247
256
 
248
- In the past, browsers had bugs that made it weak: it may happen again.
249
- Implementing a userspace CSPRNG to get resilient to the weakness
250
- is even worse: there is no reliable userspace source of quality entropy.
257
+ Browsers have had weaknesses in the past - and could again - but implementing a userspace CSPRNG is even worse, as there’s no reliable userspace source of high-quality entropy.
251
258
 
252
259
  ## Speed
253
260
 
254
- Noble is the fastest JS implementation of post-quantum algorithms.
255
- WASM libraries can be faster.
256
- For SLH-DSA, SHAKE slows everything down 8x, and -s versions do another 20-50x slowdown.
261
+ > `npm run bench`
262
+
263
+ Noble is the fastest JS implementation of post-quantum algorithms. WASM libraries can be faster.
257
264
 
258
265
  Benchmarks on Apple M4 (**higher is better**):
259
266
 
@@ -279,16 +286,18 @@ sign x 8 ops/sec @ 114ms/op
279
286
  verify x 169 ops/sec @ 5ms/op
280
287
  ```
281
288
 
282
- SLH-DSA (\_shake is 8x slower):
289
+ SLH-DSA:
283
290
 
284
291
  | | sig size | keygen | sign | verify |
285
292
  | --------- | -------- | ------ | ------ | ------ |
286
293
  | sha2_128f | 18088 | 4ms | 90ms | 6ms |
287
- | sha2_128s | 7856 | 260ms | 2000ms | 2ms |
288
294
  | sha2_192f | 35664 | 6ms | 160ms | 9ms |
289
- | sha2_192s | 16224 | 380ms | 3800ms | 3ms |
290
295
  | sha2_256f | 49856 | 15ms | 340ms | 9ms |
296
+ | sha2_128s | 7856 | 260ms | 2000ms | 2ms |
297
+ | sha2_192s | 16224 | 380ms | 3800ms | 3ms |
291
298
  | sha2_256s | 29792 | 250ms | 3400ms | 4ms |
299
+ | shake_192f | 35664 | 21ms | 553ms | 29ms |
300
+ | shake_192s | 16224 | 260ms | 2635ms | 2ms |
292
301
 
293
302
  ## Contributing & testing
294
303
 
package/hybrid.d.ts CHANGED
@@ -80,8 +80,8 @@ import { type CHash, type CHashXOF } from '@noble/hashes/utils.js';
80
80
  import { type KEM, type Signer } from './utils.ts';
81
81
  type CurveECDH = ECDSA | MontgomeryECDH;
82
82
  type CurveSign = ECDSA | EdDSA;
83
- export declare const ecdhKem: (curve: CurveECDH, allowZeroKey?: boolean) => KEM;
84
- export declare const ecSigner: (curve: CurveSign, allowZeroKey?: boolean) => Signer;
83
+ export declare function ecdhKem(curve: CurveECDH, allowZeroKey?: boolean): KEM;
84
+ export declare function ecSigner(curve: CurveSign, allowZeroKey?: boolean): Signer;
85
85
  export type ExpandSeed = (seed: Uint8Array, len: number) => Uint8Array;
86
86
  type XOF = CHashXOF<any, {
87
87
  dkLen: number;
@@ -93,10 +93,19 @@ realMsgLen: number | undefined, // how much bytes combiner returns
93
93
  expandSeed: ExpandSeed, combiner: Combiner, ...kems: KEM[]): KEM;
94
94
  export declare function combineSigners(realSeedLen: number | undefined, expandSeed: ExpandSeed, ...signers: Signer[]): Signer;
95
95
  export declare function QSF(label: string, pqc: KEM, curveKEM: KEM, xof: XOF, kdf: CHash): KEM;
96
+ export declare const QSF_ml_kem768_p256: KEM;
97
+ export declare const QSF_ml_kem1024_p384: KEM;
98
+ export declare function createKitchenSink(label: string, pqc: KEM, curveKEM: KEM, xof: XOF, hash: CHash): KEM;
99
+ export declare const KitchenSink_ml_kem768_x25519: KEM;
100
+ export declare const ml_kem768_x25519: KEM;
101
+ export declare const ml_kem768_p256: KEM;
102
+ export declare const ml_kem1024_p384: KEM;
103
+ export declare const XWing: KEM;
104
+ export declare const MLKEM768X25519: KEM;
105
+ export declare const MLKEM768P256: KEM;
106
+ export declare const MLKEM1024P384: KEM;
96
107
  export declare const QSFMLKEM768P256: KEM;
97
108
  export declare const QSFMLKEM1024P384: KEM;
98
- export declare function KitchenSink(label: string, pqc: KEM, curveKEM: KEM, xof: XOF, hash: CHash): KEM;
99
109
  export declare const KitchenSinkMLKEM768X25519: KEM;
100
- export declare const XWing: KEM;
101
110
  export {};
102
111
  //# sourceMappingURL=hybrid.d.ts.map
package/hybrid.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["src/hybrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AACH,4EAA4E;AAC5E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAanE,OAAO,EAA0B,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE3F,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AAGpB,KAAK,SAAS,GAAG,KAAK,GAAG,cAAc,CAAC;AACxC,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAyB/B,eAAO,MAAM,OAAO,GAAI,OAAO,SAAS,EAAE,eAAc,OAAe,KAAG,GAmBzE,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,EAAE,eAAc,OAAe,KAAG,MAU1E,CAAC;AAeF,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC;AACvE,KAAK,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAG5C,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAElD;AAED,MAAM,MAAM,QAAQ,GAAG,CACrB,UAAU,EAAE,UAAU,EAAE,EACxB,WAAW,EAAE,UAAU,EAAE,EACzB,aAAa,EAAE,UAAU,EAAE,KACxB,UAAU,CAAC;AAsChB,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,oCAAoC;AACrE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,kCAAkC;AAClE,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,GAAG,CAoCL;AAGD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,EAAE,UAAU,EACtB,GAAG,OAAO,EAAE,MAAM,EAAE,GACnB,MAAM,CAwBR;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,CAWrF;AAED,eAAO,MAAM,eAAe,EAAE,GAM7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,GAM9B,CAAC;AAEF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,CAwB9F;AAGD,eAAO,MAAM,yBAAyB,EAAE,GAMvC,CAAC;AAGF,eAAO,MAAM,KAAK,EAAE,GAQnB,CAAC"}
1
+ {"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["src/hybrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AACH,4EAA4E;AAC5E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAanE,OAAO,EAA0B,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAE3F,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AAGpB,KAAK,SAAS,GAAG,KAAK,GAAG,cAAc,CAAC;AACxC,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAyB/B,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,GAAE,OAAe,GAAG,GAAG,CAmB5E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,GAAE,OAAe,GAAG,MAAM,CAUhF;AAeD,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC;AACvE,KAAK,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAG5C,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAElD;AAED,MAAM,MAAM,QAAQ,GAAG,CACrB,UAAU,EAAE,UAAU,EAAE,EACxB,WAAW,EAAE,UAAU,EAAE,EACzB,aAAa,EAAE,UAAU,EAAE,KACxB,UAAU,CAAC;AAsChB,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,oCAAoC;AACrE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,kCAAkC;AAClE,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,GAAG,CAoCL;AAGD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,EAAE,UAAU,EACtB,GAAG,OAAO,EAAE,MAAM,EAAE,GACnB,MAAM,CAwBR;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,CAWrF;AAED,eAAO,MAAM,kBAAkB,EAAE,GAMhC,CAAC;AACF,eAAO,MAAM,mBAAmB,EAAE,GAMjC,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,GAAG,EACb,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,KAAK,GACV,GAAG,CAwBL;AAGD,eAAO,MAAM,4BAA4B,EAAE,GAM1C,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,GASzB,CAAC;AAsEP,eAAO,MAAM,cAAc,EAAE,GACgC,CAAC;AAE9D,eAAO,MAAM,eAAe,EAAE,GACgC,CAAC;AAG/D,eAAO,MAAM,KAAK,EAAE,GAAsB,CAAC;AAC3C,eAAO,MAAM,cAAc,EAAE,GAAsB,CAAC;AACpD,eAAO,MAAM,YAAY,EAAE,GAAoB,CAAC;AAChD,eAAO,MAAM,aAAa,EAAE,GAAqB,CAAC;AAClD,eAAO,MAAM,eAAe,EAAE,GAAwB,CAAC;AACvD,eAAO,MAAM,gBAAgB,EAAE,GAAyB,CAAC;AACzD,eAAO,MAAM,yBAAyB,EAAE,GAAkC,CAAC"}
package/hybrid.js CHANGED
@@ -108,7 +108,7 @@ function ecKeygen(curve, allowZeroKey = false) {
108
108
  getPublicKey: (secretKey) => curve.getPublicKey(secretKey),
109
109
  };
110
110
  }
111
- export const ecdhKem = (curve, allowZeroKey = false) => {
111
+ export function ecdhKem(curve, allowZeroKey = false) {
112
112
  const kg = ecKeygen(curve, allowZeroKey);
113
113
  if (!curve.getSharedSecret)
114
114
  throw new Error('wrong curve'); // ed25519 doesn't have one!
@@ -116,7 +116,7 @@ export const ecdhKem = (curve, allowZeroKey = false) => {
116
116
  lengths: { ...kg.lengths, msg: kg.lengths.seed, cipherText: kg.lengths.publicKey },
117
117
  keygen: kg.keygen,
118
118
  getPublicKey: kg.getPublicKey,
119
- encapsulate(publicKey, rand = randomBytes(curve.lengths.secretKey)) {
119
+ encapsulate(publicKey, rand = randomBytes(curve.lengths.seed)) {
120
120
  const ek = this.keygen(rand).secretKey;
121
121
  const sharedSecret = this.decapsulate(publicKey, ek);
122
122
  const cipherText = curve.getPublicKey(ek);
@@ -128,8 +128,8 @@ export const ecdhKem = (curve, allowZeroKey = false) => {
128
128
  return curve.lengths.publicKeyHasPrefix ? res.subarray(1) : res;
129
129
  },
130
130
  };
131
- };
132
- export const ecSigner = (curve, allowZeroKey = false) => {
131
+ }
132
+ export function ecSigner(curve, allowZeroKey = false) {
133
133
  const kg = ecKeygen(curve, allowZeroKey);
134
134
  if (!curve.sign || !curve.verify)
135
135
  throw new Error('wrong curve'); // ed25519 doesn't have one!
@@ -140,7 +140,7 @@ export const ecSigner = (curve, allowZeroKey = false) => {
140
140
  sign: (message, secretKey) => curve.sign(message, secretKey),
141
141
  verify: (signature, message, publicKey) => curve.verify(signature, message, publicKey),
142
142
  };
143
- };
143
+ }
144
144
  function splitLengths(lst, name) {
145
145
  return splitCoder(name, ...lst.map((i) => {
146
146
  if (typeof i.lengths[name] !== 'number')
@@ -214,7 +214,7 @@ expandSeed, combiner, ...kems) {
214
214
  sharedSecret: combiner(pks, cipherText, sharedSecret),
215
215
  cipherText: ctCoder.encode(cipherText),
216
216
  };
217
- cleanBytes(sharedSecret, cipherText, pks);
217
+ cleanBytes(sharedSecret, cipherText);
218
218
  return res;
219
219
  },
220
220
  decapsulate(ct, seed) {
@@ -258,9 +258,9 @@ export function QSF(label, pqc, curveKEM, xof, kdf) {
258
258
  ahash(kdf);
259
259
  return combineKEMS(32, 32, expandSeedXof(xof), (pk, ct, ss) => kdf(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes(label))), pqc, curveKEM);
260
260
  }
261
- export const QSFMLKEM768P256 = QSF('QSF-KEM(ML-KEM-768,P-256)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem768, ecdhKem(p256, true), shake256, sha3_256);
262
- export const QSFMLKEM1024P384 = QSF('QSF-KEM(ML-KEM-1024,P-384)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem1024, ecdhKem(p384, true), shake256, sha3_256);
263
- export function KitchenSink(label, pqc, curveKEM, xof, hash) {
261
+ export const QSF_ml_kem768_p256 = QSF('QSF-KEM(ML-KEM-768,P-256)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem768, ecdhKem(p256, true), shake256, sha3_256);
262
+ export const QSF_ml_kem1024_p384 = QSF('QSF-KEM(ML-KEM-1024,P-384)-XOF(SHAKE256)-KDF(SHA3-256)', ml_kem1024, ecdhKem(p384, true), shake256, sha3_256);
263
+ export function createKitchenSink(label, pqc, curveKEM, xof, hash) {
264
264
  ahash(xof);
265
265
  ahash(hash);
266
266
  return combineKEMS(32, 32, expandSeedXof(xof), (pk, ct, ss) => {
@@ -275,9 +275,80 @@ export function KitchenSink(label, pqc, curveKEM, xof, hash) {
275
275
  }, pqc, curveKEM);
276
276
  }
277
277
  const x25519kem = ecdhKem(x25519);
278
- export const KitchenSinkMLKEM768X25519 = KitchenSink('KitchenSink-KEM(ML-KEM-768,X25519)-XOF(SHAKE256)-KDF(HKDF-SHA-256)', ml_kem768, x25519kem, shake256, sha256);
278
+ export const KitchenSink_ml_kem768_x25519 = createKitchenSink('KitchenSink-KEM(ML-KEM-768,X25519)-XOF(SHAKE256)-KDF(HKDF-SHA-256)', ml_kem768, x25519kem, shake256, sha256);
279
279
  // Always X25519 and ML-KEM - 768, no point to export
280
- export const XWing = combineKEMS(32, 32, expandSeedXof(shake256),
280
+ export const ml_kem768_x25519 = /* @__PURE__ */ (() => combineKEMS(32, 32, expandSeedXof(shake256),
281
281
  // Awesome label, so much escaping hell in a single line.
282
- (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes('\\.//^\\'))), ml_kem768, x25519kem);
282
+ (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes('\\.//^\\'))), ml_kem768, x25519kem))();
283
+ function nistCurveKem(curve, scalarLen, elemLen, nseed) {
284
+ const Fn = curve.Point.Fn;
285
+ if (!Fn)
286
+ throw new Error('no Point.Fn');
287
+ function rejectionSampling(seed) {
288
+ let sk;
289
+ for (let start = 0, end = scalarLen;; start = end, end += scalarLen) {
290
+ if (end > seed.length)
291
+ throw new Error('rejection sampling failed');
292
+ sk = Fn.fromBytes(seed.subarray(start, end), true);
293
+ if (Fn.isValidNot0(sk))
294
+ break;
295
+ }
296
+ const secretKey = Fn.toBytes(Fn.create(sk));
297
+ const publicKey = curve.getPublicKey(secretKey, false);
298
+ return { secretKey, publicKey };
299
+ }
300
+ return {
301
+ lengths: {
302
+ secretKey: scalarLen,
303
+ publicKey: elemLen,
304
+ seed: nseed,
305
+ msg: nseed,
306
+ cipherText: elemLen,
307
+ },
308
+ keygen(seed = randomBytes(nseed)) {
309
+ abytes(seed, nseed, 'seed');
310
+ return rejectionSampling(seed);
311
+ },
312
+ getPublicKey(secretKey) {
313
+ return curve.getPublicKey(secretKey, false);
314
+ },
315
+ encapsulate(publicKey, rand = randomBytes(nseed)) {
316
+ abytes(rand, nseed, 'rand');
317
+ const { secretKey: ek } = rejectionSampling(rand);
318
+ const sharedSecret = this.decapsulate(publicKey, ek);
319
+ const cipherText = curve.getPublicKey(ek, false);
320
+ cleanBytes(ek);
321
+ return { sharedSecret, cipherText };
322
+ },
323
+ decapsulate(cipherText, secretKey) {
324
+ const full = curve.getSharedSecret(secretKey, cipherText);
325
+ return full.subarray(1);
326
+ },
327
+ };
328
+ }
329
+ function concreteHybridKem(label, mlkem, curve, nseed) {
330
+ const { secretKey: scalarLen, publicKeyUncompressed: elemLen } = curve.lengths;
331
+ if (!scalarLen || !elemLen)
332
+ throw new Error('wrong curve');
333
+ const curveKem = nistCurveKem(curve, scalarLen, elemLen, nseed);
334
+ const mlkemSeedLen = 64;
335
+ const totalSeedLen = mlkemSeedLen + nseed;
336
+ return combineKEMS(32, 32, (seed) => {
337
+ abytes(seed, 32);
338
+ const expanded = shake256(seed, { dkLen: totalSeedLen });
339
+ const mlkemSeed = expanded.subarray(0, mlkemSeedLen);
340
+ const curveSeed = expanded.subarray(mlkemSeedLen, totalSeedLen);
341
+ return concatBytes(mlkemSeed, curveSeed);
342
+ }, (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes(label))), mlkem, curveKem);
343
+ }
344
+ export const ml_kem768_p256 = /* @__PURE__ */ (() => concreteHybridKem('MLKEM768-P256', ml_kem768, p256, 128))();
345
+ export const ml_kem1024_p384 = /* @__PURE__ */ (() => concreteHybridKem('MLKEM1024-P384', ml_kem1024, p384, 48))();
346
+ // Legacy aliases
347
+ export const XWing = ml_kem768_x25519;
348
+ export const MLKEM768X25519 = ml_kem768_x25519;
349
+ export const MLKEM768P256 = ml_kem768_p256;
350
+ export const MLKEM1024P384 = ml_kem1024_p384;
351
+ export const QSFMLKEM768P256 = QSF_ml_kem768_p256;
352
+ export const QSFMLKEM1024P384 = QSF_ml_kem1024_p384;
353
+ export const KitchenSinkMLKEM768X25519 = KitchenSink_ml_kem768_x25519;
283
354
  //# sourceMappingURL=hybrid.js.map
package/hybrid.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["src/hybrid.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid.js","sourceRoot":"","sources":["src/hybrid.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noble/post-quantum",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Auditable & minimal JS implementation of post-quantum cryptography: FIPS 203, 204, 205",
5
5
  "files": [
6
6
  "*.js",
@@ -14,7 +14,7 @@
14
14
  "@noble/hashes": "~2.0.0"
15
15
  },
16
16
  "devDependencies": {
17
- "@paulmillr/jsbt": "0.4.4",
17
+ "@paulmillr/jsbt": "0.4.5",
18
18
  "@types/node": "24.2.1",
19
19
  "fast-check": "4.2.0",
20
20
  "prettier": "3.6.2",
@@ -30,7 +30,7 @@
30
30
  "test:bun": "bun test/index.ts",
31
31
  "test:deno": "deno --allow-env --allow-read test/index.ts",
32
32
  "test:node20": "cd test; npx tsc; node compiled/test/index.js",
33
- "test:big": "SLOW_TESTS=1 node test/index.js"
33
+ "test:slow": "SLOW_TESTS=1 node test/index.ts"
34
34
  },
35
35
  "exports": {
36
36
  ".": "./index.js",
package/src/hybrid.ts CHANGED
@@ -126,14 +126,14 @@ function ecKeygen(curve: CurveAll, allowZeroKey: boolean = false) {
126
126
  };
127
127
  }
128
128
 
129
- export const ecdhKem = (curve: CurveECDH, allowZeroKey: boolean = false): KEM => {
129
+ export function ecdhKem(curve: CurveECDH, allowZeroKey: boolean = false): KEM {
130
130
  const kg = ecKeygen(curve, allowZeroKey);
131
131
  if (!curve.getSharedSecret) throw new Error('wrong curve'); // ed25519 doesn't have one!
132
132
  return {
133
133
  lengths: { ...kg.lengths, msg: kg.lengths.seed, cipherText: kg.lengths.publicKey },
134
134
  keygen: kg.keygen,
135
135
  getPublicKey: kg.getPublicKey,
136
- encapsulate(publicKey: Uint8Array, rand: Uint8Array = randomBytes(curve.lengths.secretKey)) {
136
+ encapsulate(publicKey: Uint8Array, rand: Uint8Array = randomBytes(curve.lengths.seed)) {
137
137
  const ek = this.keygen(rand).secretKey;
138
138
  const sharedSecret = this.decapsulate(publicKey, ek);
139
139
  const cipherText = curve.getPublicKey(ek);
@@ -145,9 +145,9 @@ export const ecdhKem = (curve: CurveECDH, allowZeroKey: boolean = false): KEM =>
145
145
  return curve.lengths.publicKeyHasPrefix ? res.subarray(1) : res;
146
146
  },
147
147
  };
148
- };
148
+ }
149
149
 
150
- export const ecSigner = (curve: CurveSign, allowZeroKey: boolean = false): Signer => {
150
+ export function ecSigner(curve: CurveSign, allowZeroKey: boolean = false): Signer {
151
151
  const kg = ecKeygen(curve, allowZeroKey);
152
152
  if (!curve.sign || !curve.verify) throw new Error('wrong curve'); // ed25519 doesn't have one!
153
153
  return {
@@ -157,7 +157,7 @@ export const ecSigner = (curve: CurveSign, allowZeroKey: boolean = false): Signe
157
157
  sign: (message, secretKey) => curve.sign(message, secretKey),
158
158
  verify: (signature, message, publicKey) => curve.verify(signature, message, publicKey),
159
159
  };
160
- };
160
+ }
161
161
 
162
162
  function splitLengths<K extends string, T extends { lengths: Partial<Record<K, number>> }>(
163
163
  lst: T[],
@@ -254,7 +254,7 @@ export function combineKEMS(
254
254
  sharedSecret: combiner(pks, cipherText, sharedSecret),
255
255
  cipherText: ctCoder.encode(cipherText),
256
256
  };
257
- cleanBytes(sharedSecret, cipherText, pks);
257
+ cleanBytes(sharedSecret, cipherText);
258
258
  return res;
259
259
  },
260
260
  decapsulate(ct: Uint8Array, seed: Uint8Array) {
@@ -310,15 +310,14 @@ export function QSF(label: string, pqc: KEM, curveKEM: KEM, xof: XOF, kdf: CHash
310
310
  );
311
311
  }
312
312
 
313
- export const QSFMLKEM768P256: KEM = QSF(
313
+ export const QSF_ml_kem768_p256: KEM = QSF(
314
314
  'QSF-KEM(ML-KEM-768,P-256)-XOF(SHAKE256)-KDF(SHA3-256)',
315
315
  ml_kem768,
316
316
  ecdhKem(p256, true),
317
317
  shake256,
318
318
  sha3_256
319
319
  );
320
-
321
- export const QSFMLKEM1024P384: KEM = QSF(
320
+ export const QSF_ml_kem1024_p384: KEM = QSF(
322
321
  'QSF-KEM(ML-KEM-1024,P-384)-XOF(SHAKE256)-KDF(SHA3-256)',
323
322
  ml_kem1024,
324
323
  ecdhKem(p384, true),
@@ -326,7 +325,13 @@ export const QSFMLKEM1024P384: KEM = QSF(
326
325
  sha3_256
327
326
  );
328
327
 
329
- export function KitchenSink(label: string, pqc: KEM, curveKEM: KEM, xof: XOF, hash: CHash): KEM {
328
+ export function createKitchenSink(
329
+ label: string,
330
+ pqc: KEM,
331
+ curveKEM: KEM,
332
+ xof: XOF,
333
+ hash: CHash
334
+ ): KEM {
330
335
  ahash(xof);
331
336
  ahash(hash);
332
337
  return combineKEMS(
@@ -353,7 +358,7 @@ export function KitchenSink(label: string, pqc: KEM, curveKEM: KEM, xof: XOF, ha
353
358
  }
354
359
 
355
360
  const x25519kem = ecdhKem(x25519);
356
- export const KitchenSinkMLKEM768X25519: KEM = KitchenSink(
361
+ export const KitchenSink_ml_kem768_x25519: KEM = createKitchenSink(
357
362
  'KitchenSink-KEM(ML-KEM-768,X25519)-XOF(SHAKE256)-KDF(HKDF-SHA-256)',
358
363
  ml_kem768,
359
364
  x25519kem,
@@ -362,12 +367,96 @@ export const KitchenSinkMLKEM768X25519: KEM = KitchenSink(
362
367
  );
363
368
 
364
369
  // Always X25519 and ML-KEM - 768, no point to export
365
- export const XWing: KEM = combineKEMS(
366
- 32,
367
- 32,
368
- expandSeedXof(shake256),
369
- // Awesome label, so much escaping hell in a single line.
370
- (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes('\\.//^\\'))),
371
- ml_kem768,
372
- x25519kem
373
- );
370
+ export const ml_kem768_x25519: KEM = /* @__PURE__ */ (() =>
371
+ combineKEMS(
372
+ 32,
373
+ 32,
374
+ expandSeedXof(shake256),
375
+ // Awesome label, so much escaping hell in a single line.
376
+ (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes('\\.//^\\'))),
377
+ ml_kem768,
378
+ x25519kem
379
+ ))();
380
+
381
+ function nistCurveKem(curve: ECDSA, scalarLen: number, elemLen: number, nseed: number): KEM {
382
+ const Fn = curve.Point.Fn;
383
+ if (!Fn) throw new Error('no Point.Fn');
384
+ function rejectionSampling(seed: Uint8Array): { secretKey: Uint8Array; publicKey: Uint8Array } {
385
+ let sk: bigint;
386
+ for (let start = 0, end = scalarLen; ; start = end, end += scalarLen) {
387
+ if (end > seed.length) throw new Error('rejection sampling failed');
388
+ sk = Fn.fromBytes(seed.subarray(start, end), true);
389
+ if (Fn.isValidNot0(sk)) break;
390
+ }
391
+ const secretKey = Fn.toBytes(Fn.create(sk));
392
+ const publicKey = curve.getPublicKey(secretKey, false);
393
+ return { secretKey, publicKey };
394
+ }
395
+
396
+ return {
397
+ lengths: {
398
+ secretKey: scalarLen,
399
+ publicKey: elemLen,
400
+ seed: nseed,
401
+ msg: nseed,
402
+ cipherText: elemLen,
403
+ },
404
+ keygen(seed: Uint8Array = randomBytes(nseed)) {
405
+ abytes(seed, nseed, 'seed');
406
+ return rejectionSampling(seed);
407
+ },
408
+ getPublicKey(secretKey: Uint8Array) {
409
+ return curve.getPublicKey(secretKey, false);
410
+ },
411
+ encapsulate(publicKey: Uint8Array, rand: Uint8Array = randomBytes(nseed)) {
412
+ abytes(rand, nseed, 'rand');
413
+ const { secretKey: ek } = rejectionSampling(rand);
414
+ const sharedSecret = this.decapsulate(publicKey, ek);
415
+ const cipherText = curve.getPublicKey(ek, false);
416
+ cleanBytes(ek);
417
+ return { sharedSecret, cipherText };
418
+ },
419
+ decapsulate(cipherText: Uint8Array, secretKey: Uint8Array) {
420
+ const full = curve.getSharedSecret(secretKey, cipherText);
421
+ return full.subarray(1);
422
+ },
423
+ };
424
+ }
425
+
426
+ function concreteHybridKem(label: string, mlkem: KEM, curve: ECDSA, nseed: number): KEM {
427
+ const { secretKey: scalarLen, publicKeyUncompressed: elemLen } = curve.lengths;
428
+ if (!scalarLen || !elemLen) throw new Error('wrong curve');
429
+ const curveKem = nistCurveKem(curve, scalarLen, elemLen, nseed);
430
+ const mlkemSeedLen = 64;
431
+ const totalSeedLen = mlkemSeedLen + nseed;
432
+
433
+ return combineKEMS(
434
+ 32,
435
+ 32,
436
+ (seed: Uint8Array) => {
437
+ abytes(seed, 32);
438
+ const expanded = shake256(seed, { dkLen: totalSeedLen });
439
+ const mlkemSeed = expanded.subarray(0, mlkemSeedLen);
440
+ const curveSeed = expanded.subarray(mlkemSeedLen, totalSeedLen);
441
+ return concatBytes(mlkemSeed, curveSeed);
442
+ },
443
+ (pk, ct, ss) => sha3_256(concatBytes(ss[0], ss[1], ct[1], pk[1], asciiToBytes(label))),
444
+ mlkem,
445
+ curveKem
446
+ );
447
+ }
448
+
449
+ export const ml_kem768_p256: KEM = /* @__PURE__ */ (() =>
450
+ concreteHybridKem('MLKEM768-P256', ml_kem768, p256, 128))();
451
+
452
+ export const ml_kem1024_p384: KEM = /* @__PURE__ */ (() =>
453
+ concreteHybridKem('MLKEM1024-P384', ml_kem1024, p384, 48))();
454
+
455
+ // Legacy aliases
456
+ export const XWing: KEM = ml_kem768_x25519;
457
+ export const MLKEM768X25519: KEM = ml_kem768_x25519;
458
+ export const MLKEM768P256: KEM = ml_kem768_p256;
459
+ export const MLKEM1024P384: KEM = ml_kem1024_p384;
460
+ export const QSFMLKEM768P256: KEM = QSF_ml_kem768_p256;
461
+ export const QSFMLKEM1024P384: KEM = QSF_ml_kem1024_p384;
462
+ export const KitchenSinkMLKEM768X25519: KEM = KitchenSink_ml_kem768_x25519;