kxco-pq-network 1.0.0 → 1.0.2

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,108 @@
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.
64
+
65
+ ## Agility
66
+
67
+ **None of its own, and that is correct.** This package does no cryptography, so
68
+ it has no algorithms to change. Agility here belongs to whichever package
69
+ produced the envelope being checked, and to `kxco-post-quantum` beneath it.
70
+
71
+ **What it does pin, deliberately.** `chainId` is `1111111` and passing anything
72
+ else throws. That is the opposite of agility and it is the right call: an anchor
73
+ written on another chain satisfying a KXCO verify would defeat the thing the
74
+ anchor exists to prove. Recorded here so it is read as a decision rather than a
75
+ limitation.
76
+
77
+ ## Lifecycle
78
+
79
+ **Supported versions.** One line moving forward, matching the family.
80
+
81
+ **Pins.** `kxco-post-quantum` is declared `^1.6.0`, and the tree the evidence
82
+ bundle was last built from resolved it to **1.6.0**, against a current
83
+ primitives release of 1.7.2. Range and resolution agreeing today is a fact
84
+ about this tree and not a guarantee; `02-primitives.json` records what was
85
+ installed.
86
+
87
+ **Ceiling.** No hardware or runtime ceiling. The constraint is the registry
88
+ round trip in `anchored+live`, and the cache is the lever: concurrent lookups
89
+ of one kid collapse into a single request, so a batch from one signer costs one
90
+ connection. Setting `registryTtlMs: 0` removes the revocation window at the
91
+ cost of a lookup per verification.
92
+
93
+ **The dependency that is ours rather than a supplier's.** Everywhere else in
94
+ this family a blocking dependency means an upstream library. Here it means the
95
+ KXCO registry service and its licence. A buyer's continuity plan for
96
+ `anchored+live` needs an answer for what happens if that service is
97
+ unavailable for an extended period, and the honest answer available today is
98
+ falling back to `anchored`, which cannot detect revocation.
99
+
100
+ **Roadmap.** No external audit, no bug bounty. No published availability target
101
+ for the registry service, which for a fail-closed dependency is the number a
102
+ buyer will ask for next.
103
+
104
+ ## Correcting this document
105
+
106
+ The TLS measurement above is reproducible with the command given. Everything
107
+ else is checkable against `src/`. If a claim does not match, that is a defect
108
+ worth reporting through the repository's issues.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.2
4
+
5
+ Documentation and a dependency refresh. No source change.
6
+
7
+ **ASSESSMENT.md.** Where this package's boundary falls, what cryptographic
8
+ agility it has beyond what the primitives provide, and what constrains its
9
+ lifecycle. It references the `kxco-post-quantum` evidence rather than restating
10
+ it, because a second copy of a conformance claim invites the reader to count it
11
+ twice.
12
+
13
+ **`npm run evidence` now exists.** The README already told you to run it and
14
+ there was no such script, so the command failed for anyone who followed it.
15
+ The bundle records identity, this package's own tests, its SBOM, registry
16
+ signature verification, and the `kxco-post-quantum` version actually installed
17
+ rather than the range declared.
18
+
19
+ **`kxco-post-quantum` refreshed to 1.7.2**, from 1.6.0 in the previous
20
+ lockfile. Within the existing range, so no declared dependency changed. Tests
21
+ pass unchanged.
22
+
3
23
  ## 1.0.0
4
24
 
5
25
  First release. This package is the boundary between what is free and what is
package/README.md CHANGED
@@ -157,8 +157,8 @@ 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
163
  - `npm run evidence` in that package regenerates the whole bundle from source
164
164
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kxco-pq-network",
3
- "version": "1.0.0",
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 by kxco-pq-sdk, kxco-pq-attest, kxco-post-quantum-webhook and kxco-pq-agent.",
3
+ "version": "1.0.2",
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",
7
7
  "pqc",
@@ -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": {