kxco-pq-agent 1.0.7 → 1.0.9
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 +107 -0
- package/README.md +43 -4
- package/package.json +5 -3
package/ASSESSMENT.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Assessment notes
|
|
2
|
+
|
|
3
|
+
Where this package's boundary falls, what agility it has, and what constrains
|
|
4
|
+
its lifecycle.
|
|
5
|
+
|
|
6
|
+
Algorithm conformance belongs to
|
|
7
|
+
[`kxco-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum) and is
|
|
8
|
+
published in that package's evidence bundle. It is referenced here, never
|
|
9
|
+
restated.
|
|
10
|
+
|
|
11
|
+
## Boundary
|
|
12
|
+
|
|
13
|
+
**What the assessed thing is.** An identity for a non-human actor: a
|
|
14
|
+
KYC-verified institution sponsors an ML-DSA-65 keypair for an agent and binds a
|
|
15
|
+
capability scope to it at issuance.
|
|
16
|
+
|
|
17
|
+
**Where the containment properties are actually enforced. This is the boundary
|
|
18
|
+
statement that matters most in this package.** The README states three
|
|
19
|
+
properties: an agent cannot widen its own authority, cannot mint another agent,
|
|
20
|
+
and always traces to a named institution. They hold, and a buyer needs to know
|
|
21
|
+
*what* holds them, because it is not this library.
|
|
22
|
+
|
|
23
|
+
- *Scope is enforced relay-side, and only relay-side.* An out-of-scope
|
|
24
|
+
operation is refused before it reaches the chain. There is no client-side
|
|
25
|
+
equivalent: `src/scope.js` exports `validateScope`, which checks the shape of
|
|
26
|
+
a manifest at issuance, and `hashScope`, which binds it to the credential.
|
|
27
|
+
Neither evaluates a proposed action against the scope. So the boundary that
|
|
28
|
+
contains a compromised agent is a KXCO service, not a property of this
|
|
29
|
+
library and not something the agent's own process could apply even if it
|
|
30
|
+
wanted to.
|
|
31
|
+
- *The scope is signed by the sponsor at issuance and cannot be changed.*
|
|
32
|
+
Widening requires revoke and re-issue. That part is cryptographic.
|
|
33
|
+
- *Sponsorship requires KYC.* That is an operational control at KXCO, not a
|
|
34
|
+
protocol one.
|
|
35
|
+
|
|
36
|
+
The honest summary: the cryptography proves which agent acted and under whose
|
|
37
|
+
sponsorship; the limits on what that agent may do are enforced by our relay. An
|
|
38
|
+
assessment that credits this package with the enforcement has misplaced it.
|
|
39
|
+
|
|
40
|
+
**Required service connection.** `relay.kxco.ai`, which negotiates the hybrid
|
|
41
|
+
key exchange group `X25519MLKEM768` under TLS 1.3, measured 7 September 2026
|
|
42
|
+
with OpenSSL 3.5.6:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
echo | openssl s_client -connect relay.kxco.ai:443 -servername relay.kxco.ai \
|
|
46
|
+
-groups X25519MLKEM768 -tls1_3 2>&1 | grep "Negotiated TLS1.3 group"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The certificate is ECDSA P-384 from Let's Encrypt, so endpoint authentication
|
|
50
|
+
is classical, as it is across the public WebPKI. Since scope enforcement
|
|
51
|
+
happens at the far end of that connection, availability of the relay is a
|
|
52
|
+
functional dependency and not merely a convenience: no relay, no enforced
|
|
53
|
+
action.
|
|
54
|
+
|
|
55
|
+
**Retain history.** Nothing stored here. An agent's actions are recorded where
|
|
56
|
+
they land, on Armature L1 or in whatever audit log the sponsor keeps.
|
|
57
|
+
|
|
58
|
+
**Start and update.** No release signing of its own. Published through CI with
|
|
59
|
+
npm provenance.
|
|
60
|
+
|
|
61
|
+
## Agility
|
|
62
|
+
|
|
63
|
+
**Inherited, and coordinated.** Signing primitives belong to
|
|
64
|
+
`kxco-post-quantum`. Because an agent's identity is registered on Armature L1
|
|
65
|
+
and its scope is checked by the relay, a parameter-set change here is a
|
|
66
|
+
chain-and-relay change before it is a client change. See the same constraint in
|
|
67
|
+
`kxco-pq-chain`.
|
|
68
|
+
|
|
69
|
+
**The scope manifest is a data format and it has no version field.** The scope
|
|
70
|
+
object carries `payments`, `attestations`, `auditLog` and `credentials` keys.
|
|
71
|
+
It is signed at issuance, so it cannot be altered, and there is no version
|
|
72
|
+
marker inside it to distinguish a future shape from the current one. Adding a
|
|
73
|
+
capability class later is therefore a change that both signer and enforcer must
|
|
74
|
+
agree on out of band. Worth noting beside the version prefixes that
|
|
75
|
+
`kxco-pq-attest` and `kxco-pq-tls` do carry.
|
|
76
|
+
|
|
77
|
+
## Lifecycle
|
|
78
|
+
|
|
79
|
+
**This package has an unpublished release.** The tree is at **1.0.8** and npm
|
|
80
|
+
carries **1.0.7**. So the source here is ahead of what anyone can install, and
|
|
81
|
+
an assessment reading this repository is not reading the shipped artefact
|
|
82
|
+
unless that is reconciled. It is the only package in the family in this state.
|
|
83
|
+
|
|
84
|
+
**Supported versions.** One line moving forward, matching the family.
|
|
85
|
+
|
|
86
|
+
**Pins.** `kxco-post-quantum` is declared `^1.3.0` and the tree the evidence
|
|
87
|
+
bundle was last built from resolved it to **1.3.0**, against a current
|
|
88
|
+
primitives release of 1.7.2. `02-primitives.json` records the resolved version.
|
|
89
|
+
|
|
90
|
+
**Ceiling.** No hardware or runtime ceiling. Signing is one ML-DSA-65 operation
|
|
91
|
+
per action. The practical limits are the relay's rate limits and the scope
|
|
92
|
+
caps themselves, which are policy rather than performance.
|
|
93
|
+
|
|
94
|
+
**Blocking dependencies.** The upstream library, and the relay service, which
|
|
95
|
+
is ours and which is where enforcement lives. For this package the relay
|
|
96
|
+
dependency is stronger than elsewhere: `kxco-pq-network` can fall back to
|
|
97
|
+
`anchored` and lose only revocation checking, whereas an agent with no relay
|
|
98
|
+
has no enforced scope.
|
|
99
|
+
|
|
100
|
+
**Roadmap.** No external audit, no bug bounty. No published availability target
|
|
101
|
+
for the relay.
|
|
102
|
+
|
|
103
|
+
## Correcting this document
|
|
104
|
+
|
|
105
|
+
The TLS measurement is reproducible with the command given. Everything else is
|
|
106
|
+
checkable against `src/` and the README. If a claim does not match, that is a
|
|
107
|
+
defect worth reporting through the repository's issues.
|
package/README.md
CHANGED
|
@@ -4,6 +4,33 @@ Post-quantum identity for AI agents and autonomous systems.
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## Release integrity
|
|
8
|
+
|
|
9
|
+
Every release of this package is checkable without asking us for anything.
|
|
10
|
+
|
|
11
|
+
- **Provenance.** Each release carries a SLSA provenance attestation tying the
|
|
12
|
+
published tarball to the commit and workflow that built it. Verify with
|
|
13
|
+
`npm audit signatures`, or read it directly from
|
|
14
|
+
`registry.npmjs.org/-/npm/v1/attestations/kxco-pq-agent@<version>`.
|
|
15
|
+
- **Bill of materials.** A CycloneDX SBOM is published as a GitHub Release asset
|
|
16
|
+
at `releases/download/v<version>/sbom.cyclonedx.json`, a permanent
|
|
17
|
+
unauthenticated URL. Not an expiring build artifact.
|
|
18
|
+
- **Pinned where it matters.** Third-party dependencies are pinned to exact
|
|
19
|
+
versions, never ranges, so the code that performs the cryptography cannot
|
|
20
|
+
change without a release. Sibling `kxco-*` packages sit on caret ranges
|
|
21
|
+
deliberately: it means a correctness fix in the base package reaches you
|
|
22
|
+
without a release of every package above it. That is not theoretical. When
|
|
23
|
+
`@noble/post-quantum` 0.7.1 was found to fail NIST SLH-DSA verification
|
|
24
|
+
vectors, the revert in the base package propagated here on the next install.
|
|
25
|
+
Every GitHub Action is pinned by 40-character commit SHA.
|
|
26
|
+
- **Conformance underneath.** The cryptography comes from
|
|
27
|
+
[`kxco-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum), which
|
|
28
|
+
is run against **2,103 NIST ACVP vectors: 1,793 passed, 0 failed, 310 skipped** and a **225-check
|
|
29
|
+
cross-implementation interoperability matrix** against liboqs, Bouncy Castle
|
|
30
|
+
and two pure-Python implementations, in both directions and with negative
|
|
31
|
+
controls. Its published tarball also rebuilds bit-for-bit from its own tag,
|
|
32
|
+
verified in CI on every run.
|
|
33
|
+
|
|
7
34
|
## The problem it solves
|
|
8
35
|
|
|
9
36
|
AI systems cannot pass KYC. An LLM, robot, IoT device, or daemon has no legal standing to authenticate itself to a regulated network. This package solves that with a delegation model: a KYC-verified institution sponsors the agent by signing its ML-DSA-65 public key alongside a locked capability scope. The agent then signs its own relay operations independently, presenting the sponsor's credential as proof of authority. The KXCO relay validates both signatures before accepting any intent — the institution's approval is cryptographically bound to every action the agent takes.
|
|
@@ -162,11 +189,23 @@ Submits a payment intent. `to` is an EVM address or KXCO kid. `amount` is in ARM
|
|
|
162
189
|
|
|
163
190
|
---
|
|
164
191
|
|
|
165
|
-
##
|
|
192
|
+
## The containment model
|
|
193
|
+
|
|
194
|
+
Three properties hold for every agent identity, and they are the reason to use
|
|
195
|
+
this rather than handing an agent a key.
|
|
196
|
+
|
|
197
|
+
**An agent can never widen its own authority.** The capability scope is fixed
|
|
198
|
+
at issuance and enforced relay-side, so an out-of-scope operation is refused
|
|
199
|
+
before it reaches the chain. Compromising the agent does not enlarge what the
|
|
200
|
+
agent may do.
|
|
201
|
+
|
|
202
|
+
**An agent can never mint another agent.** Only a KYC-verified sponsor issues
|
|
203
|
+
an identity, so there is no path from one compromised agent to a population of
|
|
204
|
+
them.
|
|
166
205
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
206
|
+
**Every agent traces to a named, KYC-verified institution.** There is no
|
|
207
|
+
anonymous or self-signed mode, which is what makes an agent's action
|
|
208
|
+
attributable to a legal entity when a supervisor asks who authorised it.
|
|
170
209
|
|
|
171
210
|
---
|
|
172
211
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kxco-pq-agent",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Post-quantum identity for AI agents and autonomous systems: a KYC-verified institution sponsors an ML-DSA-65 keypair and locked capability scope for any agent that cannot pass KYC itself.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"post-quantum",
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
"files": [
|
|
50
50
|
"src",
|
|
51
|
-
"LICENSE"
|
|
51
|
+
"LICENSE",
|
|
52
|
+
"ASSESSMENT.md"
|
|
52
53
|
],
|
|
53
54
|
"engines": {
|
|
54
55
|
"node": ">=20.19"
|
|
@@ -57,7 +58,8 @@
|
|
|
57
58
|
"kxco-post-quantum": "^1.3.0"
|
|
58
59
|
},
|
|
59
60
|
"scripts": {
|
|
60
|
-
"test": "node --test --test-timeout=30000 test/agent.test.js"
|
|
61
|
+
"test": "node --test --test-timeout=30000 test/agent.test.js",
|
|
62
|
+
"evidence": "node scripts/build-evidence.mjs"
|
|
61
63
|
},
|
|
62
64
|
"funding": "https://kxco.ai",
|
|
63
65
|
"publishConfig": {
|