kxco-pq-audit 1.4.0 → 1.4.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/CHANGELOG.md +18 -0
- package/README.md +94 -69
- package/package.json +13 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.4.2
|
|
4
|
+
|
|
5
|
+
Documentation. No source change.
|
|
6
|
+
|
|
7
|
+
The Knightsbridge Law link now points at knightsbridgelaw.com.
|
|
8
|
+
|
|
9
|
+
## 1.4.1
|
|
10
|
+
|
|
11
|
+
Documentation. No source change.
|
|
12
|
+
|
|
13
|
+
**The npm page leads with what the package proves.** The first screen now leads with the tamper-evidence guarantee, the sealed-mode
|
|
14
|
+
throughput, key rotation and the migration dates set by NIST, Executive Order
|
|
15
|
+
14412, OMB M-26-15 and the UK NCSC.
|
|
16
|
+
|
|
17
|
+
A family table maps every KXCO package to the job it does, and a new For
|
|
18
|
+
institutions section sets out the operated services and how to reach us. The
|
|
19
|
+
evidence documents are unchanged and linked from the page.
|
|
20
|
+
|
|
3
21
|
## 1.4.0
|
|
4
22
|
|
|
5
23
|
A log that outlives its signing key can now be verified as one artefact.
|
package/README.md
CHANGED
|
@@ -1,38 +1,32 @@
|
|
|
1
1
|
# kxco-pq-audit
|
|
2
2
|
|
|
3
|
+
**A tamper-evident post-quantum audit trail: any edit, gap or reorder fails verification and names the entry.**
|
|
4
|
+
|
|
3
5
|
[](https://www.npmjs.com/package/kxco-pq-audit)
|
|
6
|
+
[](https://www.npmjs.com/package/kxco-pq-audit)
|
|
7
|
+
[](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/blob/main/CONFORMANCE.md)
|
|
8
|
+
[](https://www.npmjs.com/package/kxco-pq-audit)
|
|
4
9
|
[](https://socket.dev/npm/package/kxco-pq-audit)
|
|
5
10
|
[](./LICENSE)
|
|
6
11
|
[](https://nodejs.org)
|
|
7
12
|
|
|
8
|
-
|
|
13
|
+
Every operation produces a signed entry: an ML-DSA-65 signature, SHA-256 chained to the previous entry. `verify()` replays the entire log, and any gap, reorder or edit breaks the chain or a signature.
|
|
9
14
|
|
|
10
|
-
|
|
15
|
+
- **Tampering is detectable and locatable.** `verify()` replays the log from entry 0 and names the first entry that fails.
|
|
16
|
+
- **Fast enough for real volume.** Sealed mode signs once per run: 46,544 entries a second at 367 bytes an entry, with 10,000 entries verified in 0.11 s, per [Sealed logs](#sealed-logs).
|
|
17
|
+
- **Verifies across key rotation.** Pass every key the log was signed under and it verifies as one artefact, with each entry naming the kid that signed it.
|
|
18
|
+
- **Streams, so size is no limit.** Memory stays bounded by one entry: 50,000 entries verify in 729 ms, per [`log.verify`](#logverifypublickey).
|
|
19
|
+
- **An anchor a regulator can confirm.** Checkpoints on Armature L1 prove that at least N entries existed at a given block height.
|
|
20
|
+
- **Built for auditors.** Evidence for SOC 2 and ISO 27001 controls that a third party can check without trusting the log operator.
|
|
21
|
+
- **Proven underneath.** 1,793 NIST ACVP vectors passed, 0 failed, and 225 interoperability checks against liboqs, Bouncy Castle and the Python reference implementations, 0 failed, in [`kxco-post-quantum`](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/blob/main/CONFORMANCE.md).
|
|
22
|
+
|
|
23
|
+
**The migration has dates.**
|
|
11
24
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- **
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
`registry.npmjs.org/-/npm/v1/attestations/kxco-pq-audit@<version>`.
|
|
18
|
-
- **Bill of materials.** A CycloneDX SBOM is published as a GitHub Release asset
|
|
19
|
-
at `releases/download/v<version>/sbom.cyclonedx.json`, a permanent
|
|
20
|
-
unauthenticated URL. Not an expiring build artifact.
|
|
21
|
-
- **Pinned where it matters.** Third-party dependencies are pinned to exact
|
|
22
|
-
versions, never ranges, so the code that performs the cryptography cannot
|
|
23
|
-
change without a release. Sibling `kxco-*` packages sit on caret ranges
|
|
24
|
-
deliberately: it means a correctness fix in the base package reaches you
|
|
25
|
-
without a release of every package above it. That is not theoretical. When
|
|
26
|
-
`@noble/post-quantum` 0.7.1 was found to fail NIST SLH-DSA verification
|
|
27
|
-
vectors, the revert in the base package propagated here on the next install.
|
|
28
|
-
Every GitHub Action is pinned by 40-character commit SHA.
|
|
29
|
-
- **Conformance underneath.** The cryptography comes from
|
|
30
|
-
[`kxco-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum), which
|
|
31
|
-
is run against **2,103 NIST ACVP vectors: 1,793 passed, 0 failed, 310 skipped** and a **225-check
|
|
32
|
-
cross-implementation interoperability matrix** against liboqs, Bouncy Castle
|
|
33
|
-
and two pure-Python implementations, in both directions and with negative
|
|
34
|
-
controls. Its published tarball also rebuilds bit-for-bit from its own tag,
|
|
35
|
-
verified in CI on every run.
|
|
25
|
+
- **NIST** published [FIPS 203](https://csrc.nist.gov/pubs/fips/203/final), [FIPS 204](https://csrc.nist.gov/pubs/fips/204/final) and [FIPS 205](https://csrc.nist.gov/pubs/fips/205/final) in August 2024.
|
|
26
|
+
- **United States:** [Executive Order 14412](https://www.federalregister.gov/documents/2026/06/25/2026-12909/securing-the-nation-against-advanced-cryptographic-attacks), signed on 22 June 2026, moves federal high-value and high-impact systems to post-quantum key establishment by 31 December 2030 and to post-quantum signatures by 31 December 2031. [OMB M-26-15](https://www.whitehouse.gov/wp-content/uploads/2026/06/M-26-15-Execution-of-the-Migration-to-Post-Quantum-Cryptography.pdf) requires PQC-agile libraries for all new applications.
|
|
27
|
+
- **United Kingdom:** the [NCSC](https://www.ncsc.gov.uk/guidance/pqc-migration-timelines) sets 2028, 2031 and 2035 as its migration milestones.
|
|
28
|
+
|
|
29
|
+
[Quick start](#quick-start) · [Sealed logs](#sealed-logs) · [For institutions](#for-institutions) · [Assessment notes](./ASSESSMENT.md) · [Changelog](./CHANGELOG.md) · [kxco.ai](https://kxco.ai)
|
|
36
30
|
|
|
37
31
|
## When to use this
|
|
38
32
|
|
|
@@ -45,7 +39,7 @@ Designed for:
|
|
|
45
39
|
- SOC 2 and ISO 27001 implementations requiring evidence that access and operations cannot be silently edited
|
|
46
40
|
- Any system where "the log said X happened" must be verifiable by a third party without trusting the log operator
|
|
47
41
|
|
|
48
|
-
|
|
42
|
+
It is a cryptographic integrity primitive: a chain of signed, hash-linked records that proves the log is exactly as written.
|
|
49
43
|
|
|
50
44
|
## Install
|
|
51
45
|
|
|
@@ -57,13 +51,16 @@ npm install kxco-pq-audit
|
|
|
57
51
|
|
|
58
52
|
```js
|
|
59
53
|
import { FileAuditLog } from 'kxco-pq-audit'
|
|
60
|
-
import { KxcoChain } from 'kxco-pq-chain' // optional
|
|
54
|
+
import { KxcoChain } from 'kxco-pq-chain' // optional, for anchoring
|
|
61
55
|
import { mlDsa } from 'kxco-post-quantum'
|
|
62
56
|
|
|
63
57
|
const keypair = mlDsa.ml_dsa65.keygen()
|
|
64
58
|
|
|
65
59
|
// Persist to disk, anchor a checkpoint on Armature L1 every 50 entries
|
|
66
|
-
const chain = new KxcoChain({
|
|
60
|
+
const chain = new KxcoChain({
|
|
61
|
+
identity: institutionIdentity, // a KxcoIdentity from kxco-pq-sdk
|
|
62
|
+
licenceKey: process.env.KXCO_LICENCE_KEY, // the hosted anchoring service
|
|
63
|
+
})
|
|
67
64
|
const log = new FileAuditLog({
|
|
68
65
|
keypair,
|
|
69
66
|
path: './audit.ndjson',
|
|
@@ -84,15 +81,35 @@ const entries = await log.export()
|
|
|
84
81
|
|
|
85
82
|
Chain anchoring is optional. Remove the `chain` and `checkpointEvery` options to run without it.
|
|
86
83
|
|
|
84
|
+
## For institutions
|
|
85
|
+
|
|
86
|
+
The cryptography is free under Apache-2.0, works offline and needs nothing from
|
|
87
|
+
KXCO, now or in ten years. What KXCO sells is the part that has to be operated:
|
|
88
|
+
an answer about the present.
|
|
89
|
+
|
|
90
|
+
| Service | What you get |
|
|
91
|
+
|---|---|
|
|
92
|
+
| Hosted key registry | Whether a key is active, revoked or rotated, answered at verification time |
|
|
93
|
+
| Meta-transaction relay | KXCO validates your signed intent, pays the gas and submits it, so you never hold a token or run a node |
|
|
94
|
+
| On-chain anchoring | A timestamp on Armature L1 that the chain itself has verified |
|
|
95
|
+
| Live revocation | `anchored+live` verification, which confirms the signing key is still trusted now |
|
|
96
|
+
| Support and SLA | Availability commitments, an escalation path and a named contact |
|
|
97
|
+
|
|
98
|
+
Priced in USD, per seat, per year. No tokens, no nodes and no wallets. The line
|
|
99
|
+
between free and paid is set out in
|
|
100
|
+
[LICENCE-PRODUCT.md](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/blob/main/LICENCE-PRODUCT.md).
|
|
101
|
+
|
|
102
|
+
**Talk to us: [admin@kxco.ai](mailto:admin@kxco.ai)** · [kxco.ai](https://kxco.ai)
|
|
103
|
+
|
|
87
104
|
## API
|
|
88
105
|
|
|
89
106
|
### `new AuditLog(options)`
|
|
90
107
|
|
|
91
|
-
In-memory log
|
|
108
|
+
In-memory log, for tests and short-lived processes. Use `FileAuditLog` to persist.
|
|
92
109
|
|
|
93
110
|
| Option | Type | Required | Default | Description |
|
|
94
111
|
|---|---|---|---|---|
|
|
95
|
-
| `keypair` | `{ secretKey, publicKey }` | Yes |
|
|
112
|
+
| `keypair` | `{ secretKey, publicKey }` | Yes | none | ML-DSA-65 keypair from `kxco-post-quantum` |
|
|
96
113
|
| `chain` | `KxcoChain` | No | `null` | Chain instance for checkpoint anchoring |
|
|
97
114
|
| `checkpointEvery` | `number` | No | `100` | Anchor a checkpoint every N entries |
|
|
98
115
|
| `institutionKid` | `string` | No | `null` | Identifier included in checkpoint metadata |
|
|
@@ -119,11 +136,11 @@ Entries are read as a stream and never all at once, and writes go through one ha
|
|
|
119
136
|
|
|
120
137
|
Appends a signed, hash-chained entry.
|
|
121
138
|
|
|
122
|
-
- `operation
|
|
123
|
-
- `metadata
|
|
139
|
+
- `operation`: non-empty string identifying the operation (e.g. `'wire.auth'`, `'key.rotate'`)
|
|
140
|
+
- `metadata`: plain object, serialised into the signed payload
|
|
124
141
|
- Returns the entry object
|
|
125
142
|
|
|
126
|
-
If chain anchoring is configured and the entry count is a multiple of `checkpointEvery`, a fire-and-forget checkpoint is sent to the relay. The `append` call resolves immediately
|
|
143
|
+
If chain anchoring is configured and the entry count is a multiple of `checkpointEvery`, a fire-and-forget checkpoint is sent to the relay. The `append` call resolves immediately, without waiting for the chain.
|
|
127
144
|
|
|
128
145
|
Appending needs the previous entry's hash, not the log, so it costs the same on ten entries and on ten million. Concurrent calls are serialised internally: two appends in flight together cannot take the same `seq`.
|
|
129
146
|
|
|
@@ -136,7 +153,7 @@ Replays the entire log from entry 0. For each entry, checks:
|
|
|
136
153
|
|
|
137
154
|
Returns `{ valid: true, count, kids }` or `{ valid: false, error }` describing the first failure. On a sealed log it checks the chain and every seal instead, and adds `sealedThrough` and `unsealed`.
|
|
138
155
|
|
|
139
|
-
It streams, so memory is bounded by one entry rather than by the log: 50,000 entries verify in 729 ms without holding them.
|
|
156
|
+
It streams, so memory is bounded by one entry rather than by the log: 50,000 entries verify in 729 ms without holding them, per [ASSESSMENT.md](./ASSESSMENT.md).
|
|
140
157
|
|
|
141
158
|
#### Logs that outlive a key rotation
|
|
142
159
|
|
|
@@ -147,7 +164,7 @@ const result = await log.verify([oldKey.publicKey, newKey.publicKey])
|
|
|
147
164
|
// { valid: true, count: 3, kids: ['a1b2…', 'c3d4…'] }
|
|
148
165
|
```
|
|
149
166
|
|
|
150
|
-
Each entry records the `kid` of the key that signed it, so verification selects the right key rather than trying to force one across the whole file. `kids` reports which keys actually signed, in the order first seen
|
|
167
|
+
Each entry records the `kid` of the key that signed it, so verification selects the right key rather than trying to force one across the whole file. `kids` reports which keys actually signed, in the order first seen. More than one means the log spans a rotation.
|
|
151
168
|
|
|
152
169
|
Supply too few keys and the failure names what is missing, rather than reporting a generic bad signature:
|
|
153
170
|
|
|
@@ -155,11 +172,12 @@ Supply too few keys and the failure names what is missing, rather than reporting
|
|
|
155
172
|
entry 0: signed by kid a1b2c3d4e5f60718, which was not among the 1 key(s) supplied
|
|
156
173
|
```
|
|
157
174
|
|
|
158
|
-
Order does not matter. Entries written before 1.4.0 carry no `kid` and are checked against each supplied key in turn, so **older logs verify unchanged
|
|
175
|
+
Order does not matter. Entries written before 1.4.0 carry no `kid` and are checked against each supplied key in turn, so **older logs verify unchanged**, and because `kid` is not part of the signed bytes, logs written by 1.4.0 still verify under 1.3.x.
|
|
159
176
|
|
|
160
177
|
Recording the kid is also what makes a log answerable to the rest of the stack. Before 1.4.0 an entry named no key, so there was nothing to look up. Every `kid` in `kids` is the identifier [`kxco-pq-network`](https://www.npmjs.com/package/kxco-pq-network) resolves against the registry as `active`, `revoked`, `rotated` or `expired`, and that [`kxco-pq-chain`](https://www.npmjs.com/package/kxco-pq-chain)'s `revokeKid()` writes on chain.
|
|
161
178
|
|
|
162
|
-
|
|
179
|
+
Pair `verify()` with that lookup and a log proves both that it is intact and
|
|
180
|
+
that every signing key was trusted: live revocation, from the KXCO network.
|
|
163
181
|
|
|
164
182
|
### `log.seal()`
|
|
165
183
|
|
|
@@ -206,14 +224,14 @@ Sealed logs only. Entries appended since the last seal, without replaying the lo
|
|
|
206
224
|
|
|
207
225
|
## Sealed logs
|
|
208
226
|
|
|
209
|
-
By default every entry carries its own ML-DSA-65 signature. That signature is also the entire cost of the log. Measured
|
|
227
|
+
By default every entry carries its own ML-DSA-65 signature. That signature is also the entire cost of the log. Measured over 10,000 entries, per [ASSESSMENT.md](./ASSESSMENT.md):
|
|
210
228
|
|
|
211
229
|
| | entries/s | bytes/entry | 10k run | verify |
|
|
212
230
|
|---|---|---|---|---|
|
|
213
231
|
| signature per entry | 129 | 4,794 | 45.7 MB | 20.1 s |
|
|
214
232
|
| signature per run | 46,544 | 367 | 3.5 MB | 0.11 s |
|
|
215
233
|
|
|
216
|
-
Of those 4,794 bytes, 4,412 are the signature
|
|
234
|
+
Of those 4,794 bytes, per [ASSESSMENT.md](./ASSESSMENT.md), 4,412 are the base64url-encoded signature, which is why sealed mode is the one for real entry volume.
|
|
217
235
|
|
|
218
236
|
`sealed: true` keeps the hash chain on every entry and moves the signature to the run:
|
|
219
237
|
|
|
@@ -237,44 +255,51 @@ await log.verify(publicKey)
|
|
|
237
255
|
// { valid: true, count: 10002, sealedThrough: 9999, unsealed: 2 }
|
|
238
256
|
```
|
|
239
257
|
|
|
240
|
-
Entries appended since the last seal are chained and
|
|
241
|
-
|
|
242
|
-
What sealing costs you: a single entry can no longer be verified on its own, only as part of its run.
|
|
258
|
+
Entries appended since the last seal are chained and awaiting a signature. `unsealed` reports that window, and `seal()` closes it. A sealed entry verifies as part of its run.
|
|
243
259
|
|
|
244
260
|
`FileAuditLog` writes seals to `<path>.seals`, so a reader that knows only about entries is unaffected.
|
|
245
261
|
|
|
246
262
|
## Chain anchoring
|
|
247
263
|
|
|
248
|
-
When a
|
|
264
|
+
When you pass a chain and set `checkpointEvery`, every Nth entry triggers a call to `chain.anchorAuditRoot({ rootHash, entryCount })` via the KXCO relay.
|
|
249
265
|
|
|
250
266
|
The anchor is fire-and-forget: `append` does not await it, so chain latency never blocks audit operations. If the relay call fails, a warning is written to stderr and the local log continues unaffected.
|
|
251
267
|
|
|
252
268
|
The checkpoint provides an on-chain timestamp proving that at least N entries existed at a specific block height. This supplements the local NDJSON file for long-term tamper evidence, particularly where the log operator and the verifier are separate parties.
|
|
253
269
|
|
|
254
|
-
##
|
|
255
|
-
|
|
256
|
-
An append-only, ML-DSA-65-signed, hash-chained record. **Entries cannot be
|
|
257
|
-
edited or deleted without `verify()` failing and naming the entry** — that is
|
|
258
|
-
the guarantee, and the reason to use it.
|
|
259
|
-
|
|
260
|
-
It writes and verifies a file. Reading is line by line, so index entries into
|
|
261
|
-
your own database if you need search, and checkpoint to Armature L1 when a
|
|
262
|
-
regulator needs an anchor they can confirm on-chain.
|
|
270
|
+
## The KXCO post-quantum family
|
|
263
271
|
|
|
264
|
-
|
|
265
|
-
- [`kxco-pq-attest`](https://www.npmjs.com/package/kxco-pq-attest) for signed envelopes that travel on their own
|
|
266
|
-
|
|
267
|
-
## Part of the KXCO stack
|
|
268
|
-
|
|
269
|
-
| Package | Role |
|
|
272
|
+
| You need to | Install |
|
|
270
273
|
|---|---|
|
|
271
|
-
| [`kxco-
|
|
272
|
-
| [`kxco-
|
|
273
|
-
| [`kxco-pq-
|
|
274
|
-
| [`kxco-pq-
|
|
275
|
-
| [`kxco-pq-
|
|
274
|
+
| Put the whole stack in one install | [`kxco-pq`](https://www.npmjs.com/package/kxco-pq) |
|
|
275
|
+
| Use ML-DSA, ML-KEM and SLH-DSA directly | [`kxco-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum) |
|
|
276
|
+
| Keep signing keys on the HSM you already run | [`kxco-pq-hsm`](https://www.npmjs.com/package/kxco-pq-hsm) |
|
|
277
|
+
| Sign a document or record anyone can verify offline | [`kxco-pq-attest`](https://www.npmjs.com/package/kxco-pq-attest) |
|
|
278
|
+
| Keep a tamper-evident audit trail | [`kxco-pq-audit`](https://www.npmjs.com/package/kxco-pq-audit) |
|
|
279
|
+
| Verify a signature in a browser, with no server | [`kxco-verify`](https://www.npmjs.com/package/kxco-verify) |
|
|
280
|
+
| Issue institution identity credentials | [`kxco-pq-sdk`](https://www.npmjs.com/package/kxco-pq-sdk) |
|
|
281
|
+
| Encrypt files and payloads to one or many recipients | [`kxco-pq-vault`](https://www.npmjs.com/package/kxco-pq-vault) |
|
|
282
|
+
| Encrypt Node streams and WebSockets | [`kxco-pq-tls`](https://www.npmjs.com/package/kxco-pq-tls) |
|
|
283
|
+
| Sign and verify webhooks | [`kxco-post-quantum-webhook`](https://www.npmjs.com/package/kxco-post-quantum-webhook) |
|
|
284
|
+
| Give an AI agent an identity a verified institution sponsors | [`kxco-pq-agent`](https://www.npmjs.com/package/kxco-pq-agent) |
|
|
285
|
+
| Have Armature L1 verify a signature in consensus | [`kxco-pq-chain`](https://www.npmjs.com/package/kxco-pq-chain) |
|
|
286
|
+
| Prove an envelope at three levels, offline to on-chain | [`kxco-pq-network`](https://www.npmjs.com/package/kxco-pq-network) |
|
|
287
|
+
| Generate and rotate keys from a terminal | [`kxco-pq-cli`](https://www.npmjs.com/package/kxco-pq-cli) |
|
|
288
|
+
| Find quantum-vulnerable cryptography in a dependency tree | [`kxco-pq-scan`](https://www.npmjs.com/package/kxco-pq-scan) |
|
|
289
|
+
| Fail the build when code reaches past the wrapper | [`eslint-plugin-kxco-pq`](https://www.npmjs.com/package/eslint-plugin-kxco-pq) |
|
|
290
|
+
|
|
291
|
+
[kxco.ai](https://kxco.ai) · [Knightsbridge Law](https://knightsbridgelaw.com) · [target150.com](https://target150.com)
|
|
292
|
+
|
|
293
|
+
## Release integrity
|
|
276
294
|
|
|
277
|
-
|
|
295
|
+
Each release carries a SLSA provenance attestation tying the published tarball to
|
|
296
|
+
the commit and workflow that built it: verify with `npm audit signatures`, or read
|
|
297
|
+
it from `registry.npmjs.org/-/npm/v1/attestations/kxco-pq-audit@<version>`. A CycloneDX
|
|
298
|
+
SBOM is published as a GitHub Release asset at
|
|
299
|
+
`releases/download/v<version>/sbom.cyclonedx.json`, a permanent unauthenticated
|
|
300
|
+
URL. Sibling `kxco-*` packages sit on caret ranges so a correctness fix in the
|
|
301
|
+
base package reaches you on the next install, with no release of every package
|
|
302
|
+
above it.
|
|
278
303
|
|
|
279
304
|
## Security
|
|
280
305
|
|
|
@@ -282,9 +307,9 @@ regulator needs an anchor they can confirm on-chain.
|
|
|
282
307
|
|
|
283
308
|
Evidenced, and reproducible on your own machine:
|
|
284
309
|
|
|
285
|
-
- **
|
|
286
|
-
- **225 interoperability checks passed, 0 failed
|
|
287
|
-
- **SLSA provenance** on every published release
|
|
310
|
+
- **1,793 NIST ACVP vectors passed, 0 failed** across FIPS 203, 204 and 205, pinned by digest, per [CONFORMANCE.md](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/blob/main/CONFORMANCE.md). The other 310 are pairings the library refuses as weaker than the parameter set
|
|
311
|
+
- **225 interoperability checks passed, 0 failed**, against OpenSSL 3.5, liboqs, Bouncy Castle and dilithium-py/kyber-py, in both directions
|
|
312
|
+
- **SLSA provenance** on every published release: verify with `npm audit signatures`
|
|
288
313
|
- **CycloneDX SBOM** published with each release
|
|
289
314
|
- `npm run evidence` regenerates the whole bundle from source
|
|
290
315
|
|
|
@@ -300,4 +325,4 @@ Apache-2.0 © 2026 KXCO by Knightsbridge
|
|
|
300
325
|
|
|
301
326
|
## Maintainers
|
|
302
327
|
|
|
303
|
-
Shayne Heffernan and John Heffernan
|
|
328
|
+
Shayne Heffernan and John Heffernan, [KXCO by Knightsbridge](https://kxco.ai)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kxco-pq-audit",
|
|
3
|
-
"version": "1.4.
|
|
4
|
-
"description": "Tamper-evident post-quantum audit
|
|
3
|
+
"version": "1.4.2",
|
|
4
|
+
"description": "Tamper-evident post-quantum audit trail for regulated institutions. ML-DSA-65 signed, SHA-256 hash-chained entries: any edit, gap or reorder fails verification and names the entry. 46,544 entries a second sealed, with checkpoints anchored on Armature L1.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"post-quantum",
|
|
7
7
|
"pqc",
|
|
@@ -19,7 +19,17 @@
|
|
|
19
19
|
"integrity",
|
|
20
20
|
"immutable-log",
|
|
21
21
|
"signed-log",
|
|
22
|
-
"sequence"
|
|
22
|
+
"sequence",
|
|
23
|
+
"quantum-safe",
|
|
24
|
+
"pqc-migration",
|
|
25
|
+
"digital-signature",
|
|
26
|
+
"soc2",
|
|
27
|
+
"iso27001",
|
|
28
|
+
"append-only",
|
|
29
|
+
"event-log",
|
|
30
|
+
"non-repudiation",
|
|
31
|
+
"ai-agent",
|
|
32
|
+
"crypto-agility"
|
|
23
33
|
],
|
|
24
34
|
"license": "Apache-2.0",
|
|
25
35
|
"author": "Shayne Heffernan and John Heffernan",
|