chit402-verify 0.3.4 → 0.4.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 (108) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +270 -82
  3. package/dist/anchor-trust.d.ts +144 -0
  4. package/dist/anchor-trust.d.ts.map +1 -0
  5. package/dist/anchor-trust.js +441 -0
  6. package/dist/anchor-trust.js.map +1 -0
  7. package/dist/anchor-witness.d.ts +265 -0
  8. package/dist/anchor-witness.d.ts.map +1 -0
  9. package/dist/anchor-witness.js +833 -0
  10. package/dist/anchor-witness.js.map +1 -0
  11. package/dist/base-payer.d.ts +65 -0
  12. package/dist/base-payer.d.ts.map +1 -0
  13. package/dist/base-payer.js +222 -0
  14. package/dist/base-payer.js.map +1 -0
  15. package/dist/binding.d.ts +52 -0
  16. package/dist/binding.d.ts.map +1 -0
  17. package/dist/binding.js +80 -0
  18. package/dist/binding.js.map +1 -0
  19. package/dist/canonical-preimage.d.ts +9 -0
  20. package/dist/canonical-preimage.d.ts.map +1 -0
  21. package/dist/canonical-preimage.js +25 -0
  22. package/dist/canonical-preimage.js.map +1 -0
  23. package/dist/carry-forward.d.ts +79 -0
  24. package/dist/carry-forward.d.ts.map +1 -0
  25. package/dist/carry-forward.js +184 -0
  26. package/dist/carry-forward.js.map +1 -0
  27. package/dist/cli.d.ts +18 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +2090 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/epoch.d.ts +143 -0
  32. package/dist/epoch.d.ts.map +1 -0
  33. package/dist/epoch.js +352 -0
  34. package/dist/epoch.js.map +1 -0
  35. package/dist/head-binding.d.ts +24 -0
  36. package/dist/head-binding.d.ts.map +1 -0
  37. package/dist/head-binding.js +61 -0
  38. package/dist/head-binding.js.map +1 -0
  39. package/dist/index.d.ts +585 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +1648 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/issuer-history.d.ts +151 -0
  44. package/dist/issuer-history.d.ts.map +1 -0
  45. package/dist/issuer-history.js +595 -0
  46. package/dist/issuer-history.js.map +1 -0
  47. package/dist/issuer-pin.d.ts +126 -0
  48. package/dist/issuer-pin.d.ts.map +1 -0
  49. package/dist/issuer-pin.js +567 -0
  50. package/dist/issuer-pin.js.map +1 -0
  51. package/dist/jcs.d.ts +8 -0
  52. package/dist/jcs.d.ts.map +1 -0
  53. package/dist/jcs.js +64 -0
  54. package/dist/jcs.js.map +1 -0
  55. package/dist/jws.d.ts +46 -0
  56. package/dist/jws.d.ts.map +1 -0
  57. package/dist/jws.js +129 -0
  58. package/dist/jws.js.map +1 -0
  59. package/dist/payer.d.ts +65 -0
  60. package/dist/payer.d.ts.map +1 -0
  61. package/dist/payer.js +148 -0
  62. package/dist/payer.js.map +1 -0
  63. package/dist/preimage.d.ts +78 -0
  64. package/dist/preimage.d.ts.map +1 -0
  65. package/dist/preimage.js +363 -0
  66. package/dist/preimage.js.map +1 -0
  67. package/dist/receipt-lane.d.ts +235 -0
  68. package/dist/receipt-lane.d.ts.map +1 -0
  69. package/dist/receipt-lane.js +446 -0
  70. package/dist/receipt-lane.js.map +1 -0
  71. package/dist/receipt-version.d.ts +98 -0
  72. package/dist/receipt-version.d.ts.map +1 -0
  73. package/dist/receipt-version.js +364 -0
  74. package/dist/receipt-version.js.map +1 -0
  75. package/dist/refusal.d.ts +93 -0
  76. package/dist/refusal.d.ts.map +1 -0
  77. package/dist/refusal.js +249 -0
  78. package/dist/refusal.js.map +1 -0
  79. package/dist/request-binding.d.ts +7 -0
  80. package/dist/request-binding.d.ts.map +1 -0
  81. package/dist/request-binding.js +26 -0
  82. package/dist/request-binding.js.map +1 -0
  83. package/dist/row-hash.d.ts +22 -0
  84. package/dist/row-hash.d.ts.map +1 -0
  85. package/dist/row-hash.js +26 -0
  86. package/dist/row-hash.js.map +1 -0
  87. package/dist/shell.d.ts +65 -0
  88. package/dist/shell.d.ts.map +1 -0
  89. package/dist/shell.js +268 -0
  90. package/dist/shell.js.map +1 -0
  91. package/dist/solana-payer.d.ts +99 -0
  92. package/dist/solana-payer.d.ts.map +1 -0
  93. package/dist/solana-payer.js +258 -0
  94. package/dist/solana-payer.js.map +1 -0
  95. package/dist/v11-receipt.d.ts +23 -0
  96. package/dist/v11-receipt.d.ts.map +1 -0
  97. package/dist/v11-receipt.js +368 -0
  98. package/dist/v11-receipt.js.map +1 -0
  99. package/dist/verdict.d.ts +94 -0
  100. package/dist/verdict.d.ts.map +1 -0
  101. package/dist/verdict.js +381 -0
  102. package/dist/verdict.js.map +1 -0
  103. package/issuer-history.snapshot.json +1 -0
  104. package/package.json +70 -59
  105. package/cli.js +0 -27
  106. package/index.cjs +0 -8
  107. package/index.d.ts +0 -5
  108. package/index.js +0 -7
package/dist/epoch.js ADDED
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EPOCH2_OPENING_ROOT = exports.EPOCH1_SIZE2_ROOT = exports.EPOCH1_SIZE1_ROOT = exports.EPOCH1_FINAL_SIZE = exports.EPOCH1_FINAL_ROOT = exports.EPOCH1_GENESIS_DIGEST = exports.TREE_HEAD_SCHEMA_V2 = exports.TREE_HEAD_SCHEMA_V1 = void 0;
4
+ exports.epoch1PrefixRoot = epoch1PrefixRoot;
5
+ exports.matchEpoch1Prefix = matchEpoch1Prefix;
6
+ exports.canonicalUnloggedRows = canonicalUnloggedRows;
7
+ exports.unloggedListHash = unloggedListHash;
8
+ exports.verifyUnloggedSection = verifyUnloggedSection;
9
+ exports.unloggedIdCommitment = unloggedIdCommitment;
10
+ exports.verifyUnloggedCommitment = verifyUnloggedCommitment;
11
+ exports.unloggedReasonForTask = unloggedReasonForTask;
12
+ exports.acceptTreeHeadSchema = acceptTreeHeadSchema;
13
+ exports.verifyEpochLink = verifyEpochLink;
14
+ exports.verifyEpochRecord = verifyEpochRecord;
15
+ exports.verifyEpochInclusion = verifyEpochInclusion;
16
+ /**
17
+ * Epoch links for the receipt log.
18
+ *
19
+ * A version 1 head has no epoch claims and still verifies.
20
+ * Epoch 1 inclusion proofs stay valid on their own root.
21
+ * A later epoch must name the previous epoch's root and size.
22
+ */
23
+ const node_crypto_1 = require("node:crypto");
24
+ const anchor_witness_js_1 = require("./anchor-witness.js");
25
+ exports.TREE_HEAD_SCHEMA_V1 = 'chit402.tree_head.v1';
26
+ exports.TREE_HEAD_SCHEMA_V2 = 'chit402.tree_head.v2';
27
+ /** Historical epoch 1. A self-consistent record with any other final root is forged. */
28
+ exports.EPOCH1_GENESIS_DIGEST = '422cceb1be77114317043b0a00bc18cba6ca9cee34144cd23875c6dcf1b47368';
29
+ exports.EPOCH1_FINAL_ROOT = 'dd20e39a39a225b7b3441bb7f61532c06562288b74ae5dc4dda015c48312f973';
30
+ exports.EPOCH1_FINAL_SIZE = 4;
31
+ /** SHA-256(0x00 || genesis bytes of digest 422cceb1). Single-leaf root. */
32
+ exports.EPOCH1_SIZE1_ROOT = '8665a0fcb74c2cfeca3a356efe18fe878cf94c21cd38da6b19a2bb57629bc35c';
33
+ /** Anchored size-2 head. The v9 tree_head_hash on xfuel-39af100b. */
34
+ exports.EPOCH1_SIZE2_ROOT = 'ecf9a330a9e82d45e0887807261276fad2fbfb394189bb8f7f35b0e9163c70ae';
35
+ exports.EPOCH2_OPENING_ROOT = 'f2043ee96b6e9f678b76bb3c512b5d911293dbb2a3bf198c98252c83802f3286';
36
+ /** Size 3 has no anchored head and the leaf preimages are not in this repo. */
37
+ const EPOCH1_PREFIX_ROOTS = {
38
+ 1: exports.EPOCH1_SIZE1_ROOT,
39
+ 2: exports.EPOCH1_SIZE2_ROOT,
40
+ 4: exports.EPOCH1_FINAL_ROOT,
41
+ };
42
+ function epoch1PrefixRoot(treeSize) {
43
+ return EPOCH1_PREFIX_ROOTS[Number(treeSize)] || null;
44
+ }
45
+ function matchEpoch1Prefix(treeSize, root) {
46
+ const want = epoch1PrefixRoot(treeSize);
47
+ const got = String(root || '').replace(/^0x/, '').toLowerCase();
48
+ if (!want || got !== want)
49
+ return { ok: false, reason: 'epoch1_prefix' };
50
+ return { ok: true };
51
+ }
52
+ function isGenuineV1Head(head) {
53
+ if (!head)
54
+ return false;
55
+ if (head.schema === exports.TREE_HEAD_SCHEMA_V2 || Number(head.payload_version) === 2)
56
+ return false;
57
+ return head.schema === exports.TREE_HEAD_SCHEMA_V1 || Number(head.payload_version) === 1;
58
+ }
59
+ const ORPHAN_GENESIS_ONLY = '20d887917a4c32a49434e4b8f8db864cbf26a8e3a0daa6f5f89ab097282413f9';
60
+ const ORPHAN_FF950E72 = 'ff950e7204762565751e1c7a6bfbdb167c15452f26259a97f63a2c90b2f61ec3';
61
+ const UNLOGGED_REASONS = new Set(['missing_row_hash', 'forked', 'depends_on_refused']);
62
+ function canonicalUnloggedRows(rows) {
63
+ return (Array.isArray(rows) ? rows : []).map((row) => ({
64
+ task_id: String(row?.task_id || ''),
65
+ agent_id: row?.agent_id == null || row.agent_id === '' ? null : Number(row.agent_id),
66
+ reason: String(row?.reason || ''),
67
+ }));
68
+ }
69
+ function unloggedListHash(rows) {
70
+ return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(rows)).digest('hex');
71
+ }
72
+ function isPlainObject(value) {
73
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
74
+ }
75
+ function verifyUnloggedSection(section) {
76
+ // `in` throws on a string, a number, or a boolean. A hostile value fails closed.
77
+ if (!isPlainObject(section) || !('rows' in section) || !Array.isArray(section.rows)) {
78
+ return { ok: false, reason: 'unlogged_missing' };
79
+ }
80
+ const list = canonicalUnloggedRows(section.rows);
81
+ if (JSON.stringify(list) !== JSON.stringify(section.rows))
82
+ return { ok: false, reason: 'unlogged_canonical' };
83
+ for (const row of list) {
84
+ if (!row.task_id)
85
+ return { ok: false, reason: 'unlogged_task' };
86
+ if (!UNLOGGED_REASONS.has(row.reason))
87
+ return { ok: false, reason: 'unlogged_reason' };
88
+ }
89
+ if (Number(section.count) !== list.length)
90
+ return { ok: false, reason: 'unlogged_count' };
91
+ if (section.hash !== unloggedListHash(list))
92
+ return { ok: false, reason: 'unlogged_hash' };
93
+ return { ok: true };
94
+ }
95
+ /**
96
+ * SHA-256 of `{"count":N,"ids":[...]}`. Ids are unique and sorted by UTF-16
97
+ * code unit. The same bytes the gateway signs into a version 3 epoch record.
98
+ */
99
+ function unloggedIdCommitment(rows) {
100
+ const ids = [];
101
+ const seen = new Set();
102
+ for (const row of Array.isArray(rows) ? rows : []) {
103
+ const id = String(typeof row === 'string' ? row : (row?.task_id || ''));
104
+ if (!id || seen.has(id))
105
+ continue;
106
+ seen.add(id);
107
+ ids.push(id);
108
+ }
109
+ ids.sort();
110
+ const count = ids.length;
111
+ const commitment = (0, node_crypto_1.createHash)('sha256').update(JSON.stringify({ count, ids })).digest('hex');
112
+ return { count, commitment };
113
+ }
114
+ /**
115
+ * Version 3 shape. Extra keys are a disclosure. Pass `ids` to recompute
116
+ * the digest; without them only the shape is checked.
117
+ */
118
+ function verifyUnloggedCommitment(section, ids) {
119
+ if (!section || typeof section !== 'object' || Array.isArray(section)) {
120
+ return { ok: false, reason: 'unlogged_missing' };
121
+ }
122
+ for (const key of Object.keys(section)) {
123
+ if (key !== 'count' && key !== 'commitment')
124
+ return { ok: false, reason: 'unlogged_disclosed' };
125
+ }
126
+ const commitment = section.commitment;
127
+ const count = section.count;
128
+ if (!Number.isInteger(count) || count < 0)
129
+ return { ok: false, reason: 'unlogged_count' };
130
+ if (typeof commitment !== 'string' || !/^[0-9a-f]{64}$/.test(commitment)) {
131
+ return { ok: false, reason: 'unlogged_commitment' };
132
+ }
133
+ if (ids != null) {
134
+ const expect = unloggedIdCommitment(ids);
135
+ if (expect.count !== count || expect.commitment !== commitment) {
136
+ return { ok: false, reason: 'unlogged_commitment' };
137
+ }
138
+ }
139
+ return { ok: true };
140
+ }
141
+ /**
142
+ * Reason for a task a version 2 record attested as outside the tree.
143
+ * Null when the list does not verify. A version 3 commitment has no reason.
144
+ */
145
+ function unloggedReasonForTask(record, taskId) {
146
+ if (Number(record?.payload_version) !== 2)
147
+ return null;
148
+ const section = record?.unlogged;
149
+ if (!isPlainObject(section) || !('rows' in section) || !Array.isArray(section.rows))
150
+ return null;
151
+ const checked = verifyUnloggedSection(section);
152
+ if (!checked.ok)
153
+ return null;
154
+ const id = String(taskId || '');
155
+ const rows = section.rows;
156
+ return rows.find((row) => row.task_id === id) || null;
157
+ }
158
+ function acceptTreeHeadSchema(head) {
159
+ if (!head || typeof head !== 'object')
160
+ return { ok: false, reason: 'no_head' };
161
+ const schema = head.schema;
162
+ const version = head.payload_version;
163
+ if (schema == null && version == null)
164
+ return { ok: true };
165
+ if (schema === exports.TREE_HEAD_SCHEMA_V1 || schema === exports.TREE_HEAD_SCHEMA_V2 || schema == null) {
166
+ if (version == null || version === 1 || version === 2)
167
+ return { ok: true };
168
+ }
169
+ return { ok: false, reason: 'unknown_head_schema' };
170
+ }
171
+ /**
172
+ * Epoch 1 (and a head with no epoch, the v1 shape) has no predecessor.
173
+ * A later epoch must point at the previous epoch's root and size.
174
+ */
175
+ function verifyEpochLink(head, previous) {
176
+ const schema = acceptTreeHeadSchema(head);
177
+ if (!schema.ok)
178
+ return schema;
179
+ const explicitEpoch = head?.epoch == null ? null : Number(head.epoch);
180
+ if (explicitEpoch == null) {
181
+ if (!isGenuineV1Head(head))
182
+ return { ok: false, reason: 'epoch_missing' };
183
+ if (head?.prev_epoch_root)
184
+ return { ok: false, reason: 'epoch1_has_prev' };
185
+ return { ok: true };
186
+ }
187
+ const epoch = explicitEpoch;
188
+ if (!Number.isInteger(epoch) || epoch < 1)
189
+ return { ok: false, reason: 'bad_epoch' };
190
+ if (epoch === 1) {
191
+ if (head?.prev_epoch_root)
192
+ return { ok: false, reason: 'epoch1_has_prev' };
193
+ const sizeRaw = head?.tree_size ?? head?.final_size;
194
+ const size = sizeRaw == null ? null : Number(sizeRaw);
195
+ const rootRaw = head?.root ?? head?.final_root;
196
+ const root = typeof rootRaw === 'string' ? rootRaw.replace(/^0x/, '').toLowerCase() : '';
197
+ if (size !== exports.EPOCH1_FINAL_SIZE || root !== exports.EPOCH1_FINAL_ROOT) {
198
+ return { ok: false, reason: 'epoch1_root' };
199
+ }
200
+ const recordShape = head?.final_size != null || head?.genesis_digest != null;
201
+ if (recordShape && head?.genesis_digest !== exports.EPOCH1_GENESIS_DIGEST) {
202
+ return { ok: false, reason: 'epoch1_genesis' };
203
+ }
204
+ return { ok: true };
205
+ }
206
+ if (!previous?.root)
207
+ return { ok: false, reason: 'missing_previous_epoch' };
208
+ if (head?.prev_epoch_root !== previous.root)
209
+ return { ok: false, reason: 'prev_epoch_root' };
210
+ if (Number(head?.prev_epoch_size) !== Number(previous.tree_size))
211
+ return { ok: false, reason: 'prev_epoch_size' };
212
+ return { ok: true };
213
+ }
214
+ /**
215
+ * Epoch 1 is pinned to dd20e39a, size 4, genesis 422cceb1.
216
+ * A self-consistent chain with another root does not verify.
217
+ * The issuer signature is required. d7f6c548 must be present, root null,
218
+ * and marked unrecoverable.
219
+ */
220
+ function verifyEpochRecord(record, options = {}) {
221
+ const jws = record?.issuer_signature?.jws;
222
+ if (!jws)
223
+ return { ok: false, reason: 'epoch_signature_missing' };
224
+ if (typeof options.verifySignature !== 'function') {
225
+ return { ok: false, reason: 'epoch_signature_unverified' };
226
+ }
227
+ if (!options.verifySignature(jws))
228
+ return { ok: false, reason: 'epoch_signature_invalid' };
229
+ const epochs = record?.epochs;
230
+ if (!Array.isArray(epochs) || epochs.length === 0)
231
+ return { ok: false, reason: 'no_epochs' };
232
+ for (let i = 0; i < epochs.length; i += 1) {
233
+ const row = epochs[i];
234
+ if (Number(row.epoch) !== i + 1)
235
+ return { ok: false, reason: 'epoch_index' };
236
+ if (i === 0) {
237
+ if (row.prev_epoch_root != null)
238
+ return { ok: false, reason: 'epoch1_has_prev' };
239
+ if (Number(row.prev_epoch_size || 0) !== 0)
240
+ return { ok: false, reason: 'epoch1_size' };
241
+ continue;
242
+ }
243
+ const prev = epochs[i - 1];
244
+ const prevRoot = prev.final_root || prev.opening_root;
245
+ const prevSize = prev.final_size ?? prev.opening_size;
246
+ if (row.prev_epoch_root !== prevRoot)
247
+ return { ok: false, reason: 'prev_epoch_root' };
248
+ if (Number(row.prev_epoch_size) !== Number(prevSize))
249
+ return { ok: false, reason: 'prev_epoch_size' };
250
+ }
251
+ if (!Array.isArray(record?.orphans))
252
+ return { ok: false, reason: 'orphans_missing' };
253
+ const epoch1 = epochs.find((row) => Number(row.epoch) === 1);
254
+ if (!epoch1)
255
+ return { ok: false, reason: 'epoch1_missing' };
256
+ if (epoch1.final_root !== exports.EPOCH1_FINAL_ROOT || Number(epoch1.final_size) !== exports.EPOCH1_FINAL_SIZE) {
257
+ return { ok: false, reason: 'epoch1_root' };
258
+ }
259
+ if (epoch1.genesis_digest !== exports.EPOCH1_GENESIS_DIGEST)
260
+ return { ok: false, reason: 'epoch1_genesis' };
261
+ const epoch2 = epochs.find((row) => Number(row.epoch) === 2);
262
+ if (epoch2) {
263
+ if (epoch2.prev_epoch_root !== exports.EPOCH1_FINAL_ROOT || Number(epoch2.prev_epoch_size) !== exports.EPOCH1_FINAL_SIZE) {
264
+ return { ok: false, reason: 'prev_epoch_root' };
265
+ }
266
+ if (epoch2.opening_root && epoch2.opening_root !== exports.EPOCH2_OPENING_ROOT) {
267
+ return { ok: false, reason: 'epoch2_opening' };
268
+ }
269
+ }
270
+ const orphans = record.orphans;
271
+ const lost = orphans.find((row) => row?.root_prefix === 'd7f6c548');
272
+ if (!lost)
273
+ return { ok: false, reason: 'orphan_d7f6c548_missing' };
274
+ if (lost.root != null)
275
+ return { ok: false, reason: 'orphan_d7f6c548_root_invented' };
276
+ if (lost.unrecoverable !== true)
277
+ return { ok: false, reason: 'orphan_d7f6c548_unmarked' };
278
+ if (!orphans.some((row) => row?.root === ORPHAN_GENESIS_ONLY))
279
+ return { ok: false, reason: 'orphans_incomplete' };
280
+ if (!orphans.some((row) => row?.root === exports.EPOCH2_OPENING_ROOT))
281
+ return { ok: false, reason: 'orphans_incomplete' };
282
+ const version = Number(record.payload_version) || 1;
283
+ if (version === 1) {
284
+ if (record.unlogged != null)
285
+ return { ok: false, reason: 'unlogged_unexpected' };
286
+ }
287
+ else if (version === 2) {
288
+ const listed = verifyUnloggedSection(record.unlogged);
289
+ if (!listed.ok)
290
+ return listed;
291
+ const chains = v2OrphanChains(orphans);
292
+ if (!chains.ok)
293
+ return chains;
294
+ }
295
+ else if (version === 3) {
296
+ const listed = verifyUnloggedCommitment(record.unlogged);
297
+ if (!listed.ok)
298
+ return listed;
299
+ const chains = v2OrphanChains(orphans);
300
+ if (!chains.ok)
301
+ return chains;
302
+ }
303
+ else {
304
+ return { ok: false, reason: 'epoch_record_version' };
305
+ }
306
+ return { ok: true };
307
+ }
308
+ function v2OrphanChains(orphans) {
309
+ const early = orphans.find((row) => row?.root === ORPHAN_FF950E72);
310
+ if (!early)
311
+ return { ok: false, reason: 'orphan_ff950e72_missing' };
312
+ if (early.chain !== 'base' || early.solana !== 'absent')
313
+ return { ok: false, reason: 'orphan_ff950e72_chain' };
314
+ const genesis = orphans.find((row) => row?.root === ORPHAN_GENESIS_ONLY);
315
+ if (genesis?.chain !== 'base_and_solana')
316
+ return { ok: false, reason: 'orphan_20d88791_chain' };
317
+ const lost = orphans.find((row) => row?.root_prefix === 'd7f6c548');
318
+ if (lost?.chain !== 'base_and_solana')
319
+ return { ok: false, reason: 'orphan_d7f6c548_chain' };
320
+ return { ok: true };
321
+ }
322
+ /**
323
+ * Inclusion against the epoch the proof names. Epoch 1 proofs with no epoch
324
+ * field stay valid. A later epoch also has to link to the previous epoch.
325
+ */
326
+ function verifyEpochInclusion(input) {
327
+ const epoch = input.epoch == null ? 1 : Number(input.epoch);
328
+ if (epoch === 1) {
329
+ const prefix = matchEpoch1Prefix(input.treeSize, input.root);
330
+ if (!prefix.ok)
331
+ return prefix;
332
+ }
333
+ let leaf = input.leaf ? new Uint8Array(input.leaf) : null;
334
+ if (!leaf && input.taskId) {
335
+ leaf = (0, anchor_witness_js_1.leafHash)(Buffer.from(`${input.taskId}|${input.rowHash || ''}`));
336
+ }
337
+ if (!leaf)
338
+ return { ok: false, reason: 'no_leaf' };
339
+ const included = (0, anchor_witness_js_1.verifyMerkleInclusion)(Buffer.from(leaf), input.index, input.treeSize, input.root, input.proof);
340
+ if (!included)
341
+ return { ok: false, reason: 'inclusion_failed' };
342
+ if (epoch === 1)
343
+ return { ok: true };
344
+ return verifyEpochLink({
345
+ schema: exports.TREE_HEAD_SCHEMA_V2,
346
+ payload_version: 2,
347
+ epoch,
348
+ prev_epoch_root: input.prevEpochRoot,
349
+ prev_epoch_size: input.prevEpochSize,
350
+ }, input.previous);
351
+ }
352
+ //# sourceMappingURL=epoch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epoch.js","sourceRoot":"","sources":["../src/epoch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Payload v9 binds `(tree_head_hash, tolerance)` inside the issuer JWS.
3
+ * v8 and earlier omit the pair and keep their current verification path.
4
+ *
5
+ * The pair is read only from claims the caller has already verified.
6
+ * An unsigned outer copy that disagrees fails the check. Lockstep with
7
+ * `services/gateway/src/receipt-head-binding.js`.
8
+ */
9
+ export declare const HEAD_BINDING_PAYLOAD_VERSION = 9;
10
+ export type HeadBindingVerdict = 'not_present_legacy' | 'missing' | 'ok';
11
+ export interface SignedHeadBinding {
12
+ verdict: HeadBindingVerdict;
13
+ tree_head_hash: string | null;
14
+ tolerance: unknown;
15
+ }
16
+ export declare function headBindingVerdict(claims: Record<string, unknown> | null | undefined): HeadBindingVerdict;
17
+ /** Pair from verified claims. Does not read the unsigned receipt. */
18
+ export declare function signedHeadBinding(claims: Record<string, unknown> | null | undefined): SignedHeadBinding;
19
+ /** Which unsigned field disagrees, or null. v8 claims are not compared. */
20
+ export declare function outerHeadDisagrees(receipt: {
21
+ tree_head_hash?: unknown;
22
+ tolerance?: unknown;
23
+ } | null | undefined, claims: Record<string, unknown> | null | undefined): 'tree_head_hash' | 'tolerance' | null;
24
+ //# sourceMappingURL=head-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head-binding.d.ts","sourceRoot":"","sources":["../src/head-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG,SAAS,GAAG,IAAI,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,kBAAkB,CASpB;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,iBAAiB,CAWnB;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EAC7E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAevC"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Payload v9 binds `(tree_head_hash, tolerance)` inside the issuer JWS.
4
+ * v8 and earlier omit the pair and keep their current verification path.
5
+ *
6
+ * The pair is read only from claims the caller has already verified.
7
+ * An unsigned outer copy that disagrees fails the check. Lockstep with
8
+ * `services/gateway/src/receipt-head-binding.js`.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.HEAD_BINDING_PAYLOAD_VERSION = void 0;
12
+ exports.headBindingVerdict = headBindingVerdict;
13
+ exports.signedHeadBinding = signedHeadBinding;
14
+ exports.outerHeadDisagrees = outerHeadDisagrees;
15
+ exports.HEAD_BINDING_PAYLOAD_VERSION = 9;
16
+ function headBindingVerdict(claims) {
17
+ if (!claims || typeof claims !== 'object')
18
+ return 'not_present_legacy';
19
+ const version = Number(claims.payload_version);
20
+ if (!Number.isFinite(version) || version < exports.HEAD_BINDING_PAYLOAD_VERSION) {
21
+ return 'not_present_legacy';
22
+ }
23
+ if (!Object.prototype.hasOwnProperty.call(claims, 'tree_head_hash'))
24
+ return 'missing';
25
+ if (!Object.prototype.hasOwnProperty.call(claims, 'tolerance'))
26
+ return 'missing';
27
+ return 'ok';
28
+ }
29
+ /** Pair from verified claims. Does not read the unsigned receipt. */
30
+ function signedHeadBinding(claims) {
31
+ const verdict = headBindingVerdict(claims);
32
+ if (verdict !== 'ok' || !claims) {
33
+ return { verdict: verdict === 'ok' ? 'missing' : verdict, tree_head_hash: null, tolerance: null };
34
+ }
35
+ const hash = claims.tree_head_hash;
36
+ return {
37
+ verdict,
38
+ tree_head_hash: hash == null || hash === '' ? null : String(hash),
39
+ tolerance: claims.tolerance ?? null,
40
+ };
41
+ }
42
+ /** Which unsigned field disagrees, or null. v8 claims are not compared. */
43
+ function outerHeadDisagrees(receipt, claims) {
44
+ const signed = signedHeadBinding(claims);
45
+ if (signed.verdict !== 'ok' || !receipt || typeof receipt !== 'object')
46
+ return null;
47
+ if (Object.prototype.hasOwnProperty.call(receipt, 'tree_head_hash')) {
48
+ const outer = receipt.tree_head_hash == null || receipt.tree_head_hash === ''
49
+ ? null
50
+ : String(receipt.tree_head_hash);
51
+ if (outer !== signed.tree_head_hash)
52
+ return 'tree_head_hash';
53
+ }
54
+ if (Object.prototype.hasOwnProperty.call(receipt, 'tolerance')) {
55
+ if (JSON.stringify(receipt.tolerance ?? null) !== JSON.stringify(signed.tolerance ?? null)) {
56
+ return 'tolerance';
57
+ }
58
+ }
59
+ return null;
60
+ }
61
+ //# sourceMappingURL=head-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head-binding.js","sourceRoot":"","sources":["../src/head-binding.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAYH,gDAWC;AAGD,8CAaC;AAGD,gDAkBC;AA1DY,QAAA,4BAA4B,GAAG,CAAC,CAAC;AAU9C,SAAgB,kBAAkB,CAChC,MAAkD;IAElD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,oBAAoB,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,oCAA4B,EAAE,CAAC;QACxE,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;QAAE,OAAO,SAAS,CAAC;IACtF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qEAAqE;AACrE,SAAgB,iBAAiB,CAC/B,MAAkD;IAElD,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpG,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;IACnC,OAAO;QACL,OAAO;QACP,cAAc,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACjE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;KACpC,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,SAAgB,kBAAkB,CAChC,OAA6E,EAC7E,MAAkD;IAElD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACpF,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,IAAI,OAAO,CAAC,cAAc,KAAK,EAAE;YAC3E,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,MAAM,CAAC,cAAc;YAAE,OAAO,gBAAgB,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3F,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}