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.
Files changed (3) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +94 -69
  3. 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
  [![npm](https://img.shields.io/npm/v/kxco-pq-audit?label=npm&color=b0964f)](https://www.npmjs.com/package/kxco-pq-audit)
6
+ [![downloads](https://img.shields.io/npm/dm/kxco-pq-audit?label=downloads&color=b0964f)](https://www.npmjs.com/package/kxco-pq-audit)
7
+ [![NIST ACVP](https://img.shields.io/badge/NIST_ACVP-1,793_passed,_0_failed-2ea44f)](https://github.com/KnightsbridgeAIQ/kxco-post-quantum/blob/main/CONFORMANCE.md)
8
+ [![npm provenance](https://img.shields.io/badge/npm-provenance-2ea44f)](https://www.npmjs.com/package/kxco-pq-audit)
4
9
  [![Socket](https://socket.dev/api/badge/npm/package/kxco-pq-audit)](https://socket.dev/npm/package/kxco-pq-audit)
5
10
  [![license](https://img.shields.io/badge/license-Apache--2.0-blue)](./LICENSE)
6
11
  [![node](https://img.shields.io/node/v/kxco-pq-audit.svg)](https://nodejs.org)
7
12
 
8
- Tamper-evident post-quantum audit log. Every operation produces an ML-DSA-65-signed entry chained to the previous via SHA-256. `verify()` replays the entire log — any gap, reorder, or edit breaks the chain or a signature.
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
- ## Release integrity
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
- Every release of this package is checkable without asking us for anything.
13
-
14
- - **Provenance.** Each release carries a SLSA provenance attestation tying the
15
- published tarball to the commit and workflow that built it. Verify with
16
- `npm audit signatures`, or read it directly from
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
- This is not a logging framework. It is a cryptographic integrity primitive — a chain of signed, hash-linked records that proves the log has not been tampered with.
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 — omit if not anchoring
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({ endpoint: 'https://relay.kxco.ai' })
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. Entries are lost when the process exits.
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 | — | ML-DSA-65 keypair from `kxco-post-quantum` |
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` — non-empty string identifying the operation (e.g. `'wire.auth'`, `'key.rotate'`)
123
- - `metadata` — plain object, serialised into the signed payload
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 — it does not wait for the chain.
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 — more than one means the log spans a rotation.
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** — and because `kid` is not part of the signed bytes, logs written by 1.4.0 still verify under 1.3.x.
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
- This package does not make that call. `verify()` proves which key signed each entry and that the chain is intact; it will not refuse an entry signed by a since-revoked key, because it does not ask. Putting the two together is the caller's, and it is now possible.
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 here over 10,000 entries:
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. Anything with real entry volume cannot afford one per entry.
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 unsigned. `unsealed` is that window, reported rather than counted as proven. Call `seal()` to close it.
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 `chain` is passed and `checkpointEvery` is set, every Nth entry triggers a call to `chain.anchorAuditRoot({ rootHash, entryCount })` via the KXCO relay.
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
- ## Where this fits
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
- - [`kxco-pq-chain`](https://www.npmjs.com/package/kxco-pq-chain) for the checkpoint anchor
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-post-quantum`](https://www.npmjs.com/package/kxco-post-quantum) | ML-DSA-65 primitives |
272
- | [`kxco-pq-hsm`](https://www.npmjs.com/package/kxco-pq-hsm) | HSM-backed key management |
273
- | [`kxco-pq-attest`](https://www.npmjs.com/package/kxco-pq-attest) | Payload attestation |
274
- | [`kxco-pq-sdk`](https://www.npmjs.com/package/kxco-pq-sdk) | `AuditedHsm` — wires HSM + audit log automatically |
275
- | [`kxco-pq-chain`](https://www.npmjs.com/package/kxco-pq-chain) | Armature L1 relay for checkpoint anchoring |
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
- [kxco.ai](https://kxco.ai) · [Knightsbridge Law](https://knightsbridge.law) · [target150.com](https://target150.com)
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
- - **2,103 NIST ACVP vectors** across FIPS 203, 204 and 205, pinned by digest: 1,793 passed, 0 failed, 310 skipped, where each skip is the library refusing a pre-hash weaker than the parameter set
286
- - **225 interoperability checks passed, 0 failed, 42 not applicable** against OpenSSL 3.5, liboqs, Bouncy Castle and dilithium-py/kyber-py, in both directions
287
- - **SLSA provenance** on every published release — verify with `npm audit signatures`
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 — [KXCO by Knightsbridge](https://kxco.ai)
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.0",
4
- "description": "Tamper-evident post-quantum audit log for regulated institutions. ML-DSA-65-signed, SHA-256 hash-chained entries, so any tampering breaks the chain and shows exactly where. Checkpoint to Armature L1 for an anchor a regulator can confirm on-chain.",
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",