kxco-pq-network 1.0.1 → 1.0.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/ASSESSMENT.md ADDED
@@ -0,0 +1,115 @@
1
+ # Assessment notes
2
+
3
+ Where this package's boundary falls, what agility it has, and what constrains
4
+ its lifecycle.
5
+
6
+ The README is already explicit about the three modes, the fail-closed rule, the
7
+ cache window and the content-type distinction on a 404. This document does not
8
+ restate them. It covers what an assessment asks and the README does not.
9
+
10
+ Algorithm conformance belongs to
11
+ [`kxco-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum) and is
12
+ published in that package's evidence bundle.
13
+
14
+ ## Boundary
15
+
16
+ **This package performs no cryptography at all.** `applyVerifyMode` decides
17
+ what a mode requires on top of a signature check the caller has already done.
18
+ That is unusual for this family and it is the most important thing to record:
19
+ an assessor looking for algorithm behaviour here will not find any, and should
20
+ not credit this package with any.
21
+
22
+ **This is the one package where KXCO is a required service connection.** In
23
+ `signature` and `anchored` modes there is no network at verify time and no
24
+ dependency on us. In `anchored+live` there is both, and it is a hard one:
25
+
26
+ - The registry at `https://chain.kxco.ai` must be reachable, and unreachable
27
+ means invalid rather than valid-with-a-warning. That is the correct design
28
+ and it means our availability becomes the caller's availability.
29
+ - The mode requires a licence key. So a commercial relationship, not only a
30
+ technical one, sits between the caller and a successful verification.
31
+
32
+ For a buyer, that is a blocking supplier dependency and it should be recorded
33
+ as one in their own planning rather than discovered during an incident. The
34
+ mitigation is designed in and worth stating: `anchored` is deterministic,
35
+ offline and free, and a caller who would rather have the weaker answer than no
36
+ answer can ask for it.
37
+
38
+ **The transport to those endpoints is post-quantum, and here is the
39
+ measurement.** Both endpoints negotiate the hybrid key exchange group
40
+ `X25519MLKEM768` under TLS 1.3. Reproduce it:
41
+
42
+ ```
43
+ echo | openssl s_client -connect chain.kxco.ai:443 -servername chain.kxco.ai \
44
+ -groups X25519MLKEM768 -tls1_3 2>&1 | grep "Negotiated TLS1.3 group"
45
+ ```
46
+
47
+ Measured 7 September 2026 against OpenSSL 3.5.6: `X25519MLKEM768` on both
48
+ `chain.kxco.ai` and `relay.kxco.ai`.
49
+
50
+ **Authentication on that connection is still classical, and that is a
51
+ different claim.** The certificates are ECDSA P-384, issued by Let's Encrypt.
52
+ No post-quantum certificate option exists in the public WebPKI, so this is the
53
+ current state of the art rather than a gap peculiar to us. The distinction that
54
+ matters: confidentiality of the connection is protected against an adversary
55
+ recording it today and breaking it later, and endpoint authentication is not,
56
+ because forging that certificate would have to happen at connection time.
57
+
58
+ **Retain history.** Nothing is stored. The cache is in memory with a 60 second
59
+ default TTL, and the README already states the consequence, which is that a
60
+ revoked key stays accepted for up to that window.
61
+
62
+ **Start and update.** No release signing of its own. Published through CI with
63
+ npm provenance from 1.0.3 onward.
64
+
65
+ 1.0.2 and earlier carry no attestation, and the reason is worth recording
66
+ because it was a stale constraint rather than a decision. `--provenance` was
67
+ deliberately omitted while this repository was private, since npm signs
68
+ provenance only for builds from a public source repository. The repository is
69
+ public now. The flag outlived the reason for it, and 1.0.2 shipped without an
70
+ attestation it could have had.
71
+
72
+ ## Agility
73
+
74
+ **None of its own, and that is correct.** This package does no cryptography, so
75
+ it has no algorithms to change. Agility here belongs to whichever package
76
+ produced the envelope being checked, and to `kxco-post-quantum` beneath it.
77
+
78
+ **What it does pin, deliberately.** `chainId` is `1111111` and passing anything
79
+ else throws. That is the opposite of agility and it is the right call: an anchor
80
+ written on another chain satisfying a KXCO verify would defeat the thing the
81
+ anchor exists to prove. Recorded here so it is read as a decision rather than a
82
+ limitation.
83
+
84
+ ## Lifecycle
85
+
86
+ **Supported versions.** One line moving forward, matching the family.
87
+
88
+ **Pins.** `kxco-post-quantum` is declared `^1.6.0`, and the tree the evidence
89
+ bundle was last built from resolved it to **1.6.0**, against a current
90
+ primitives release of 1.7.2. Range and resolution agreeing today is a fact
91
+ about this tree and not a guarantee; `02-primitives.json` records what was
92
+ installed.
93
+
94
+ **Ceiling.** No hardware or runtime ceiling. The constraint is the registry
95
+ round trip in `anchored+live`, and the cache is the lever: concurrent lookups
96
+ of one kid collapse into a single request, so a batch from one signer costs one
97
+ connection. Setting `registryTtlMs: 0` removes the revocation window at the
98
+ cost of a lookup per verification.
99
+
100
+ **The dependency that is ours rather than a supplier's.** Everywhere else in
101
+ this family a blocking dependency means an upstream library. Here it means the
102
+ KXCO registry service and its licence. A buyer's continuity plan for
103
+ `anchored+live` needs an answer for what happens if that service is
104
+ unavailable for an extended period, and the honest answer available today is
105
+ falling back to `anchored`, which cannot detect revocation.
106
+
107
+ **Roadmap.** No external audit, no bug bounty. No published availability target
108
+ for the registry service, which for a fail-closed dependency is the number a
109
+ buyer will ask for next.
110
+
111
+ ## Correcting this document
112
+
113
+ The TLS measurement above is reproducible with the command given. Everything
114
+ else is checkable against `src/`. If a claim does not match, that is a defect
115
+ worth reporting through the repository's issues.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.3
4
+
5
+ This release carries a SLSA provenance attestation. No source change.
6
+
7
+ **`--provenance` is back on.** It was deliberately omitted while this repository
8
+ was private, because npm signs provenance only for builds from a public source
9
+ repository and a private one is refused with `E422 ... Unsupported GitHub
10
+ Actions source repository visibility`. The repository is public now, so the
11
+ constraint is gone. The flag outlived the reason for it, and 1.0.2 shipped
12
+ without an attestation it could have had.
13
+
14
+ Verify it with `npm audit signatures kxco-pq-network`. Until now the README
15
+ pointed at `kxco-post-quantum` for the provenance claim, because that was the
16
+ only package in the pair that could make it. This one makes its own from here.
17
+
18
+ ## 1.0.2
19
+
20
+ Documentation and a dependency refresh. No source change.
21
+
22
+ **ASSESSMENT.md.** Where this package's boundary falls, what cryptographic
23
+ agility it has beyond what the primitives provide, and what constrains its
24
+ lifecycle. It references the `kxco-post-quantum` evidence rather than restating
25
+ it, because a second copy of a conformance claim invites the reader to count it
26
+ twice.
27
+
28
+ **`npm run evidence` now exists.** The README already told you to run it and
29
+ there was no such script, so the command failed for anyone who followed it.
30
+ The bundle records identity, this package's own tests, its SBOM, registry
31
+ signature verification, and the `kxco-post-quantum` version actually installed
32
+ rather than the range declared.
33
+
34
+ **`kxco-post-quantum` refreshed to 1.7.2**, from 1.6.0 in the previous
35
+ lockfile. Within the existing range, so no declared dependency changed. Tests
36
+ pass unchanged.
37
+
3
38
  ## 1.0.0
4
39
 
5
40
  First release. This package is the boundary between what is free and what is
package/README.md CHANGED
@@ -157,10 +157,15 @@ cryptography is deliberate: policy changes without touching a signature path.
157
157
  This package adds no cryptography of its own, so the evidence that matters is the
158
158
  base package's, and it is reproducible on your own machine:
159
159
 
160
- - **2,103 NIST ACVP vectors (0 failed)** across FIPS 203, 204 and 205, pinned by digest
161
- - **225 interoperability checks** against OpenSSL 3.5, liboqs, Bouncy Castle and dilithium-py/kyber-py, in both directions and with negative controls
160
+ - **2,103 NIST ACVP vectors: 1,793 passed, 0 failed, 310 skipped** across FIPS 203, 204 and 205, pinned by digest
161
+ - **225 interoperability checks passed, 0 failed, 42 not applicable** against OpenSSL 3.5, liboqs, Bouncy Castle and dilithium-py/kyber-py, in both directions and with negative controls
162
162
  - **SLSA provenance** on every [`kxco-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum) release — verify with `npm audit signatures kxco-post-quantum`
163
- - `npm run evidence` in that package regenerates the whole bundle from source
163
+
164
+ This package carries its own evidence too, and from 1.0.3 its own attestation:
165
+
166
+ - **SLSA provenance on this package**, from 1.0.3 onward — verify with `npm audit signatures kxco-pq-network`
167
+ - `npm run evidence` here records what only this package can say: identity, its own tests, its SBOM, registry signature verification, and the `kxco-post-quantum` version actually installed rather than the range declared
168
+ - `npm run evidence` in the base package regenerates the conformance bundle from source
164
169
 
165
170
  Third-party dependencies here are pinned to exact versions, never ranges, so the
166
171
  code that performs the cryptography cannot change without a release.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kxco-pq-network",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Three levels of proof for KXCO post-quantum envelopes: the signature alone, offline; the signature plus an Armature L1 anchor; and both plus a live key-registry lookup that fails closed. Shared across the kxco-pq packages.",
5
5
  "keywords": [
6
6
  "post-quantum",
@@ -49,7 +49,8 @@
49
49
  "LICENSE",
50
50
  "README.md",
51
51
  "SALES-SKU.md",
52
- "src"
52
+ "src",
53
+ "ASSESSMENT.md"
53
54
  ],
54
55
  "engines": {
55
56
  "node": ">=20.19"
@@ -58,7 +59,8 @@
58
59
  "kxco-post-quantum": "^1.6.0"
59
60
  },
60
61
  "scripts": {
61
- "test": "node --test --test-timeout=30000 test/network.test.js test/registry.test.js"
62
+ "test": "node --test --test-timeout=30000 test/network.test.js test/registry.test.js",
63
+ "evidence": "node scripts/build-evidence.mjs"
62
64
  },
63
65
  "funding": "https://kxco.ai",
64
66
  "publishConfig": {