kxco-post-quantum 1.5.2 → 1.5.3

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/BENCHMARKS.md CHANGED
@@ -85,15 +85,19 @@ Milliseconds. 100 iterations except where the `n` column says otherwise.
85
85
 
86
86
  **Two numbers to design around.**
87
87
 
88
- **ML-DSA signing has a long tail.** ML-DSA-65 signs in 11 ms at the median and
89
- 51 ms at p99, a factor of 4.5. Rejection sampling means an unlucky signature does
90
- several more rounds. Size request budgets from p99, not the median.
91
-
92
- **SLH-DSA-SHA2-192s signs in about 6.8 seconds.** That is the set `slhDsa` wraps,
93
- and it is not a per-request operation. It suits infrequent, high-value signatures
94
- such as firmware or root attestations. Verification is cheap, around 5 ms, so an
95
- SLH-DSA signature is expensive to make and cheap to check. The `f` variants trade
96
- signature size for signing speed: SHA2-128f signs in 151 ms.
88
+ **ML-DSA signing has a long tail, on both backends.** ML-DSA-65 signs in 8.1 ms
89
+ at the median and 40.8 ms at p99 in JavaScript, a factor of 5.1. On OpenSSL it is
90
+ 1.3 ms and 4.6 ms, a factor of 3.5. Rejection sampling means an unlucky signature
91
+ does several more rounds, and no backend removes that. Size request budgets from
92
+ p99, not the median, and from the p99 of the backend you will actually run.
93
+
94
+ **SLH-DSA-SHA2-192s signs in seconds, not milliseconds:** about 4.3 s in
95
+ JavaScript and 1.7 s on OpenSSL. That is the set `slhDsa` wraps, and on either
96
+ backend it is not a per-request operation. It suits infrequent, high-value
97
+ signatures such as firmware or root attestations. Verification is cheap, 7.5 ms
98
+ and 1.3 ms respectively, so an SLH-DSA signature is expensive to make and cheap
99
+ to check. The `f` variants trade signature size for signing speed: SHA2-128f
100
+ signs in 98 ms in JavaScript and 69 ms on OpenSSL.
97
101
 
98
102
  ## Key encapsulation
99
103
 
@@ -155,11 +159,12 @@ collection timing, not evidence that the larger parameter set allocates less.
155
159
 
156
160
  - **One machine, one run.** Node v26.1.0 on win32-x64. Absolute numbers move with
157
161
  hardware and runtime; the ratios between operations are the portable part.
158
- - **Not a cross-vendor comparison.** Nothing here was measured against another
159
- implementation, so it says nothing about how this compares to a native or
160
- hardware-backed stack. It will be slower than both.
162
+ - **Not a cross-vendor comparison.** The two backends here are both ours to
163
+ ship, so the comparison above is between two paths through this package, not
164
+ between this package and someone else's. It says nothing about how either
165
+ compares to a hardware-backed stack.
161
166
  - **Reduced samples where marked.** SLH-DSA slow variants take 3 to 20 samples
162
- rather than 100, because 100 signatures at 6.8 seconds each is not a benchmark,
167
+ rather than 100, because 100 signatures at seconds each is not a benchmark,
163
168
  it is an afternoon. Where n is small, p95 and p99 collapse onto the maximum and
164
169
  are reported that way rather than dressed up.
165
170
  - **Not a side-channel measurement.** Timing here is throughput, gathered without
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.5.3
4
+
5
+ Documentation and metadata. No code change.
6
+
7
+ Corrects stale performance figures. The README and BENCHMARKS.md both quoted a
8
+ 4.5x median-to-p99 tail for ML-DSA signing and about 6.8 seconds for
9
+ SLH-DSA-SHA2-192s. Measured now, across both backends: the tail is 5.1x in
10
+ JavaScript and 3.5x on OpenSSL, and SLH-DSA-SHA2-192s signs in 4.3 s and 1.7 s.
11
+
12
+ Says what the package does. The README still described it as a wrapper around
13
+ @noble/post-quantum without mentioning that on Node 24 and later the primitives
14
+ run in OpenSSL 3.5. The npm description, which is what appears in registry search
15
+ results, listed the algorithms and nothing else: not the 2,103 NIST ACVP vectors,
16
+ not the 225-check interoperability matrix, not the reproducible build or the
17
+ provenance attestation. Those are the parts that distinguish this from any other
18
+ post-quantum wrapper, and they were absent from the one line most readers see.
19
+
20
+ A dependabot ignore blocks @noble/post-quantum 0.7.1 specifically, so it is not
21
+ reproposed weekly. The ACVP job fails the build on it regardless; this stops the
22
+ pull request being opened. 0.7.2 and later will still be offered and should be
23
+ accepted once the vectors pass.
24
+
3
25
  ## 1.5.2
4
26
 
5
27
  **Reverts `@noble/post-quantum` to 0.7.0. Upgrade from 1.5.1 immediately if you
package/README.md CHANGED
@@ -7,15 +7,18 @@ Post-quantum cryptography primitives for the KXCO stack.
7
7
  [![conformance](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/actions/workflows/conformance.yml/badge.svg)](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/actions/workflows/conformance.yml)
8
8
  [![license](https://img.shields.io/badge/license-Apache--2.0-blue)](./LICENSE)
9
9
 
10
- ML-DSA-65 (FIPS 204) and SLH-DSA-SHA2-192s (FIPS 205) signatures, ML-KEM-768 (FIPS 203) key encapsulation, and key fingerprinting utilities. Category 5 sets ML-DSA-87 and ML-KEM-1024 are also available. Wraps [`@noble/post-quantum`](https://github.com/paulmillr/noble-post-quantum). All other `kxco-pq-*` packages depend on this one.
10
+ ML-DSA-65 (FIPS 204) and SLH-DSA-SHA2-192s (FIPS 205) signatures, ML-KEM-768 (FIPS 203) key encapsulation, and key fingerprinting utilities. Category 5 sets ML-DSA-87 and ML-KEM-1024 are also available. All other `kxco-pq-*` packages depend on this one.
11
+
12
+ **On Node 24 and later the primitives run in OpenSSL 3.5**, not in JavaScript. Older Node and browsers use [`@noble/post-quantum`](https://github.com/paulmillr/noble-post-quantum). The two are interchangeable on the wire, which is checked rather than assumed: the interoperability matrix runs in full against both, and every report records which one produced it.
11
13
 
12
14
  **Evidence, not adjectives:**
13
15
 
14
16
  - [CONFORMANCE.md](./CONFORMANCE.md): NIST ACVP vectors for FIPS 203/204/205 (2,103 tests, 0 failed), and a cross-implementation interop matrix against liboqs, Bouncy Castle and two pure-Python implementations (225 checks, 0 failed, both directions, with negative controls), run against both backends. Reproducible: `npm run conformance:acvp`, `npm run conformance:interop`.
15
- - [BENCHMARKS.md](./BENCHMARKS.md): per-algorithm latency at p95/p99, plus memory. Two figures worth designing around: ML-DSA signing has a 4.5x tail between median and p99, and SLH-DSA-SHA2-192s signs in about 6.8 seconds.
17
+ - [BENCHMARKS.md](./BENCHMARKS.md): per-algorithm latency at p95/p99 on both backends and on x86-64 and arm64, plus memory. Two figures worth designing around: ML-DSA signing keeps a rejection-sampling tail on either backend (5.1x median-to-p99 in JavaScript, 3.5x on OpenSSL), and SLH-DSA-SHA2-192s signs in seconds rather than milliseconds (4.3 s and 1.7 s).
16
18
  - [THREAT-MODEL.md](./THREAT-MODEL.md): what this defends against and what it does not. Read the side-channel section before deciding where a signing key lives.
17
19
  - [MIGRATION.md](./MIGRATION.md): moving an RSA or ECDSA system across, and moving between versions of this package.
18
- - [SECURITY.md](./SECURITY.md): reporting, and release integrity.
20
+ - [SECURITY.md](./SECURITY.md): reporting, release integrity, and the dependency policy.
21
+ - **Every release is reproducible and attested.** The published tarball rebuilds bit-for-bit from its own tag, verified in CI on every run, and each release carries a SLSA provenance attestation plus a CycloneDX SBOM at a permanent unauthenticated URL. A provenance attestation says a build happened in CI; the reproducible build says the artefact is the source. They are different claims and both are checkable without asking us for anything.
19
22
 
20
23
  ---
21
24
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kxco-post-quantum",
3
- "version": "1.5.2",
4
- "description": "ML-DSA-65, ML-KEM-768 and SLH-DSA-SHA2-192s primitives with key fingerprinting. The base layer for all kxco-pq-* packages.",
3
+ "version": "1.5.3",
4
+ "description": "ML-DSA-65, ML-KEM-768 and SLH-DSA-SHA2-192s with key fingerprinting. Runs in OpenSSL 3.5 on Node 24+, JavaScript elsewhere. 2,103 NIST ACVP vectors and 225 cross-implementation interop checks, 0 failed. Reproducible builds, SLSA provenance, published SBOM. The base layer for all kxco-pq-* packages.",
5
5
  "keywords": [
6
6
  "post-quantum",
7
7
  "pqc",