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 +115 -0
- package/CHANGELOG.md +35 -0
- package/README.md +8 -3
- package/package.json +5 -3
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
|
|
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
|
+
|
|
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.
|
|
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": {
|