@mcpose/audit 2.0.0 → 2.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/README.md +120 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +27 -10
- package/dist/middleware.js.map +1 -1
- package/package.json +11 -20
- package/LICENSE +0 -21
- package/dist/__tests__/middleware.test.d.ts +0 -2
- package/dist/__tests__/middleware.test.d.ts.map +0 -1
- package/dist/__tests__/middleware.test.js +0 -152
- package/dist/__tests__/middleware.test.js.map +0 -1
- package/dist/__tests__/sensitivity.test.d.ts +0 -2
- package/dist/__tests__/sensitivity.test.d.ts.map +0 -1
- package/dist/__tests__/sensitivity.test.js +0 -27
- package/dist/__tests__/sensitivity.test.js.map +0 -1
- package/dist/__tests__/signingKey.test.d.ts +0 -2
- package/dist/__tests__/signingKey.test.d.ts.map +0 -1
- package/dist/__tests__/signingKey.test.js +0 -37
- package/dist/__tests__/signingKey.test.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# @mcpose/audit
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@mcpose/audit)
|
|
4
|
+
[](https://github.com/amir-gorji/mcpose/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
**Tamper-evident audit middleware for [mcpose](https://www.npmjs.com/package/mcpose).**
|
|
7
|
+
|
|
8
|
+
`@mcpose/audit` turns every tool call flowing through an mcpose proxy into a tamper-evident **audit event**: HMAC-chained to its predecessor, hashed, and — for high-sensitivity calls — encrypted at rest. When a **session** closes, it emits a signed **replay manifest** with a Merkle root and per-event proofs, so any third party can verify that a single event happened without access to the full log.
|
|
9
|
+
|
|
10
|
+
## When to reach for it
|
|
11
|
+
|
|
12
|
+
You operate an MCP server in a regulated environment (e.g. financial services) and need to prove, after the fact, exactly which tool calls happened, by whom, in what order — with cryptographic evidence that the record has not been altered, inserted into, or truncated.
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @mcpose/audit mcpose
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`mcpose` is a peer dependency. Requires Node.js 18+ (uses `node:crypto`).
|
|
21
|
+
|
|
22
|
+
## Quick start
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import {
|
|
26
|
+
createAuditMiddleware,
|
|
27
|
+
createDefaultSigningKeyProvider,
|
|
28
|
+
createSensitivityResolver,
|
|
29
|
+
} from '@mcpose/audit';
|
|
30
|
+
import { startHttpProxy } from 'mcpose';
|
|
31
|
+
|
|
32
|
+
// Supplied by your application:
|
|
33
|
+
// backend — an mcpose BackendClient (see `mcpose` docs)
|
|
34
|
+
// auditLog — your durable sink for audit events
|
|
35
|
+
// manifestStore — your durable sink for replay manifests
|
|
36
|
+
// piiMW — an upstream redaction middleware
|
|
37
|
+
// extractJwt — your resolveIdentity function
|
|
38
|
+
|
|
39
|
+
// The signing secret never leaves the process; all subkeys derive from it.
|
|
40
|
+
const signingKey = createDefaultSigningKeyProvider(process.env.AUDIT_SECRET!);
|
|
41
|
+
|
|
42
|
+
// Map tools to a sensitivity tier. Unknown tools resolve to 'high'.
|
|
43
|
+
const sensitivityResolver = createSensitivityResolver({
|
|
44
|
+
get_balance: 'low',
|
|
45
|
+
search_trades: 'medium',
|
|
46
|
+
transfer_funds: 'high',
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const auditHandle = createAuditMiddleware({
|
|
50
|
+
signingKey,
|
|
51
|
+
sensitivityResolver,
|
|
52
|
+
onEvent: (event) => auditLog.append(event),
|
|
53
|
+
onManifest: (manifest) => manifestStore.save(manifest),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
await startHttpProxy(
|
|
57
|
+
backend,
|
|
58
|
+
{ toolMiddleware: [piiMW, auditHandle.middleware] },
|
|
59
|
+
{
|
|
60
|
+
resolveIdentity: extractJwt,
|
|
61
|
+
// Flush the replay manifest when the session ends.
|
|
62
|
+
onSessionClosed: (sessionId) => auditHandle.closeSession(sessionId),
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## How it works
|
|
68
|
+
|
|
69
|
+
- **Audit event** — a record of one tool call: `identity`, `tool`, `outcome`, input/output hashes, and a `chainHash` linking it to the previous event. `AuditEvent` is a discriminated union on `sensitivityTier`.
|
|
70
|
+
- **Sensitivity tier** (`low` | `medium` | `high`) — decides whether the event stores plaintext (`inputRaw`/`outputRaw`) or AES-256-GCM ciphertext (`inputEncrypted`/`outputEncrypted`). Unknown tools default to `high`.
|
|
71
|
+
- **Replay manifest** — produced at session close: a Merkle root over every event's `chainHash`, individual `MerkleProof`s, and a signature over the root. Proves *what happened*; it does not re-execute calls.
|
|
72
|
+
|
|
73
|
+
## Security model
|
|
74
|
+
|
|
75
|
+
The append-only HMAC chain makes insertion, deletion, or reordering of events detectable; the signed Merkle root anchors the whole session; high-tier payloads are encrypted at rest.
|
|
76
|
+
|
|
77
|
+
> **The signing secret is the root of all of it.** The per-entry **chain key** and the per-event AES **encryption root** are derived from the secret *through* the `SigningKeyProvider.sign()` oracle with domain separation — never from the public **key id**. The key id (`ReplayManifest.signedBy`) is a public identifier only; **never use it as key material**, and never hand-roll the chain or encryption keys. See **[ADR-0003](https://github.com/amir-gorji/mcpose/blob/main/docs/adr/0003-audit-subkeys-derived-from-signing-oracle.md)** for the reasoning and the attack it closes.
|
|
78
|
+
|
|
79
|
+
For production, implement `SigningKeyProvider` against your KMS rather than holding the secret in process. `createDefaultSigningKeyProvider` is HMAC-SHA256 in-process signing, suitable for development and single-trust deployments.
|
|
80
|
+
|
|
81
|
+
## API surface
|
|
82
|
+
|
|
83
|
+
| Export | Purpose |
|
|
84
|
+
|---|---|
|
|
85
|
+
| `createAuditMiddleware(options)` | Returns `{ middleware, closeSession }`. Add `middleware` to the pipeline; call `closeSession(sessionId)` to emit the manifest. |
|
|
86
|
+
| `createSensitivityResolver(map, override?)` | Build a `SensitivityResolverFn`; `override` takes precedence over the static map. |
|
|
87
|
+
| `createDefaultSigningKeyProvider(secret)` | In-process HMAC-SHA256 `SigningKeyProvider`. |
|
|
88
|
+
| `computeMerkleRoot` · `computeMerkleProof` · `verifyMerkleProof` | Low-level Merkle helpers for independent verification. |
|
|
89
|
+
|
|
90
|
+
**Key types:** `AuditEvent` (`LowAuditEvent` \| `MediumAuditEvent` \| `HighAuditEvent`), `AuditEventBase`, `SensitivityTier`, `SensitivityResolverFn`, `SigningKeyProvider`, `AuditOptions`, `AuditMiddlewareHandle`, `ReplayManifest`, `MerkleProof`, `CostMetadata`.
|
|
91
|
+
|
|
92
|
+
### `AuditOptions`
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
interface AuditOptions {
|
|
96
|
+
signingKey: SigningKeyProvider;
|
|
97
|
+
sensitivityResolver: SensitivityResolverFn;
|
|
98
|
+
onEvent: (event: AuditEvent) => void | Promise<void>;
|
|
99
|
+
onManifest?: (manifest: ReplayManifest) => void | Promise<void>;
|
|
100
|
+
hashAlgorithm?: 'SHA-256'; // default: SHA-256
|
|
101
|
+
includeRejections?: boolean; // default: true
|
|
102
|
+
includeCost?: boolean; // default: true
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`closeSession(sessionId)` returns `undefined` if the session had no events or is unknown. Wire it to `HttpProxyOptions.onSessionClosed`.
|
|
107
|
+
|
|
108
|
+
## Testing
|
|
109
|
+
|
|
110
|
+
Verify chains and manifests in your test suite with [`@mcpose/testing`](https://www.npmjs.com/package/@mcpose/testing) — `assertAuditChainIntegrity`, `assertReplayManifestValid`, `assertPiiRedacted`.
|
|
111
|
+
|
|
112
|
+
## Documentation
|
|
113
|
+
|
|
114
|
+
- [Full README & API reference](https://github.com/amir-gorji/mcpose#mcposeaudit)
|
|
115
|
+
- [ADR-0003 — audit subkeys derived from the signing oracle](https://github.com/amir-gorji/mcpose/blob/main/docs/adr/0003-audit-subkeys-derived-from-signing-oracle.md)
|
|
116
|
+
- [CONTEXT.md](https://github.com/amir-gorji/mcpose/blob/main/CONTEXT.md) — canonical domain glossary
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
MIT © Amir Gorji
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qBAAqB,EACrB,YAAY,EAKb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qBAAqB,EACrB,YAAY,EAKb,MAAM,YAAY,CAAC;AAuCpB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,qBAAqB,CAyGlF"}
|
package/dist/middleware.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { createCipheriv, randomBytes,
|
|
1
|
+
import { createCipheriv, randomBytes, createHmac } from 'node:crypto';
|
|
2
2
|
import { computeChainHash, computeMerkleProof, computeMerkleRoot, sha256hex } from './chain.js';
|
|
3
|
+
// Domain-separation labels for subkey derivation. The version segment lets the
|
|
4
|
+
// derivation scheme rotate without colliding with chains written under an old scheme.
|
|
5
|
+
const DOMAIN_CHAIN = Buffer.from('mcpose/v1/chain');
|
|
6
|
+
const DOMAIN_ENC = Buffer.from('mcpose/v1/enc');
|
|
3
7
|
function aesEncrypt(plaintext, key) {
|
|
4
8
|
const iv = randomBytes(12);
|
|
5
9
|
const cipher = createCipheriv('aes-256-gcm', key.subarray(0, 32), iv);
|
|
@@ -7,8 +11,8 @@ function aesEncrypt(plaintext, key) {
|
|
|
7
11
|
const tag = cipher.getAuthTag();
|
|
8
12
|
return Buffer.concat([iv, tag, encrypted]).toString('base64');
|
|
9
13
|
}
|
|
10
|
-
function deriveEventKey(
|
|
11
|
-
return
|
|
14
|
+
function deriveEventKey(encRoot, eventId) {
|
|
15
|
+
return createHmac('sha256', encRoot).update(eventId).digest();
|
|
12
16
|
}
|
|
13
17
|
function anonymousIdentity() {
|
|
14
18
|
return {
|
|
@@ -22,11 +26,24 @@ function anonymousIdentity() {
|
|
|
22
26
|
}
|
|
23
27
|
export function createAuditMiddleware(options) {
|
|
24
28
|
const sessions = new Map();
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
+
// Private subkeys, derived once from the signing secret THROUGH the oracle with
|
|
30
|
+
// domain separation. The provider never exposes raw key bytes, and keyId must
|
|
31
|
+
// NOT be used as key material — keyId is a public identifier, published in
|
|
32
|
+
// ReplayManifest.signedBy. sign() is HMAC-SHA256 per the SigningKeyProvider
|
|
33
|
+
// contract, hence a PRF suitable for key derivation.
|
|
34
|
+
// chainKey — keys the per-entry HMAC chain (forgery resistance)
|
|
35
|
+
// encRoot — root for per-event AES-256 keys (high-tier confidentiality)
|
|
36
|
+
// Cache the promise so concurrent first calls share one derivation.
|
|
37
|
+
let subkeys;
|
|
38
|
+
const deriveSubkeys = () => (subkeys ?? (subkeys = (async () => {
|
|
39
|
+
const [chainKey, encRoot] = await Promise.all([
|
|
40
|
+
options.signingKey.sign(DOMAIN_CHAIN),
|
|
41
|
+
options.signingKey.sign(DOMAIN_ENC),
|
|
42
|
+
]);
|
|
43
|
+
return { chainKey, encRoot };
|
|
44
|
+
})()));
|
|
29
45
|
const middleware = async (req, next, ctx) => {
|
|
46
|
+
const { chainKey, encRoot } = await deriveSubkeys();
|
|
30
47
|
const start = Date.now();
|
|
31
48
|
const identity = ctx.identity ?? anonymousIdentity();
|
|
32
49
|
const sessionId = ctx.sessionId;
|
|
@@ -57,7 +74,7 @@ export function createAuditMiddleware(options) {
|
|
|
57
74
|
ctx, identity, tool, args, result: undefined,
|
|
58
75
|
duration_ms: Date.now() - start, outcome, position,
|
|
59
76
|
prevChainHash: session?.prevChainHash ?? '',
|
|
60
|
-
tier, chainKey,
|
|
77
|
+
tier, chainKey, encRoot,
|
|
61
78
|
});
|
|
62
79
|
advanceSession(session, event);
|
|
63
80
|
await options.onEvent(event);
|
|
@@ -68,7 +85,7 @@ export function createAuditMiddleware(options) {
|
|
|
68
85
|
ctx, identity, tool, args, result,
|
|
69
86
|
duration_ms: Date.now() - start, outcome, position,
|
|
70
87
|
prevChainHash: session?.prevChainHash ?? '',
|
|
71
|
-
tier, chainKey,
|
|
88
|
+
tier, chainKey, encRoot,
|
|
72
89
|
});
|
|
73
90
|
advanceSession(session, event);
|
|
74
91
|
await options.onEvent(event);
|
|
@@ -124,7 +141,7 @@ function buildEvent(p) {
|
|
|
124
141
|
const chainHash = computeChainHash(stableFields, p.prevChainHash, p.chainKey);
|
|
125
142
|
const base = { ...stableFields, chainHash };
|
|
126
143
|
if (p.tier === 'high') {
|
|
127
|
-
const eventKey = deriveEventKey(p.
|
|
144
|
+
const eventKey = deriveEventKey(p.encRoot, base.id);
|
|
128
145
|
return {
|
|
129
146
|
...base,
|
|
130
147
|
sensitivityTier: 'high',
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcpose/audit",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Integrity-chained audit middleware for mcpose — HMAC chain, Merkle proofs, ReplayManifest",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,18 +11,8 @@
|
|
|
11
11
|
"default": "./dist/index.js"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"files": [
|
|
15
|
-
|
|
16
|
-
"README.md"
|
|
17
|
-
],
|
|
18
|
-
"keywords": [
|
|
19
|
-
"mcp",
|
|
20
|
-
"audit",
|
|
21
|
-
"compliance",
|
|
22
|
-
"fintech",
|
|
23
|
-
"hmac",
|
|
24
|
-
"merkle"
|
|
25
|
-
],
|
|
14
|
+
"files": ["dist", "README.md"],
|
|
15
|
+
"keywords": ["mcp", "audit", "compliance", "fintech", "hmac", "merkle"],
|
|
26
16
|
"author": "Amir Gorji",
|
|
27
17
|
"license": "MIT",
|
|
28
18
|
"repository": {
|
|
@@ -30,6 +20,12 @@
|
|
|
30
20
|
"url": "git+https://github.com/amir-gorji/mcpose.git",
|
|
31
21
|
"directory": "packages/audit"
|
|
32
22
|
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc -p tsconfig.build.json",
|
|
25
|
+
"ts:ci": "tsc --noEmit",
|
|
26
|
+
"test": "vitest run --passWithNoTests",
|
|
27
|
+
"prepublishOnly": "pnpm run ts:ci && pnpm run test && pnpm run build"
|
|
28
|
+
},
|
|
33
29
|
"peerDependencies": {
|
|
34
30
|
"mcpose": ">=2.0.0"
|
|
35
31
|
},
|
|
@@ -37,11 +33,6 @@
|
|
|
37
33
|
"@types/node": "^22.0.0",
|
|
38
34
|
"typescript": "^5.0.0",
|
|
39
35
|
"vitest": "^3.0.0",
|
|
40
|
-
"mcpose": "
|
|
41
|
-
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"build": "tsc -p tsconfig.build.json",
|
|
44
|
-
"ts:ci": "tsc --noEmit",
|
|
45
|
-
"test": "vitest run --passWithNoTests"
|
|
36
|
+
"mcpose": "workspace:*"
|
|
46
37
|
}
|
|
47
|
-
}
|
|
38
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Amir Gorji
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createAuditMiddleware } from '../middleware.js';
|
|
3
|
-
import { createDefaultSigningKeyProvider } from '../signingKey.js';
|
|
4
|
-
import { createSensitivityResolver } from '../sensitivity.js';
|
|
5
|
-
import { createProxyContext } from 'mcpose';
|
|
6
|
-
const identity = {
|
|
7
|
-
sub: 'user-1',
|
|
8
|
-
type: 'human',
|
|
9
|
-
roles: ['analyst'],
|
|
10
|
-
claims: {},
|
|
11
|
-
resolvedAt: '2026-06-01T00:00:00.000Z',
|
|
12
|
-
source: 'jwt',
|
|
13
|
-
};
|
|
14
|
-
function makeOptions(overrides = {}) {
|
|
15
|
-
return {
|
|
16
|
-
signingKey: createDefaultSigningKeyProvider('test-secret'),
|
|
17
|
-
sensitivityResolver: createSensitivityResolver({ search: 'low', transfer: 'high' }),
|
|
18
|
-
onEvent: vi.fn(),
|
|
19
|
-
...overrides,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function makeCtx(sessionId) {
|
|
23
|
-
return createProxyContext({ transport: 'http', identity, sessionId });
|
|
24
|
-
}
|
|
25
|
-
function makeReq(tool, args = {}) {
|
|
26
|
-
return {
|
|
27
|
-
method: 'tools/call',
|
|
28
|
-
params: { name: tool, arguments: args },
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
describe('createAuditMiddleware — tracer bullet', () => {
|
|
32
|
-
it('calls onEvent after a successful tool call', async () => {
|
|
33
|
-
const onEvent = vi.fn();
|
|
34
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent }));
|
|
35
|
-
const ctx = makeCtx('session-1');
|
|
36
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
37
|
-
expect(onEvent).toHaveBeenCalledOnce();
|
|
38
|
-
const event = onEvent.mock.calls[0][0];
|
|
39
|
-
expect(event.tool).toBe('search');
|
|
40
|
-
expect(event.outcome).toBe('success');
|
|
41
|
-
expect(event.identity.sub).toBe('user-1');
|
|
42
|
-
expect(event.sessionId).toBe('session-1');
|
|
43
|
-
expect(event.sensitivityTier).toBe('low');
|
|
44
|
-
});
|
|
45
|
-
it('records error outcome when next throws', async () => {
|
|
46
|
-
const onEvent = vi.fn();
|
|
47
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent }));
|
|
48
|
-
await expect(middleware(makeReq('search'), async () => { throw new Error('upstream down'); }, makeCtx())).rejects.toThrow('upstream down');
|
|
49
|
-
const event = onEvent.mock.calls[0][0];
|
|
50
|
-
expect(event.outcome).toBe('error');
|
|
51
|
-
});
|
|
52
|
-
it('sets replayManifestPosition sequentially within a session', async () => {
|
|
53
|
-
const events = [];
|
|
54
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent: (e) => events.push(e) }));
|
|
55
|
-
const ctx = makeCtx('sess-seq');
|
|
56
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
57
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
58
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
59
|
-
expect(events.map((e) => e.replayManifestPosition)).toEqual([0, 1, 2]);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
describe('createAuditMiddleware — HMAC chain', () => {
|
|
63
|
-
it('first event chainHash is non-empty', async () => {
|
|
64
|
-
const events = [];
|
|
65
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent: (e) => events.push(e) }));
|
|
66
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), makeCtx('s1'));
|
|
67
|
-
expect(events[0].chainHash).toBeTruthy();
|
|
68
|
-
expect(events[0].chainHash.length).toBeGreaterThan(0);
|
|
69
|
-
});
|
|
70
|
-
it('each chainHash differs from the previous (chain advances)', async () => {
|
|
71
|
-
const events = [];
|
|
72
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent: (e) => events.push(e) }));
|
|
73
|
-
const ctx = makeCtx('s2');
|
|
74
|
-
for (let i = 0; i < 5; i++) {
|
|
75
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
76
|
-
}
|
|
77
|
-
const hashes = events.map((e) => e.chainHash);
|
|
78
|
-
const unique = new Set(hashes);
|
|
79
|
-
expect(unique.size).toBe(5);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
describe('createAuditMiddleware — sensitivity tiers', () => {
|
|
83
|
-
it('low-tier event has inputRaw and outputRaw', async () => {
|
|
84
|
-
const events = [];
|
|
85
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent: (e) => events.push(e) }));
|
|
86
|
-
await middleware(makeReq('search', { q: 'hello' }), async () => ({ content: [{ type: 'text', text: 'result' }] }), makeCtx());
|
|
87
|
-
const event = events[0];
|
|
88
|
-
expect(event.sensitivityTier).toBe('low');
|
|
89
|
-
if (event.sensitivityTier === 'low') {
|
|
90
|
-
expect(event.inputRaw).toEqual({ q: 'hello' });
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
it('high-tier event has encrypted fields, no inputRaw/outputRaw', async () => {
|
|
94
|
-
const events = [];
|
|
95
|
-
const { middleware } = createAuditMiddleware(makeOptions({ onEvent: (e) => events.push(e) }));
|
|
96
|
-
await middleware(makeReq('transfer', { amount: 1000 }), async () => ({ content: [] }), makeCtx());
|
|
97
|
-
const event = events[0];
|
|
98
|
-
expect(event.sensitivityTier).toBe('high');
|
|
99
|
-
if (event.sensitivityTier === 'high') {
|
|
100
|
-
expect(typeof event.inputEncrypted).toBe('string');
|
|
101
|
-
expect(typeof event.outputEncrypted).toBe('string');
|
|
102
|
-
expect('inputRaw' in event).toBe(false);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
describe('createAuditMiddleware — closeSession', () => {
|
|
107
|
-
it('returns undefined for unknown session', async () => {
|
|
108
|
-
const { closeSession } = createAuditMiddleware(makeOptions());
|
|
109
|
-
const result = await closeSession('no-such-session');
|
|
110
|
-
expect(result).toBeUndefined();
|
|
111
|
-
});
|
|
112
|
-
it('returns undefined for session with no events', async () => {
|
|
113
|
-
const { closeSession } = createAuditMiddleware(makeOptions());
|
|
114
|
-
const result = await closeSession('empty-session');
|
|
115
|
-
expect(result).toBeUndefined();
|
|
116
|
-
});
|
|
117
|
-
it('returns ReplayManifest with correct fields after events', async () => {
|
|
118
|
-
const onManifest = vi.fn();
|
|
119
|
-
const { middleware, closeSession } = createAuditMiddleware(makeOptions({ onManifest }));
|
|
120
|
-
const ctx = makeCtx('sess-manifest');
|
|
121
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
122
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
123
|
-
const manifest = await closeSession('sess-manifest');
|
|
124
|
-
expect(manifest).toBeDefined();
|
|
125
|
-
expect(manifest.sessionId).toBe('sess-manifest');
|
|
126
|
-
expect(manifest.eventCount).toBe(2);
|
|
127
|
-
expect(manifest.merkleRoot).toBeTruthy();
|
|
128
|
-
expect(manifest.merkleProofs).toHaveLength(2);
|
|
129
|
-
expect(manifest.signature).toBeTruthy();
|
|
130
|
-
expect(manifest.signedBy).toBeTruthy();
|
|
131
|
-
expect(onManifest).toHaveBeenCalledOnce();
|
|
132
|
-
expect(onManifest.mock.calls[0][0]).toEqual(manifest);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
describe('createAuditMiddleware — Merkle proof', () => {
|
|
136
|
-
it('proof for each event verifies against the merkle root', async () => {
|
|
137
|
-
const { verifyMerkleProof } = await import('../chain.js');
|
|
138
|
-
const events = [];
|
|
139
|
-
const { middleware, closeSession } = createAuditMiddleware(makeOptions({ onEvent: (e) => events.push(e) }));
|
|
140
|
-
const ctx = makeCtx('sess-merkle');
|
|
141
|
-
for (let i = 0; i < 4; i++) {
|
|
142
|
-
await middleware(makeReq('search'), async () => ({ content: [] }), ctx);
|
|
143
|
-
}
|
|
144
|
-
const manifest = await closeSession('sess-merkle');
|
|
145
|
-
expect(manifest).toBeDefined();
|
|
146
|
-
for (let i = 0; i < events.length; i++) {
|
|
147
|
-
const valid = verifyMerkleProof(events[i].chainHash, manifest.merkleProofs[i], manifest.merkleRoot);
|
|
148
|
-
expect(valid).toBe(true);
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
//# sourceMappingURL=middleware.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sensitivity.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sensitivity.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { createSensitivityResolver } from '../sensitivity.js';
|
|
3
|
-
const identity = {
|
|
4
|
-
sub: 'u1',
|
|
5
|
-
type: 'human',
|
|
6
|
-
roles: [],
|
|
7
|
-
claims: {},
|
|
8
|
-
resolvedAt: new Date().toISOString(),
|
|
9
|
-
source: 'jwt',
|
|
10
|
-
};
|
|
11
|
-
describe('createSensitivityResolver', () => {
|
|
12
|
-
it('returns the mapped tier for a known tool', () => {
|
|
13
|
-
const resolve = createSensitivityResolver({ transfer_funds: 'high', get_balance: 'low' });
|
|
14
|
-
expect(resolve('transfer_funds', identity, {})).toBe('high');
|
|
15
|
-
expect(resolve('get_balance', identity, {})).toBe('low');
|
|
16
|
-
});
|
|
17
|
-
it('returns high for an unknown tool', () => {
|
|
18
|
-
const resolve = createSensitivityResolver({ get_balance: 'low' });
|
|
19
|
-
expect(resolve('unknown_tool', identity, {})).toBe('high');
|
|
20
|
-
});
|
|
21
|
-
it('override fn takes precedence over the static map', () => {
|
|
22
|
-
const resolve = createSensitivityResolver({ get_balance: 'low' }, (_tool, _identity, args) => (args.pii ? 'high' : 'low'));
|
|
23
|
-
expect(resolve('get_balance', identity, { pii: true })).toBe('high');
|
|
24
|
-
expect(resolve('get_balance', identity, {})).toBe('low');
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
//# sourceMappingURL=sensitivity.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sensitivity.test.js","sourceRoot":"","sources":["../../src/__tests__/sensitivity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,MAAM,QAAQ,GAAa;IACzB,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACpC,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,yBAAyB,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG,yBAAyB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,OAAO,GAAG,yBAAyB,CACvC,EAAE,WAAW,EAAE,KAAK,EAAE,EACtB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CACxD,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signingKey.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/signingKey.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { createDefaultSigningKeyProvider } from '../signingKey.js';
|
|
3
|
-
describe('createDefaultSigningKeyProvider', () => {
|
|
4
|
-
it('has correct shape', () => {
|
|
5
|
-
const provider = createDefaultSigningKeyProvider('secret');
|
|
6
|
-
expect(provider.algorithm).toBe('HMAC-SHA256');
|
|
7
|
-
expect(typeof provider.keyId).toBe('string');
|
|
8
|
-
expect(provider.keyId.length).toBeGreaterThan(0);
|
|
9
|
-
expect(typeof provider.sign).toBe('function');
|
|
10
|
-
});
|
|
11
|
-
it('sign returns a non-empty buffer', async () => {
|
|
12
|
-
const provider = createDefaultSigningKeyProvider('secret');
|
|
13
|
-
const sig = await provider.sign(Buffer.from('hello'));
|
|
14
|
-
expect(sig).toBeInstanceOf(Buffer);
|
|
15
|
-
expect(sig.length).toBeGreaterThan(0);
|
|
16
|
-
});
|
|
17
|
-
it('same secret + same data → same signature (deterministic)', async () => {
|
|
18
|
-
const p1 = createDefaultSigningKeyProvider('secret');
|
|
19
|
-
const p2 = createDefaultSigningKeyProvider('secret');
|
|
20
|
-
const data = Buffer.from('test-data');
|
|
21
|
-
const [s1, s2] = await Promise.all([p1.sign(data), p2.sign(data)]);
|
|
22
|
-
expect(s1.toString('hex')).toBe(s2.toString('hex'));
|
|
23
|
-
});
|
|
24
|
-
it('different secrets → different signatures', async () => {
|
|
25
|
-
const p1 = createDefaultSigningKeyProvider('secret-a');
|
|
26
|
-
const p2 = createDefaultSigningKeyProvider('secret-b');
|
|
27
|
-
const data = Buffer.from('test-data');
|
|
28
|
-
const [s1, s2] = await Promise.all([p1.sign(data), p2.sign(data)]);
|
|
29
|
-
expect(s1.toString('hex')).not.toBe(s2.toString('hex'));
|
|
30
|
-
});
|
|
31
|
-
it('accepts Buffer as secret', async () => {
|
|
32
|
-
const provider = createDefaultSigningKeyProvider(Buffer.from('secret'));
|
|
33
|
-
const sig = await provider.sign(Buffer.from('data'));
|
|
34
|
-
expect(sig).toBeInstanceOf(Buffer);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
//# sourceMappingURL=signingKey.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signingKey.test.js","sourceRoot":"","sources":["../../src/__tests__/signingKey.test.ts"],"names":[],"mappings":"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"}
|