@attested-intelligence/aga-mcp-server 2.2.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 (104) hide show
  1. package/DEPLOYMENT.md +111 -0
  2. package/LICENSE +21 -21
  3. package/README.md +59 -47
  4. package/SECURITY.md +59 -0
  5. package/THREAT_BOUNDARY.md +77 -0
  6. package/dist/core/behavioral.d.ts.map +1 -1
  7. package/dist/core/behavioral.js +11 -3
  8. package/dist/core/behavioral.js.map +1 -1
  9. package/dist/core/index.d.ts +0 -2
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/index.js +2 -2
  12. package/dist/core/index.js.map +1 -1
  13. package/dist/core/types.d.ts +1 -22
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/crypto/index.d.ts +0 -1
  16. package/dist/crypto/index.d.ts.map +1 -1
  17. package/dist/crypto/index.js +1 -1
  18. package/dist/crypto/index.js.map +1 -1
  19. package/dist/crypto/sign.d.ts.map +1 -1
  20. package/dist/crypto/sign.js +24 -23
  21. package/dist/crypto/sign.js.map +1 -1
  22. package/dist/middleware/governance.d.ts +22 -3
  23. package/dist/middleware/governance.d.ts.map +1 -1
  24. package/dist/middleware/governance.js +36 -28
  25. package/dist/middleware/governance.js.map +1 -1
  26. package/dist/proxy/index.d.ts.map +1 -1
  27. package/dist/proxy/index.js +26 -15
  28. package/dist/proxy/index.js.map +1 -1
  29. package/dist/proxy/server.d.ts +18 -45
  30. package/dist/proxy/server.d.ts.map +1 -1
  31. package/dist/proxy/server.js +77 -131
  32. package/dist/proxy/server.js.map +1 -1
  33. package/dist/sep/bundle.d.ts +60 -0
  34. package/dist/sep/bundle.d.ts.map +1 -0
  35. package/dist/sep/bundle.js +74 -0
  36. package/dist/sep/bundle.js.map +1 -0
  37. package/dist/sep/canonical.d.ts +28 -0
  38. package/dist/sep/canonical.d.ts.map +1 -0
  39. package/dist/sep/canonical.js +62 -0
  40. package/dist/sep/canonical.js.map +1 -0
  41. package/dist/sep/checkpoint.d.ts +15 -0
  42. package/dist/sep/checkpoint.d.ts.map +1 -0
  43. package/dist/sep/checkpoint.js +28 -0
  44. package/dist/sep/checkpoint.js.map +1 -0
  45. package/dist/sep/crypto.d.ts +20 -0
  46. package/dist/sep/crypto.d.ts.map +1 -0
  47. package/dist/sep/crypto.js +104 -0
  48. package/dist/sep/crypto.js.map +1 -0
  49. package/dist/sep/index.d.ts +14 -0
  50. package/dist/sep/index.d.ts.map +1 -0
  51. package/dist/sep/index.js +14 -0
  52. package/dist/sep/index.js.map +1 -0
  53. package/dist/sep/merkle.d.ts +11 -0
  54. package/dist/sep/merkle.d.ts.map +1 -0
  55. package/dist/sep/merkle.js +51 -0
  56. package/dist/sep/merkle.js.map +1 -0
  57. package/dist/sep/receipt.d.ts +64 -0
  58. package/dist/sep/receipt.d.ts.map +1 -0
  59. package/dist/sep/receipt.js +0 -0
  60. package/dist/sep/receipt.js.map +1 -0
  61. package/dist/sep/verify.d.ts +14 -0
  62. package/dist/sep/verify.d.ts.map +1 -0
  63. package/dist/sep/verify.js +158 -0
  64. package/dist/sep/verify.js.map +1 -0
  65. package/dist/server.d.ts.map +1 -1
  66. package/dist/server.js +83 -39
  67. package/dist/server.js.map +1 -1
  68. package/dist/storage/interface.d.ts +1 -4
  69. package/dist/storage/interface.d.ts.map +1 -1
  70. package/dist/storage/memory.d.ts +1 -5
  71. package/dist/storage/memory.d.ts.map +1 -1
  72. package/dist/storage/memory.js +0 -4
  73. package/dist/storage/memory.js.map +1 -1
  74. package/dist/storage/sqlite.d.ts +1 -4
  75. package/dist/storage/sqlite.d.ts.map +1 -1
  76. package/dist/storage/sqlite.js +0 -4
  77. package/dist/storage/sqlite.js.map +1 -1
  78. package/dist/utils/canonical.d.ts.map +1 -1
  79. package/dist/utils/canonical.js +11 -1
  80. package/dist/utils/canonical.js.map +1 -1
  81. package/dist/utils/timestamp.d.ts.map +1 -1
  82. package/dist/utils/timestamp.js +4 -1
  83. package/dist/utils/timestamp.js.map +1 -1
  84. package/dist/utils/uuid.d.ts +1 -0
  85. package/dist/utils/uuid.d.ts.map +1 -1
  86. package/dist/utils/uuid.js +3 -2
  87. package/dist/utils/uuid.js.map +1 -1
  88. package/package.json +87 -93
  89. package/dist/core/bundle.d.ts +0 -20
  90. package/dist/core/bundle.d.ts.map +0 -1
  91. package/dist/core/bundle.js +0 -45
  92. package/dist/core/bundle.js.map +0 -1
  93. package/dist/core/checkpoint.d.ts +0 -8
  94. package/dist/core/checkpoint.d.ts.map +0 -1
  95. package/dist/core/checkpoint.js +0 -21
  96. package/dist/core/checkpoint.js.map +0 -1
  97. package/dist/crypto/merkle.d.ts +0 -8
  98. package/dist/crypto/merkle.d.ts.map +0 -1
  99. package/dist/crypto/merkle.js +0 -42
  100. package/dist/crypto/merkle.js.map +0 -1
  101. package/dist/proxy/verify.d.ts +0 -28
  102. package/dist/proxy/verify.d.ts.map +0 -1
  103. package/dist/proxy/verify.js +0 -182
  104. package/dist/proxy/verify.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Mandatory signed checkpoint — CANONICAL_CONSTRUCTION_v2.md §5.
3
+ * Binds receipt count + chain head + merkle root to a gateway signature; this is what makes
4
+ * the no-prefix leaf construction truncation-safe. `leaf_count` is intentionally numeric
5
+ * (the reference verifier compares it numerically; small integers are RFC-8785-stable).
6
+ */
7
+ import { canonicalize } from './canonical.js';
8
+ import { SEP_ALGORITHM, leafHash } from './receipt.js';
9
+ import { merkleRoot } from './merkle.js';
10
+ /** The EXACT canonical field set of a signed SEP checkpoint (strict-schema floor in the verifier). */
11
+ export const SEP_CHECKPOINT_FIELDS = [
12
+ 'algorithm', 'gateway_id', 'generated_at', 'head_leaf_hash', 'leaf_count', 'merkle_root', 'signature',
13
+ ];
14
+ export function buildCheckpoint(receipts, gatewayId, generatedAt, signer) {
15
+ if (receipts.length === 0)
16
+ throw new Error('Cannot checkpoint an empty receipt set');
17
+ const leaves = receipts.map(leafHash);
18
+ const body = {
19
+ algorithm: SEP_ALGORITHM,
20
+ gateway_id: gatewayId,
21
+ generated_at: generatedAt,
22
+ head_leaf_hash: leaves[leaves.length - 1],
23
+ leaf_count: receipts.length,
24
+ merkle_root: merkleRoot(leaves),
25
+ };
26
+ return { ...body, signature: signer.sign(canonicalize(body)) };
27
+ }
28
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/sep/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAmB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAYzC,sGAAsG;AACtG,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW;CAC7F,CAAC;AAEX,MAAM,UAAU,eAAe,CAC7B,QAAsB,EACtB,SAAiB,EACjB,WAAmB,EACnB,MAAiB;IAEjB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,WAAW;QACzB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC;KAChC,CAAC;IACF,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,20 @@
1
+ export declare function sha256Hex(s: string): string;
2
+ export declare function isHex(h: unknown, n: number): boolean;
3
+ export interface SepSigner {
4
+ readonly publicKeyHex: string;
5
+ sign(message: string): string;
6
+ }
7
+ /** Build a deterministic signer from a 32-byte Ed25519 seed (e.g. a @noble secretKey). */
8
+ export declare function signerFromSeed(seed: Uint8Array): SepSigner;
9
+ /** Generate a fresh signer; returns the seed so callers can persist it. */
10
+ export declare function generateSigner(): {
11
+ signer: SepSigner;
12
+ seed: Uint8Array;
13
+ };
14
+ /** Parse a 64-hex (32-byte) Ed25519 seed, e.g. from AGA_GATEWAY_KEY. Throws on malformed input. */
15
+ export declare function seedFromHex(hex: string): Uint8Array;
16
+ /** §6.1 structural floor: reject malformed, non-canonical, non-decodable, and small-order keys. */
17
+ export declare function wellFormedKey(hex: unknown): boolean;
18
+ export declare function verifyHex(pubHex: string, message: string, sigHex: string): boolean;
19
+ export declare function newId(prefix?: string): string;
20
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/sep/crypto.ts"],"names":[],"mappings":"AAeA,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAK1D;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,IAAI;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAGxE;AAED,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAInD;AAwCD,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAUnD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAYlF;AAED,wBAAgB,KAAK,CAAC,MAAM,SAAS,GAAG,MAAM,CAE7C"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * SEP crypto primitives — node:crypto only, to mirror the normative reference verifier
3
+ * (aga-receipt-spec/verify/verify-sep.mjs) byte-for-byte. Ed25519 (RFC 8032) + SHA-256.
4
+ *
5
+ * Keys use the raw 32-byte RFC-8032 Ed25519 seed: signerFromSeed(seed) yields the public key
6
+ * and signatures, interoperable with any standard Ed25519 library that uses the seed encoding.
7
+ */
8
+ import { createHash, createPrivateKey, createPublicKey, randomBytes, randomUUID, sign as nodeSign, verify as nodeVerify, } from 'node:crypto';
9
+ const SPKI = Buffer.from('302a300506032b6570032100', 'hex'); // Ed25519 SubjectPublicKeyInfo prefix
10
+ const PKCS8 = Buffer.from('302e020100300506032b657004220420', 'hex'); // Ed25519 PKCS8 seed prefix
11
+ export function sha256Hex(s) {
12
+ return createHash('sha256').update(Buffer.from(s, 'utf8')).digest('hex');
13
+ }
14
+ export function isHex(h, n) {
15
+ return typeof h === 'string' && new RegExp(`^[0-9a-f]{${n}}$`).test(h);
16
+ }
17
+ /** Build a deterministic signer from a 32-byte Ed25519 seed (e.g. a @noble secretKey). */
18
+ export function signerFromSeed(seed) {
19
+ if (seed.length !== 32)
20
+ throw new Error(`Ed25519 seed must be 32 bytes, got ${seed.length}`);
21
+ const sk = createPrivateKey({ key: Buffer.concat([PKCS8, Buffer.from(seed)]), format: 'der', type: 'pkcs8' });
22
+ const publicKeyHex = createPublicKey(sk).export({ format: 'der', type: 'spki' }).subarray(-32).toString('hex');
23
+ return { publicKeyHex, sign: (m) => nodeSign(null, Buffer.from(m, 'utf8'), sk).toString('hex') };
24
+ }
25
+ /** Generate a fresh signer; returns the seed so callers can persist it. */
26
+ export function generateSigner() {
27
+ const seed = new Uint8Array(randomBytes(32));
28
+ return { signer: signerFromSeed(seed), seed };
29
+ }
30
+ /** Parse a 64-hex (32-byte) Ed25519 seed, e.g. from AGA_GATEWAY_KEY. Throws on malformed input. */
31
+ export function seedFromHex(hex) {
32
+ const h = String(hex).trim().toLowerCase();
33
+ if (!/^[0-9a-f]{64}$/.test(h))
34
+ throw new Error('gateway key must be 64 lowercase hex chars (a 32-byte Ed25519 seed)');
35
+ return Uint8Array.from(Buffer.from(h, 'hex'));
36
+ }
37
+ /**
38
+ * Small-order Ed25519 public-key encodings (order dividing 8). A signature can be forged
39
+ * trivially under such a key, so they are rejected outright. The structured entries are
40
+ * built from parts (no length to mis-transcribe); the order-8 entries are the standard
41
+ * blocklist values (cf. libsodium / ZIP-215). A fail-fast guard rejects any malformed entry.
42
+ */
43
+ // The 10 CANONICAL (y < p) encodings of the Ed25519 points of order dividing 8. A signature
44
+ // can be forged trivially under such a key, so they are rejected. The two x=0 points (identity
45
+ // y=1, order-2 y=-1) each have a sign-bit-CLEAR and a sign-bit-SET encoding (x=0 ⇒ ±x=0, both
46
+ // decode to the same point), so all four x=0 variants are listed. NON-canonical (y ≥ p)
47
+ // encodings of these points are caught separately by isCanonicalY below. Structured constants
48
+ // (no length to mis-transcribe) + a fail-fast guard.
49
+ const SMALL_ORDER_KEYS = new Set([
50
+ '00'.repeat(32), // y = 0 (order 4)
51
+ '00'.repeat(31) + '80', // y = 0, sign bit set (order 4)
52
+ '01' + '00'.repeat(31), // y = 1 identity (order 1)
53
+ '01' + '00'.repeat(30) + '80', // y = 1 identity, sign bit set
54
+ 'ec' + 'ff'.repeat(30) + '7f', // y = -1 (order 2)
55
+ 'ec' + 'ff'.repeat(31), // y = -1, sign bit set
56
+ '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05', // order 8
57
+ 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a', // order 8
58
+ '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85', // order 8 (sign bit)
59
+ 'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa', // order 8 (sign bit)
60
+ ]);
61
+ for (const k of SMALL_ORDER_KEYS) {
62
+ if (!/^[0-9a-f]{64}$/.test(k))
63
+ throw new Error(`malformed small-order key constant: "${k}"`);
64
+ }
65
+ const ED25519_P = (1n << 255n) - 19n;
66
+ /** A valid Ed25519 public key encodes y < p (the sign bit is bit 255). Reject non-canonical
67
+ * encodings (y >= p) — this also rejects the non-canonical encodings of the small-order points. */
68
+ function isCanonicalY(hex) {
69
+ const b = Buffer.from(hex, 'hex');
70
+ let y = 0n;
71
+ for (let i = 0; i < 32; i++)
72
+ y |= BigInt(i === 31 ? (b[i] & 0x7f) : b[i]) << BigInt(8 * i);
73
+ return y < ED25519_P;
74
+ }
75
+ /** §6.1 structural floor: reject malformed, non-canonical, non-decodable, and small-order keys. */
76
+ export function wellFormedKey(hex) {
77
+ if (!isHex(hex, 64))
78
+ return false;
79
+ if (SMALL_ORDER_KEYS.has(hex))
80
+ return false; // canonical small-order encodings
81
+ if (!isCanonicalY(hex))
82
+ return false; // non-canonical (y >= p), incl. non-canonical small-order
83
+ try {
84
+ createPublicKey({ key: Buffer.concat([SPKI, Buffer.from(hex, 'hex')]), format: 'der', type: 'spki' });
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ export function verifyHex(pubHex, message, sigHex) {
92
+ if (!wellFormedKey(pubHex) || !isHex(sigHex, 128) || /^0+$/.test(sigHex))
93
+ return false;
94
+ try {
95
+ return nodeVerify(null, Buffer.from(message, 'utf8'), createPublicKey({ key: Buffer.concat([SPKI, Buffer.from(pubHex, 'hex')]), format: 'der', type: 'spki' }), Buffer.from(sigHex, 'hex'));
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ export function newId(prefix = 'rcpt') {
102
+ return `${prefix}-${randomUUID()}`;
103
+ }
104
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/sep/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * src/sep — the single canonical source of truth for AGA SEP evidence construction
3
+ * and verification. Consumed by the MCP server tools and the governance proxy.
4
+ * Conforms to aga-receipt-spec/CANONICAL_CONSTRUCTION_v2.md; verdicts match
5
+ * aga-receipt-spec/verify/verify-sep.mjs. See SPEC_PRECEDENCE.md for precedence rules.
6
+ */
7
+ export { canonicalize, assertSignedReceiptFieldsAreStrings, MAX_CANON_DEPTH } from './canonical.js';
8
+ export { sha256Hex, isHex, wellFormedKey, verifyHex, signerFromSeed, generateSigner, seedFromHex, newId, type SepSigner } from './crypto.js';
9
+ export { nodeHash, merkleRoot, merkleProof, type MerkleProof } from './merkle.js';
10
+ export { SEP_ALGORITHM, SEP_RECEIPT_VERSION, SEP_RECEIPT_FIELDS, buildReceipt, leafHash, argumentsHash, safeArgumentsHash, UNCANONICALIZABLE_ARGS_HASH, type SepReceipt, type ReceiptInput, type Decision } from './receipt.js';
11
+ export { buildCheckpoint, type SignedCheckpoint } from './checkpoint.js';
12
+ export { SepGateway, type SepBundle, type SepGatewayOptions, type RecordInput } from './bundle.js';
13
+ export { verifySepBundle, type SepVerificationResult, type VerifyStep } from './verify.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sep/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,mCAAmC,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7I,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAChO,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * src/sep — the single canonical source of truth for AGA SEP evidence construction
3
+ * and verification. Consumed by the MCP server tools and the governance proxy.
4
+ * Conforms to aga-receipt-spec/CANONICAL_CONSTRUCTION_v2.md; verdicts match
5
+ * aga-receipt-spec/verify/verify-sep.mjs. See SPEC_PRECEDENCE.md for precedence rules.
6
+ */
7
+ export { canonicalize, assertSignedReceiptFieldsAreStrings, MAX_CANON_DEPTH } from './canonical.js';
8
+ export { sha256Hex, isHex, wellFormedKey, verifyHex, signerFromSeed, generateSigner, seedFromHex, newId } from './crypto.js';
9
+ export { nodeHash, merkleRoot, merkleProof } from './merkle.js';
10
+ export { SEP_ALGORITHM, SEP_RECEIPT_VERSION, SEP_RECEIPT_FIELDS, buildReceipt, leafHash, argumentsHash, safeArgumentsHash, UNCANONICALIZABLE_ARGS_HASH } from './receipt.js';
11
+ export { buildCheckpoint } from './checkpoint.js';
12
+ export { SepGateway } from './bundle.js';
13
+ export { verifySepBundle } from './verify.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sep/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,mCAAmC,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAkB,MAAM,aAAa,CAAC;AAC7I,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAoB,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,2BAA2B,EAAqD,MAAM,cAAc,CAAC;AAChO,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,UAAU,EAA4D,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,eAAe,EAA+C,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function nodeHash(leftHex: string, rightHex: string): string;
2
+ export interface MerkleProof {
3
+ leaf_hash: string;
4
+ leaf_index: number;
5
+ siblings: string[];
6
+ directions: Array<'left' | 'right'>;
7
+ merkle_root: string;
8
+ }
9
+ export declare function merkleRoot(leaves: string[]): string;
10
+ export declare function merkleProof(leaves: string[], leafIndex: number): MerkleProof;
11
+ //# sourceMappingURL=merkle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../../src/sep/merkle.ts"],"names":[],"mappings":"AAOA,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAWnD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAoB5E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * SEP Merkle tree — CANONICAL_CONSTRUCTION_v2.md §5.
3
+ * Node = sha256(rawbytes(L) ‖ rawbytes(R)) — RAW 32-byte concatenation (NOT hex-string concat).
4
+ * Odd node is PROMOTED (carried up unchanged), NOT duplicated.
5
+ */
6
+ import { createHash } from 'node:crypto';
7
+ export function nodeHash(leftHex, rightHex) {
8
+ return createHash('sha256')
9
+ .update(Buffer.concat([Buffer.from(leftHex, 'hex'), Buffer.from(rightHex, 'hex')]))
10
+ .digest('hex');
11
+ }
12
+ export function merkleRoot(leaves) {
13
+ if (leaves.length === 0)
14
+ return '';
15
+ let level = [...leaves];
16
+ while (level.length > 1) {
17
+ const next = [];
18
+ for (let i = 0; i < level.length; i += 2) {
19
+ next.push(i + 1 < level.length ? nodeHash(level[i], level[i + 1]) : level[i]); // promote odd
20
+ }
21
+ level = next;
22
+ }
23
+ return level[0];
24
+ }
25
+ export function merkleProof(leaves, leafIndex) {
26
+ const siblings = [];
27
+ const directions = [];
28
+ let level = [...leaves];
29
+ let idx = leafIndex;
30
+ while (level.length > 1) {
31
+ const next = [];
32
+ for (let i = 0; i < level.length; i += 2) {
33
+ next.push(i + 1 < level.length ? nodeHash(level[i], level[i + 1]) : level[i]);
34
+ }
35
+ if (idx % 2 === 0) {
36
+ if (idx + 1 < level.length) {
37
+ siblings.push(level[idx + 1]);
38
+ directions.push('right');
39
+ }
40
+ // else: promoted node, no sibling at this level
41
+ }
42
+ else {
43
+ siblings.push(level[idx - 1]);
44
+ directions.push('left');
45
+ }
46
+ idx = Math.floor(idx / 2);
47
+ level = next;
48
+ }
49
+ return { leaf_hash: leaves[leafIndex], leaf_index: leafIndex, siblings, directions, merkle_root: level[0] };
50
+ }
51
+ //# sourceMappingURL=merkle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.js","sourceRoot":"","sources":["../../src/sep/merkle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type SepSigner } from './crypto.js';
2
+ export declare const SEP_ALGORITHM = "Ed25519-SHA256-JCS";
3
+ export declare const SEP_RECEIPT_VERSION = "1.0";
4
+ /**
5
+ * The EXACT canonical field set of a signed SEP receipt. The verifier's structural floor
6
+ * requires a receipt to carry exactly these keys — no more, no less — which rejects
7
+ * extra/unknown-field injection and "__proto__" injection on the signed object. Single
8
+ * source of truth for both the builder and the verifier; mirror this in sibling stacks.
9
+ */
10
+ export declare const SEP_RECEIPT_FIELDS: readonly ["receipt_id", "receipt_version", "algorithm", "timestamp", "request_id", "method", "tool_name", "decision", "reason", "policy_reference", "arguments_hash", "previous_receipt_hash", "gateway_id", "public_key", "signature"];
11
+ export type Decision = 'PERMITTED' | 'DENIED';
12
+ export interface SepReceipt {
13
+ receipt_id: string;
14
+ receipt_version: string;
15
+ algorithm: string;
16
+ timestamp: string;
17
+ request_id: string | null;
18
+ method: string;
19
+ tool_name: string;
20
+ decision: Decision;
21
+ reason: string;
22
+ policy_reference: string;
23
+ arguments_hash: string;
24
+ previous_receipt_hash: string;
25
+ gateway_id: string;
26
+ public_key: string;
27
+ signature: string;
28
+ }
29
+ export interface ReceiptInput {
30
+ receipt_id: string;
31
+ timestamp: string;
32
+ request_id?: string | number | null;
33
+ method?: string;
34
+ tool_name: string;
35
+ decision: Decision;
36
+ reason: string;
37
+ policy_reference: string;
38
+ /** Provide either raw arguments (hashed here) or a precomputed argumentsHash. */
39
+ arguments?: unknown;
40
+ argumentsHash?: string;
41
+ previous_receipt_hash: string;
42
+ gateway_id: string;
43
+ }
44
+ /** §2: arguments_hash = sha256(canon(arguments)); sha256(canon({})) if empty object; "" if absent. */
45
+ export declare function argumentsHash(args: unknown): string;
46
+ /**
47
+ * Fixed sentinel arguments_hash used when arguments cannot be canonicalized (e.g. nested
48
+ * beyond MAX_CANON_DEPTH — an anti-DoS controlled failure). Lets the governance layer still
49
+ * emit a (fail-closed) receipt instead of crashing and silently dropping the decision.
50
+ */
51
+ export declare const UNCANONICALIZABLE_ARGS_HASH: string;
52
+ /**
53
+ * Never-throwing arguments_hash. `ok:false` means the arguments could not be canonicalized
54
+ * (too deeply nested / hostile payload); the caller MUST fail closed (deny the call) while
55
+ * still recording a receipt so a governed decision can never be silently erased.
56
+ */
57
+ export declare function safeArgumentsHash(args: unknown): {
58
+ hash: string;
59
+ ok: boolean;
60
+ };
61
+ export declare function buildReceipt(input: ReceiptInput, signer: SepSigner): SepReceipt;
62
+ /** §3: leaf over the FULL receipt including its signature, no domain-separation prefix. */
63
+ export declare function leafHash(receipt: SepReceipt): string;
64
+ //# sourceMappingURL=receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/sep/receipt.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAClD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,yOAIrB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAGnD;AAED;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,QAAgD,CAAC;AAEzF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAM9E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,CAqB/E;AAED,2FAA2F;AAC3F,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAEpD"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/sep/receipt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,mCAAmC,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY;IACvE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB;IAC/D,gBAAgB,EAAE,uBAAuB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW;CAC1E,CAAC;AAsCX,sGAAsG;AACtG,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,SAAS,CAAC,kCAAkC,CAAC,CAAC;AAEzF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,2BAA2B,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,MAAiB;IACjE,MAAM,QAAQ,GAAG;QACf,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,aAAa;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,0FAA0F;QAC1F,UAAU,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QACzG,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,YAAY;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,cAAc,EAAE,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QACrE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,MAAM,CAAC,YAAY;KAChC,CAAC;IACF,mCAAmC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,CAAC;AACpC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,QAAQ,CAAC,OAAmB;IAC1C,OAAO,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface VerifyStep {
2
+ name: string;
3
+ ok: boolean;
4
+ }
5
+ export interface SepVerificationResult {
6
+ verdict: 'VERIFIED' | 'FAILED';
7
+ /** Human-readable headline — makes integrity-only vs provenance-verified unmistakable. */
8
+ summary: string;
9
+ issuerVerified: boolean;
10
+ pinned: boolean;
11
+ steps: VerifyStep[];
12
+ }
13
+ export declare function verifySepBundle(bundle: any, expectedPublicKey?: string): SepVerificationResult;
14
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/sep/verify.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;CAAE;AAC1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC/B,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AA4CD,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAsG9F"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * SEP §6 verifier — a faithful TypeScript port of the normative reference
3
+ * aga-receipt-spec/verify/verify-sep.mjs. Same six steps, same semantics, same crypto
4
+ * (node:crypto), so its verdicts match the reference byte-for-byte. See SPEC_PRECEDENCE.md.
5
+ */
6
+ import { canonicalize } from './canonical.js';
7
+ import { sha256Hex, wellFormedKey, verifyHex, isHex } from './crypto.js';
8
+ import { nodeHash } from './merkle.js';
9
+ import { SEP_ALGORITHM, SEP_RECEIPT_FIELDS } from './receipt.js';
10
+ import { SEP_CHECKPOINT_FIELDS } from './checkpoint.js';
11
+ const leaf = (r) => sha256Hex(canonicalize(r));
12
+ const strip = (o, f) => Object.fromEntries(Object.entries(o).filter(([k]) => k !== f));
13
+ /**
14
+ * Canonical SEP timestamp validation (cross-stack unified). A timestamp is VALID iff it
15
+ * matches the EXACT fixed-width UTC form Date.prototype.toISOString() emits AND its calendar
16
+ * fields are in range — computed with PURE INTEGER ARITHMETIC, no Date/parser, so every
17
+ * verifier reaches a byte-identical verdict. Uses the literal [0-9] class (not \d, which
18
+ * matches Unicode digits and would diverge from the other stacks).
19
+ */
20
+ const TS_RE = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}Z$/;
21
+ const isLeap = (y) => y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0);
22
+ const daysInMonth = (y, m) => [31, isLeap(y) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][m - 1];
23
+ const isValidTimestamp = (ts) => {
24
+ if (typeof ts !== 'string' || !TS_RE.test(ts))
25
+ return false;
26
+ const year = Number(ts.slice(0, 4));
27
+ const month = Number(ts.slice(5, 7));
28
+ const day = Number(ts.slice(8, 10));
29
+ const hour = Number(ts.slice(11, 13));
30
+ const minute = Number(ts.slice(14, 16));
31
+ const second = Number(ts.slice(17, 19));
32
+ return month >= 1 && month <= 12
33
+ && day >= 1 && day <= daysInMonth(year, month)
34
+ && hour >= 0 && hour <= 23
35
+ && minute >= 0 && minute <= 59
36
+ && second >= 0 && second <= 59;
37
+ };
38
+ /**
39
+ * Strict-schema floor: the object must carry EXACTLY the canonical fields — no extra,
40
+ * unknown, or "__proto__"-injected keys (Object.keys counts a JSON-parsed "__proto__" as
41
+ * an own key, so a 16th key fails the count). This is the cross-stack-robust rule: every
42
+ * conformant verifier rejects the identical bundles.
43
+ */
44
+ const hasExactKeys = (o, fields) => {
45
+ if (!o || typeof o !== 'object' || Array.isArray(o))
46
+ return false;
47
+ const keys = Object.keys(o);
48
+ return keys.length === fields.length && fields.every((f) => Object.prototype.hasOwnProperty.call(o, f));
49
+ };
50
+ export function verifySepBundle(bundle, expectedPublicKey) {
51
+ // Robust contract: a malformed/hostile bundle (e.g. a receipt with a deeply-nested value
52
+ // that overflows the depth-bounded canonicalize) yields FAILED, never a thrown exception.
53
+ const pinned = isHex(expectedPublicKey, 64);
54
+ try {
55
+ const steps = [];
56
+ const add = (name, ok) => { steps.push({ name, ok }); return ok; };
57
+ const receipts = Array.isArray(bundle?.receipts) ? bundle.receipts : [];
58
+ const proofs = Array.isArray(bundle?.merkle_proofs) ? bundle.merkle_proofs : [];
59
+ const pub = bundle?.public_key;
60
+ // §6.1 structural floor — incl. STRICT receipt schema (exactly the canonical fields;
61
+ // rejects extra/unknown keys and "__proto__" injection on every signed receipt).
62
+ add('structural', bundle?.algorithm === SEP_ALGORITHM && wellFormedKey(pub)
63
+ && receipts.length > 0 && proofs.length === receipts.length
64
+ && receipts.every((r) => hasExactKeys(r, SEP_RECEIPT_FIELDS)));
65
+ // §6.2 receipt signatures (against the bundle key; provenance handled in §6.6)
66
+ add('receipt_signatures', receipts.length > 0 && receipts.every((r) => verifyHex(pub, canonicalize(strip(r, 'signature')), r.signature)));
67
+ // §6.3 chain + ordering
68
+ const leaves = receipts.map(leaf);
69
+ let chain = receipts.length > 0;
70
+ let prevTs = null;
71
+ for (let i = 0; i < receipts.length; i++) {
72
+ const expectPrev = i === 0 ? '' : leaves[i - 1];
73
+ if ((receipts[i].previous_receipt_hash || '') !== expectPrev)
74
+ chain = false;
75
+ // Canonical timestamps: each must match the fixed-width UTC form and be calendar-valid
76
+ // (pure integer arithmetic, no Date parser). Because the form is fixed-width zero-padded
77
+ // UTC, non-decreasing ordering is a PLAIN STRING (lexicographic) compare; EQUAL allowed.
78
+ const ts = receipts[i].timestamp;
79
+ if (!isValidTimestamp(ts))
80
+ chain = false;
81
+ else {
82
+ if (prevTs !== null && ts < prevTs)
83
+ chain = false;
84
+ prevTs = ts;
85
+ }
86
+ }
87
+ add('chain_and_ordering', chain);
88
+ // §6.4 merkle: recompute leaf from content, walk proof, single root, index bijection
89
+ let root = null;
90
+ let merkle = proofs.length === receipts.length && proofs.length > 0;
91
+ const seen = new Set();
92
+ for (let i = 0; i < proofs.length; i++) {
93
+ const p = proofs[i];
94
+ seen.add(p.leaf_index);
95
+ const recomputed = receipts[p.leaf_index] !== undefined ? leaves[p.leaf_index] : null;
96
+ if (recomputed === null || recomputed !== p.leaf_hash)
97
+ merkle = false;
98
+ let cur = p.leaf_hash;
99
+ // directions is UNSIGNED, so it must be a well-formed array of EXACTLY "left"/"right" tokens
100
+ // (same length as siblings). Otherwise the merkle step FAILS — without this, JS/Go would treat a
101
+ // rewritten token (e.g. "right"->"RIGHT") as a "right" fallthrough and still walk to the correct
102
+ // root and VERIFY, while Python FAILS: a cross-stack disagreement. (Matches Python's strictness.)
103
+ const sib = Array.isArray(p.siblings) ? p.siblings : [];
104
+ const dir = Array.isArray(p.directions) ? p.directions : [];
105
+ if (dir.length !== sib.length || !dir.every((d) => d === 'left' || d === 'right'))
106
+ merkle = false;
107
+ for (let j = 0; j < sib.length; j++)
108
+ cur = dir[j] === 'left' ? nodeHash(sib[j], cur) : nodeHash(cur, sib[j]);
109
+ if (p.merkle_root !== cur)
110
+ merkle = false; // the proof's own claimed root must match what it walks to (L-7)
111
+ if (root === null)
112
+ root = cur;
113
+ else if (root !== cur)
114
+ merkle = false;
115
+ }
116
+ const bijection = seen.size === receipts.length && [...seen].every((n) => Number.isInteger(n) && n >= 0 && n < receipts.length);
117
+ add('merkle_and_bijection', merkle && bijection);
118
+ // §6.5 mandatory signed checkpoint — STRICT schema (exactly the canonical fields) + the
119
+ // bound algorithm value, then signature + root/count/head binding.
120
+ const cp = bundle?.checkpoint;
121
+ let cpOk = false;
122
+ if (hasExactKeys(cp, SEP_CHECKPOINT_FIELDS)) {
123
+ cpOk = cp.algorithm === SEP_ALGORITHM
124
+ && verifyHex(pub, canonicalize(strip(cp, 'signature')), cp.signature)
125
+ && root !== null && cp.merkle_root === root
126
+ && cp.leaf_count === receipts.length
127
+ && cp.head_leaf_hash === (leaves.length ? leaves[leaves.length - 1] : '');
128
+ }
129
+ add('signed_checkpoint', cpOk);
130
+ // §6.5b cross-field consistency: per-receipt identity + the UNSIGNED envelope must agree
131
+ // with the signed/recomputed values, so nothing outside the signed objects can mislead a
132
+ // consumer that reads the envelope (M-1/M-2/L-3).
133
+ const cpGatewayId = (cp && typeof cp === 'object') ? cp.gateway_id : undefined;
134
+ const cpGeneratedAt = (cp && typeof cp === 'object') ? cp.generated_at : undefined;
135
+ add('envelope_consistency', receipts.length > 0
136
+ && receipts.every((r) => r.public_key === pub) // every receipt is signed under the bundle key (L-3)
137
+ && receipts.every((r) => r.gateway_id === bundle?.gateway_id) // receipts ↔ envelope gateway_id
138
+ && cpGatewayId === bundle?.gateway_id // checkpoint ↔ envelope gateway_id (M-2)
139
+ && bundle?.generated_at === cpGeneratedAt // envelope generated_at ↔ signed checkpoint (T6)
140
+ && root !== null && bundle?.merkle_root === root); // envelope merkle_root ↔ recomputed (M-1)
141
+ // §6.6 provenance (only when a key is pinned)
142
+ const issuerVerified = pinned && pub === expectedPublicKey;
143
+ if (pinned)
144
+ add('gateway_key_match', issuerVerified);
145
+ const verdict = steps.every((s) => s.ok) ? 'VERIFIED' : 'FAILED';
146
+ const failed = steps.filter((s) => !s.ok).map((s) => s.name);
147
+ const summary = verdict === 'FAILED'
148
+ ? `FAILED — bundle did not verify (failed: ${failed.join(', ') || 'unknown'})`
149
+ : pinned
150
+ ? 'VERIFIED (provenance verified — issued by the pinned gateway key)'
151
+ : 'VERIFIED (integrity only — NOT provenance; pass the gateway key to prove who issued it)';
152
+ return { verdict, summary, issuerVerified, pinned, steps };
153
+ }
154
+ catch (e) {
155
+ return { verdict: 'FAILED', summary: `FAILED — verifier rejected a malformed bundle (${String(e)})`, issuerVerified: false, pinned, steps: [{ name: 'verifier_exception', ok: false }] };
156
+ }
157
+ }
158
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/sep/verify.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDpE,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CAuX1D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6EpE,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CAoY1D"}