@mcpose/audit 2.0.2 → 3.0.0

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +437 -28
  3. package/dist/chain.d.ts +55 -0
  4. package/dist/chain.d.ts.map +1 -0
  5. package/dist/chain.js +265 -0
  6. package/dist/chain.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +7 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/middleware.d.ts +5 -0
  12. package/dist/middleware.d.ts.map +1 -0
  13. package/dist/middleware.js +488 -0
  14. package/dist/middleware.js.map +1 -0
  15. package/dist/sensitivity.d.ts +12 -0
  16. package/dist/sensitivity.d.ts.map +1 -0
  17. package/dist/sensitivity.js +24 -0
  18. package/dist/sensitivity.js.map +1 -0
  19. package/dist/signingKey.d.ts +11 -0
  20. package/dist/signingKey.d.ts.map +1 -0
  21. package/dist/signingKey.js +30 -0
  22. package/dist/signingKey.js.map +1 -0
  23. package/dist/subjectKeyStore.d.ts +17 -0
  24. package/dist/subjectKeyStore.d.ts.map +1 -0
  25. package/dist/subjectKeyStore.js +37 -0
  26. package/dist/subjectKeyStore.js.map +1 -0
  27. package/dist/types.d.ts +244 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +2 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/verify.d.ts +24 -0
  32. package/dist/verify.d.ts.map +1 -0
  33. package/dist/verify.js +50 -0
  34. package/dist/verify.js.map +1 -0
  35. package/package.json +43 -14
  36. package/src/__tests__/chain.batch.test.ts +30 -0
  37. package/src/__tests__/chain.test.ts +399 -0
  38. package/src/__tests__/erasable.test.ts +499 -0
  39. package/src/__tests__/merkle-batch.middleware.test.ts +96 -0
  40. package/src/__tests__/middleware.http.test.ts +172 -0
  41. package/src/__tests__/middleware.robustness.test.ts +737 -0
  42. package/src/__tests__/middleware.test.ts +1121 -0
  43. package/src/__tests__/properties.test.ts +737 -0
  44. package/src/__tests__/sensitivity.test.ts +72 -0
  45. package/src/__tests__/signingKey.test.ts +76 -0
  46. package/src/chain.ts +317 -0
  47. package/src/index.ts +31 -0
  48. package/src/middleware.ts +690 -0
  49. package/src/sensitivity.ts +33 -0
  50. package/src/signingKey.ts +35 -0
  51. package/src/subjectKeyStore.ts +38 -0
  52. package/src/types.ts +281 -0
  53. package/src/verify.ts +76 -0
package/dist/chain.js ADDED
@@ -0,0 +1,265 @@
1
+ import { createHash, createHmac } from 'node:crypto';
2
+ // ── Canonical serialization ────────────────────────────────────────────────────
3
+ //
4
+ // v1 hashed `JSON.stringify` output, which made object-key insertion order
5
+ // load-bearing: an independently written verifier that reconstructed the
6
+ // fields in a different order failed on every chainHash. v2 hashes a
7
+ // canonical form instead — lexicographically sorted keys at every depth —
8
+ // so only the field SET matters. See ADR-0004.
9
+ /**
10
+ * Canonical JSON: object keys sorted lexicographically at every depth,
11
+ * `undefined`-valued keys skipped. Throws on values with no canonical JSON
12
+ * form (BigInt, function, symbol, circular references).
13
+ *
14
+ * Use for data the audit layer controls (chain preimages, manifest
15
+ * payloads). For arbitrary caller payloads use {@link stableStringify}.
16
+ */
17
+ export function canonicalJson(value) {
18
+ return serialize(value, new Set(), { strict: true });
19
+ }
20
+ /**
21
+ * Total variant of {@link canonicalJson} for arbitrary caller payloads:
22
+ * never throws. Circular references become `"[Circular]"`, BigInt becomes
23
+ * its decimal string. Used for `inputHash`/`outputHash`, so two
24
+ * semantically identical payloads hash identically regardless of the
25
+ * client's JSON key order.
26
+ */
27
+ export function stableStringify(value) {
28
+ return serialize(value, new Set(), { strict: false });
29
+ }
30
+ function serialize(value, seen, opts) {
31
+ if (value === null || value === undefined)
32
+ return 'null';
33
+ switch (typeof value) {
34
+ case 'string':
35
+ case 'number':
36
+ case 'boolean':
37
+ return JSON.stringify(value);
38
+ case 'bigint':
39
+ if (opts.strict) {
40
+ throw new TypeError('canonicalJson: BigInt has no canonical JSON form');
41
+ }
42
+ return JSON.stringify(value.toString());
43
+ case 'function':
44
+ case 'symbol':
45
+ if (opts.strict) {
46
+ throw new TypeError(`canonicalJson: ${typeof value} has no canonical JSON form`);
47
+ }
48
+ return 'null';
49
+ }
50
+ const obj = value;
51
+ if (seen.has(obj)) {
52
+ if (opts.strict) {
53
+ throw new TypeError('canonicalJson: circular reference');
54
+ }
55
+ return '"[Circular]"';
56
+ }
57
+ seen.add(obj);
58
+ try {
59
+ if (Array.isArray(obj)) {
60
+ return `[${obj.map((item) => serialize(item, seen, opts)).join(',')}]`;
61
+ }
62
+ if (typeof obj.toJSON === 'function') {
63
+ return serialize(obj.toJSON(), seen, opts);
64
+ }
65
+ const entries = Object.entries(obj)
66
+ .filter(([, v]) => v !== undefined)
67
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
68
+ .map(([k, v]) => `${JSON.stringify(k)}:${serialize(v, seen, opts)}`);
69
+ return `{${entries.join(',')}}`;
70
+ }
71
+ finally {
72
+ seen.delete(obj);
73
+ }
74
+ }
75
+ // ── Hash primitives ────────────────────────────────────────────────────────────
76
+ export function sha256hex(data) {
77
+ return createHash('sha256').update(data).digest('hex');
78
+ }
79
+ function hmacSha256hex(data, key) {
80
+ return createHmac('sha256', key).update(data).digest('hex');
81
+ }
82
+ // ── HMAC chain ─────────────────────────────────────────────────────────────────
83
+ const DOMAIN_CHAIN_HASH = 'mcpose/v2/chain';
84
+ /**
85
+ * The exact fields of an audit event that the chain covers, extracted from
86
+ * the event. Used by both the producer (middleware) and any verifier
87
+ * ({@link verifyAuditChain}) so the two cannot drift.
88
+ *
89
+ * NOT covered (bound only via inputHash/outputHash): the raw/encrypted
90
+ * payloads.
91
+ */
92
+ export function chainPreimageFields(event) {
93
+ return {
94
+ id: event.id,
95
+ startedAt: event.startedAt,
96
+ endedAt: event.endedAt,
97
+ ...(event.sessionId === undefined ? {} : { sessionId: event.sessionId }),
98
+ ...(event.delegatedFrom === undefined
99
+ ? {}
100
+ : { delegatedFrom: event.delegatedFrom }),
101
+ // Required on every event, so it is a plain always-present field rather
102
+ // than an omission-guarded optional one (ADR-0019). Under the omission
103
+ // pattern an event with no proxy and one whose proxy was stripped hashed
104
+ // identically, so removing recorded provenance was undetectable.
105
+ proxy: event.proxy,
106
+ ...(event.kind === undefined ? {} : { kind: event.kind }),
107
+ // Optional, omitted when absent (ADR-0012), so a default-mode event keeps
108
+ // the preimage it had before erasable mode existed. Covering it is what
109
+ // stops a stored event being reinterpreted under the other hash scheme:
110
+ // adding or stripping the marker breaks verification at that index
111
+ // (ADR-0018).
112
+ ...(event.erasable === undefined ? {} : { erasable: event.erasable }),
113
+ identity: event.identity,
114
+ tool: event.tool,
115
+ duration_ms: event.duration_ms,
116
+ outcome: event.outcome,
117
+ // Required on every event, so it is a plain always-present field rather
118
+ // than an omission-guarded optional one (ADR-0015).
119
+ sensitivityTier: event.sensitivityTier,
120
+ ...(event.rejectionReason === undefined
121
+ ? {}
122
+ : { rejectionReason: event.rejectionReason }),
123
+ ...(event.error === undefined ? {} : { error: event.error }),
124
+ inputHash: event.inputHash,
125
+ outputHash: event.outputHash,
126
+ replayManifestPosition: event.replayManifestPosition,
127
+ };
128
+ }
129
+ /**
130
+ * `HMAC-SHA256(chainKey, canonicalJson({domain, prevChainHash, event}))`.
131
+ * Domain-separated and canonically framed: neither field order nor
132
+ * string-concatenation ambiguity can affect the hash. The entry is
133
+ * serialized without its own chainHash. First entry uses `prevChainHash: ''`.
134
+ */
135
+ export function computeChainHash(entryWithoutChainHash, prevChainHash, chainKey) {
136
+ const preimage = canonicalJson({
137
+ domain: DOMAIN_CHAIN_HASH,
138
+ prevChainHash,
139
+ event: entryWithoutChainHash,
140
+ });
141
+ return hmacSha256hex(preimage, chainKey);
142
+ }
143
+ // ── Merkle tree ────────────────────────────────────────────────────────────────
144
+ //
145
+ // Leaves and internal nodes are domain-separated so an internal node can
146
+ // never be replayed as a leaf (second-preimage hardening). Odd layers
147
+ // duplicate the last node; ambiguity from that padding is neutralized by
148
+ // the signed `eventCount` in the manifest payload.
149
+ const LEAF_TAG = 'mcpose/v2/leaf\0';
150
+ const NODE_TAG = 'mcpose/v2/node\0';
151
+ function leafHash(chainHash) {
152
+ return sha256hex(LEAF_TAG + chainHash);
153
+ }
154
+ function nodeHash(left, right) {
155
+ return sha256hex(NODE_TAG + left + right);
156
+ }
157
+ function nextLayer(layer) {
158
+ const next = [];
159
+ for (let i = 0; i < layer.length; i += 2) {
160
+ // `i < layer.length` guarantees `left`; a missing right sibling means an
161
+ // odd layer, whose last node is duplicated (ADR-0004) — same padding as
162
+ // `computeMerkleProof` and `computeMerkleRootAndProofs`.
163
+ const left = layer[i];
164
+ const right = layer[i + 1] ?? left;
165
+ next.push(nodeHash(left, right));
166
+ }
167
+ return next;
168
+ }
169
+ /** Merkle root over the events' `chainHash` values. Empty → `sha256('')`. */
170
+ export function computeMerkleRoot(hashes) {
171
+ if (hashes.length === 0)
172
+ return sha256hex('');
173
+ let layer = hashes.map(leafHash);
174
+ while (layer.length > 1) {
175
+ layer = nextLayer(layer);
176
+ }
177
+ // `hashes` is non-empty here and the loop exits only at length 1.
178
+ return layer[0];
179
+ }
180
+ export function computeMerkleProof(hashes, index) {
181
+ if (!Number.isInteger(index) || index < 0 || index >= hashes.length) {
182
+ throw new RangeError(`computeMerkleProof: index ${index} out of range for ${hashes.length} leaves`);
183
+ }
184
+ const siblings = [];
185
+ const directions = [];
186
+ let layer = hashes.map(leafHash);
187
+ let idx = index;
188
+ while (layer.length > 1) {
189
+ const siblingIdx = idx % 2 === 0 ? idx + 1 : idx - 1;
190
+ // A sibling past the end means an odd layer whose last node is
191
+ // duplicated, and `idx` is then that last node — same padding as
192
+ // `nextLayer`, which must stay identical. `idx` is always in range.
193
+ siblings.push(layer[siblingIdx] ?? layer[idx]);
194
+ directions.push(idx % 2 === 0 ? 'right' : 'left');
195
+ layer = nextLayer(layer);
196
+ idx = Math.floor(idx / 2);
197
+ }
198
+ return { index, siblings, directions };
199
+ }
200
+ function proofFromLayers(index, layers) {
201
+ const siblings = [];
202
+ const directions = [];
203
+ let idx = index;
204
+ for (let level = 0; level < layers.length - 1; level++) {
205
+ const layer = layers[level];
206
+ const siblingIdx = idx % 2 === 0 ? idx + 1 : idx - 1;
207
+ siblings.push(layer[siblingIdx] ?? layer[idx]);
208
+ directions.push(idx % 2 === 0 ? 'right' : 'left');
209
+ idx = Math.floor(idx / 2);
210
+ }
211
+ return { index, siblings, directions };
212
+ }
213
+ /** Build a manifest root and every proof from the same set of tree layers. */
214
+ export function computeMerkleRootAndProofs(hashes) {
215
+ if (hashes.length === 0) {
216
+ return { merkleRoot: sha256hex(''), merkleProofs: [] };
217
+ }
218
+ const layers = [hashes.map(leafHash)];
219
+ while (layers[layers.length - 1].length > 1) {
220
+ layers.push(nextLayer(layers[layers.length - 1]));
221
+ }
222
+ return {
223
+ merkleRoot: layers[layers.length - 1][0],
224
+ merkleProofs: hashes.map((_, index) => proofFromLayers(index, layers)),
225
+ };
226
+ }
227
+ /**
228
+ * Verifies a Merkle proof for an event's `chainHash` (the raw chain hash —
229
+ * the leaf tag is applied internally).
230
+ *
231
+ * Rejects malformed proofs: `siblings`/`directions` length mismatch,
232
+ * directions inconsistent with `proof.index` (each level's direction is
233
+ * fully determined by the index), or an index that the path cannot
234
+ * represent (`index >= 2 ** siblings.length`, which leaves high bits
235
+ * unconsumed after traversal).
236
+ */
237
+ export function verifyMerkleProof(leafChainHash, proof, root) {
238
+ if (!Number.isSafeInteger(proof.index) ||
239
+ proof.index < 0 ||
240
+ proof.siblings.length !== proof.directions.length) {
241
+ return false;
242
+ }
243
+ let current = leafHash(leafChainHash);
244
+ let idx = proof.index;
245
+ for (let i = 0; i < proof.siblings.length; i++) {
246
+ const expectedDir = idx % 2 === 0 ? 'right' : 'left';
247
+ if (proof.directions[i] !== expectedDir)
248
+ return false;
249
+ const sibling = proof.siblings[i];
250
+ // A hole in a caller-supplied `siblings` array is a malformed proof.
251
+ if (sibling === undefined)
252
+ return false;
253
+ current =
254
+ expectedDir === 'right'
255
+ ? nodeHash(current, sibling)
256
+ : nodeHash(sibling, current);
257
+ idx = Math.floor(idx / 2);
258
+ }
259
+ // Bits left over mean the claimed position lies outside a tree of this
260
+ // depth: a two-leaf proof for position 0 must not also verify at 2 or 4.
261
+ if (idx !== 0)
262
+ return false;
263
+ return current === root;
264
+ }
265
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type { SensitivityTier, SensitivityResolverFn, SensitivityOverrideFn, SigningKeyProvider, SubjectKeyStore, SubjectKeyTombstone, AuditEventBase, LowAuditEvent, MediumAuditEvent, HighAuditEvent, AuditEvent, MerkleProof, ReplayManifest, AuditOptions, AuditMiddlewareHandle, } from './types.js';
2
+ export { createSensitivityResolver } from './sensitivity.js';
3
+ export { createDefaultSigningKeyProvider } from './signingKey.js';
4
+ export { createInMemorySubjectKeyStore } from './subjectKeyStore.js';
5
+ export { createAuditMiddleware } from './middleware.js';
6
+ export { computeMerkleRoot, computeMerkleProof, verifyMerkleProof, canonicalJson, stableStringify, } from './chain.js';
7
+ export type { ChainVerification } from './verify.js';
8
+ export { verifyAuditChain, verifyManifestSignature } from './verify.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { createSensitivityResolver } from './sensitivity.js';
2
+ export { createDefaultSigningKeyProvider } from './signingKey.js';
3
+ export { createInMemorySubjectKeyStore } from './subjectKeyStore.js';
4
+ export { createAuditMiddleware } from './middleware.js';
5
+ export { computeMerkleRoot, computeMerkleProof, verifyMerkleProof, canonicalJson, stableStringify, } from './chain.js';
6
+ export { verifyAuditChain, verifyManifestSignature } from './verify.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AuditMiddlewareHandle, AuditOptions, ReplayManifest } from './types.js';
2
+ export declare function createAuditMiddleware(options: AuditOptions): AuditMiddlewareHandle;
3
+ /** Rebuilds the exact signed payload for a manifest (used by verifiers). */
4
+ export declare function manifestSigningPayload(manifest: Omit<ReplayManifest, 'signature'>): string;
5
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qBAAqB,EACrB,YAAY,EACZ,cAAc,EAEf,MAAM,YAAY,CAAC;AAkJpB,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,YAAY,GACpB,qBAAqB,CA0XvB;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,GAC1C,MAAM,CA8BR"}