@xfuel/verify 0.3.1 → 0.3.4

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 (60) hide show
  1. package/README.md +16 -6
  2. package/dist/anchor-trust.d.ts +129 -0
  3. package/dist/anchor-trust.d.ts.map +1 -0
  4. package/dist/anchor-trust.js +395 -0
  5. package/dist/anchor-trust.js.map +1 -0
  6. package/dist/anchor-witness.d.ts +114 -4
  7. package/dist/anchor-witness.d.ts.map +1 -1
  8. package/dist/anchor-witness.js +419 -32
  9. package/dist/anchor-witness.js.map +1 -1
  10. package/dist/carry-forward.d.ts +79 -0
  11. package/dist/carry-forward.d.ts.map +1 -0
  12. package/dist/carry-forward.js +184 -0
  13. package/dist/carry-forward.js.map +1 -0
  14. package/dist/cli.js +691 -42
  15. package/dist/cli.js.map +1 -1
  16. package/dist/epoch.d.ts +41 -7
  17. package/dist/epoch.d.ts.map +1 -1
  18. package/dist/epoch.js +143 -0
  19. package/dist/epoch.js.map +1 -1
  20. package/dist/index.d.ts +65 -6
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +348 -96
  23. package/dist/index.js.map +1 -1
  24. package/dist/issuer-history.d.ts +19 -0
  25. package/dist/issuer-history.d.ts.map +1 -1
  26. package/dist/issuer-history.js +131 -75
  27. package/dist/issuer-history.js.map +1 -1
  28. package/dist/issuer-pin.d.ts +126 -0
  29. package/dist/issuer-pin.d.ts.map +1 -0
  30. package/dist/issuer-pin.js +567 -0
  31. package/dist/issuer-pin.js.map +1 -0
  32. package/dist/preimage.d.ts +29 -0
  33. package/dist/preimage.d.ts.map +1 -1
  34. package/dist/preimage.js +162 -2
  35. package/dist/preimage.js.map +1 -1
  36. package/dist/receipt-lane.d.ts +1 -0
  37. package/dist/receipt-lane.d.ts.map +1 -1
  38. package/dist/receipt-lane.js +5 -2
  39. package/dist/receipt-lane.js.map +1 -1
  40. package/dist/refusal.d.ts +5 -2
  41. package/dist/refusal.d.ts.map +1 -1
  42. package/dist/refusal.js +28 -6
  43. package/dist/refusal.js.map +1 -1
  44. package/dist/request-binding.d.ts +7 -0
  45. package/dist/request-binding.d.ts.map +1 -0
  46. package/dist/request-binding.js +26 -0
  47. package/dist/request-binding.js.map +1 -0
  48. package/dist/row-hash.d.ts +22 -0
  49. package/dist/row-hash.d.ts.map +1 -0
  50. package/dist/row-hash.js +26 -0
  51. package/dist/row-hash.js.map +1 -0
  52. package/dist/shell.d.ts +65 -0
  53. package/dist/shell.d.ts.map +1 -0
  54. package/dist/shell.js +268 -0
  55. package/dist/shell.js.map +1 -0
  56. package/dist/v11-receipt.d.ts +21 -0
  57. package/dist/v11-receipt.d.ts.map +1 -0
  58. package/dist/v11-receipt.js +351 -0
  59. package/dist/v11-receipt.js.map +1 -0
  60. package/package.json +1 -1
@@ -0,0 +1,567 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ISSUER_PIN_CHAIN_REFUSED = exports.ISSUER_ROTATION_UNCONTROLLED = exports.ISSUER_PIN_MUTABLE_REF = exports.ISSUER_PIN_DOWNGRADE = exports.ISSUER_SELF_SIG_INVALID = exports.ISSUER_PIN_HASH_MISMATCH = exports.ISSUER_PIN_MISMATCH = exports.PUBLISHED_ISSUER_PIN_KID = exports.ISSUER_PIN_REPO = exports.CITIZEN_FREEZE_PURPOSE = exports.CITIZEN_FREEZE_SCHEMA = exports.ISSUER_PIN_CHAIN_ID = exports.ISSUER_PIN_PATH = exports.ISSUER_PIN_SCHEMA = exports.ISSUER_PIN_VERSION = exports.ISSUER_ROTATION_CONTEXT = exports.ISSUER_REGISTRATION_CONTEXT = void 0;
4
+ exports.issuerPinFileHash = issuerPinFileHash;
5
+ exports.canonicalPublicKey = canonicalPublicKey;
6
+ exports.registrationPreimage = registrationPreimage;
7
+ exports.rotationStatement = rotationStatement;
8
+ exports.serializeIssuerPin = serializeIssuerPin;
9
+ exports.issuerPinContentUrl = issuerPinContentUrl;
10
+ exports.loadIssuerPinBytes = loadIssuerPinBytes;
11
+ exports.readIssuerPinClaim = readIssuerPinClaim;
12
+ exports.verifyRegistrationSignature = verifyRegistrationSignature;
13
+ exports.verifyCitizenRotation = verifyCitizenRotation;
14
+ exports.assessIssuerPin = assessIssuerPin;
15
+ /**
16
+ * Content-addressed issuer public key for a pinned era.
17
+ *
18
+ * The pin is a file at one git commit plus the SHA-256 of that file.
19
+ * This module does not fetch. A caller who fetches must use
20
+ * {@link issuerPinContentUrl}, which returns a URL only for a 40-hex
21
+ * commit and the fixed path. A branch name, HEAD, or main is
22
+ * ISSUER_PIN_MUTABLE_REF and no request is made.
23
+ *
24
+ * Sepolia only (`eip155:84532`). The registration self-signature is not a
25
+ * receipt. Rotation is a chit402.freeze.v1 control event signed by the
26
+ * previous pin key (`purpose: citizen_issuer_key`), not an edited file.
27
+ */
28
+ const node_crypto_1 = require("node:crypto");
29
+ const jws_js_1 = require("./jws.js");
30
+ exports.ISSUER_REGISTRATION_CONTEXT = 'chit402-issuer-registration-v1';
31
+ exports.ISSUER_ROTATION_CONTEXT = 'chit402-issuer-rotation-v1';
32
+ exports.ISSUER_PIN_VERSION = 1;
33
+ exports.ISSUER_PIN_SCHEMA = 'chit402.issuer_key_pin.v1';
34
+ exports.ISSUER_PIN_PATH = 'docs/well-known/issuer-key.json';
35
+ exports.ISSUER_PIN_CHAIN_ID = 'eip155:84532';
36
+ exports.CITIZEN_FREEZE_SCHEMA = 'chit402.freeze.v1';
37
+ exports.CITIZEN_FREEZE_PURPOSE = 'citizen_issuer_key';
38
+ exports.ISSUER_PIN_REPO = 'XFuel-Lab/chit402';
39
+ /**
40
+ * Kid of the Sepolia specimen in docs/well-known/issuer-key.json.
41
+ * A different kid is a rotation and needs the previous pin.
42
+ */
43
+ exports.PUBLISHED_ISSUER_PIN_KID = 'kATmVjz6J8QvSTS-bS1NUjWaLs35o-PXYurO2blMf-c';
44
+ exports.ISSUER_PIN_MISMATCH = 'ISSUER_PIN_MISMATCH';
45
+ exports.ISSUER_PIN_HASH_MISMATCH = 'ISSUER_PIN_HASH_MISMATCH';
46
+ exports.ISSUER_SELF_SIG_INVALID = 'ISSUER_SELF_SIG_INVALID';
47
+ exports.ISSUER_PIN_DOWNGRADE = 'ISSUER_PIN_DOWNGRADE';
48
+ exports.ISSUER_PIN_MUTABLE_REF = 'ISSUER_PIN_MUTABLE_REF';
49
+ exports.ISSUER_ROTATION_UNCONTROLLED = 'ISSUER_ROTATION_UNCONTROLLED';
50
+ exports.ISSUER_PIN_CHAIN_REFUSED = 'ISSUER_PIN_CHAIN_REFUSED';
51
+ const COMMIT_SHA = /^[0-9a-f]{40}$/;
52
+ const FILE_SHA = /^[0-9a-f]{64}$/;
53
+ const CREATED_AT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/;
54
+ function issuerPinFileHash(bytes) {
55
+ return (0, node_crypto_1.createHash)('sha256').update(Buffer.from(bytes, 'utf8')).digest('hex');
56
+ }
57
+ function canonicalPublicKey(jwk) {
58
+ return JSON.stringify({ crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y });
59
+ }
60
+ /**
61
+ * Registration preimage. The context, version, kid, created_at, and key
62
+ * are fixed fields, so a signature over another purpose or another key
63
+ * does not verify.
64
+ */
65
+ function registrationPreimage(input) {
66
+ return [
67
+ exports.ISSUER_REGISTRATION_CONTEXT,
68
+ String(exports.ISSUER_PIN_VERSION),
69
+ input.kid,
70
+ input.createdAt,
71
+ canonicalPublicKey(input.jwk),
72
+ ].join('\n');
73
+ }
74
+ function rotationStatement(input) {
75
+ return [
76
+ exports.ISSUER_ROTATION_CONTEXT,
77
+ String(exports.ISSUER_PIN_VERSION),
78
+ input.priorKid,
79
+ input.nextKid,
80
+ input.pinSha256,
81
+ input.pinCommit,
82
+ input.createdAt,
83
+ exports.ISSUER_PIN_CHAIN_ID,
84
+ ].join('\n');
85
+ }
86
+ function serializeIssuerPin(doc) {
87
+ const body = {
88
+ schema: exports.ISSUER_PIN_SCHEMA,
89
+ version: exports.ISSUER_PIN_VERSION,
90
+ chain_id: doc.chain_id,
91
+ created_at: doc.created_at,
92
+ jwk: {
93
+ kty: doc.jwk.kty,
94
+ crv: doc.jwk.crv,
95
+ x: doc.jwk.x,
96
+ y: doc.jwk.y,
97
+ kid: doc.jwk.kid,
98
+ alg: 'ES256',
99
+ use: 'sig',
100
+ },
101
+ self_signature: doc.self_signature,
102
+ control: doc.control,
103
+ };
104
+ return `${JSON.stringify(body, null, 2)}\n`;
105
+ }
106
+ /**
107
+ * URL of the pin blob at one commit. A branch, HEAD, or any non-40-hex
108
+ * ref returns ISSUER_PIN_MUTABLE_REF and does not build a URL.
109
+ */
110
+ function issuerPinContentUrl(commit, path = exports.ISSUER_PIN_PATH) {
111
+ if (!COMMIT_SHA.test(commit) || path !== exports.ISSUER_PIN_PATH) {
112
+ return { ok: false, code: exports.ISSUER_PIN_MUTABLE_REF };
113
+ }
114
+ return {
115
+ ok: true,
116
+ url: `https://raw.githubusercontent.com/${exports.ISSUER_PIN_REPO}/${commit}/${path}`,
117
+ };
118
+ }
119
+ async function loadIssuerPinBytes(ref, fetchImpl) {
120
+ const url = issuerPinContentUrl(ref.commit, ref.path);
121
+ if (!url.ok)
122
+ return { ok: false, code: url.code };
123
+ const buf = await fetchImpl(url.url);
124
+ const bytes = Buffer.from(buf).toString('utf8');
125
+ const expect = ref.sha256.toLowerCase();
126
+ if (!FILE_SHA.test(expect) || issuerPinFileHash(bytes) !== expect) {
127
+ return { ok: false, code: exports.ISSUER_PIN_HASH_MISMATCH };
128
+ }
129
+ return { ok: true, bytes };
130
+ }
131
+ function singleLine(value) {
132
+ return value.length > 0 && !/[\r\n]/.test(value);
133
+ }
134
+ function publicKeyOf(jwk) {
135
+ return (0, node_crypto_1.createPublicKey)({
136
+ key: { kty: jwk.kty, crv: jwk.crv, x: jwk.x, y: jwk.y },
137
+ format: 'jwk',
138
+ });
139
+ }
140
+ function asJwk(value) {
141
+ return value;
142
+ }
143
+ function readRecord(value) {
144
+ if (!value || typeof value !== 'object' || Array.isArray(value))
145
+ return null;
146
+ return value;
147
+ }
148
+ function readIssuerPinClaim(doc) {
149
+ const root = readRecord(doc);
150
+ const pin = readRecord(root?.issuer_key_pin);
151
+ if (!pin)
152
+ return { claimed: false, ref: null };
153
+ const commit = typeof pin.commit === 'string' ? pin.commit : '';
154
+ const path = typeof pin.path === 'string' ? pin.path : '';
155
+ const sha256 = typeof pin.sha256 === 'string' ? pin.sha256 : '';
156
+ const ref = (commit || path || sha256)
157
+ ? { commit, path: path || exports.ISSUER_PIN_PATH, sha256: sha256.toLowerCase() }
158
+ : null;
159
+ return { claimed: true, ref };
160
+ }
161
+ function parsePinDocument(bytes) {
162
+ let raw;
163
+ try {
164
+ raw = JSON.parse(bytes);
165
+ }
166
+ catch {
167
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
168
+ }
169
+ const doc = readRecord(raw);
170
+ if (!doc)
171
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
172
+ if (doc.schema !== exports.ISSUER_PIN_SCHEMA || doc.version !== exports.ISSUER_PIN_VERSION) {
173
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
174
+ }
175
+ if (doc.chain_id !== exports.ISSUER_PIN_CHAIN_ID) {
176
+ return { ok: false, code: exports.ISSUER_PIN_CHAIN_REFUSED };
177
+ }
178
+ if (typeof doc.created_at !== 'string' || !CREATED_AT.test(doc.created_at)) {
179
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
180
+ }
181
+ const jwk = readRecord(doc.jwk);
182
+ if (!jwk || !(0, jws_js_1.isEs256PublicJwk)(asJwk(jwk)))
183
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
184
+ if ('d' in jwk)
185
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
186
+ const key = asJwk(jwk);
187
+ const kid = (0, jws_js_1.jwkThumbprint)(key);
188
+ if (!key.kid || key.kid !== kid || !singleLine(kid))
189
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
190
+ const signature = doc.self_signature == null ? null : doc.self_signature;
191
+ if (signature != null && typeof signature !== 'string')
192
+ return { ok: false, code: exports.ISSUER_SELF_SIG_INVALID };
193
+ let control = null;
194
+ if (doc.control != null) {
195
+ const row = readRecord(doc.control);
196
+ if (!row || typeof row.jws !== 'string' || !row.jws) {
197
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
198
+ }
199
+ control = { jws: row.jws };
200
+ }
201
+ return {
202
+ ok: true,
203
+ pin: {
204
+ schema: exports.ISSUER_PIN_SCHEMA,
205
+ version: exports.ISSUER_PIN_VERSION,
206
+ chain_id: exports.ISSUER_PIN_CHAIN_ID,
207
+ created_at: doc.created_at,
208
+ jwk: { kty: 'EC', crv: 'P-256', x: key.x, y: key.y, kid, alg: 'ES256', use: 'sig' },
209
+ self_signature: signature,
210
+ control,
211
+ },
212
+ };
213
+ }
214
+ function verifyRegistrationSignature(pin) {
215
+ if (pin.self_signature == null || pin.self_signature === '') {
216
+ return { ok: true, code: null };
217
+ }
218
+ const kid = pin.jwk.kid || (0, jws_js_1.jwkThumbprint)(pin.jwk);
219
+ const message = registrationPreimage({ kid, createdAt: pin.created_at, jwk: pin.jwk });
220
+ try {
221
+ const valid = (0, node_crypto_1.verify)('sha256', Buffer.from(message, 'utf8'), { key: publicKeyOf(pin.jwk), dsaEncoding: 'ieee-p1363' }, Buffer.from(pin.self_signature, 'base64url'));
222
+ return valid ? { ok: true, code: null } : { ok: false, code: exports.ISSUER_SELF_SIG_INVALID };
223
+ }
224
+ catch {
225
+ return { ok: false, code: exports.ISSUER_SELF_SIG_INVALID };
226
+ }
227
+ }
228
+ function witnessKids(source) {
229
+ const root = readRecord(source);
230
+ if (!root)
231
+ return [];
232
+ const out = [];
233
+ if (typeof root.kid === 'string')
234
+ out.push(root.kid);
235
+ if (typeof root.issuer_kid === 'string')
236
+ out.push(root.issuer_kid);
237
+ const lists = [root.witnesses, root.keys];
238
+ for (const list of lists) {
239
+ if (!Array.isArray(list))
240
+ continue;
241
+ for (const item of list) {
242
+ const row = readRecord(item);
243
+ if (!row)
244
+ continue;
245
+ if (typeof row.kid === 'string')
246
+ out.push(row.kid);
247
+ const jwk = readRecord(row.jwk) || row;
248
+ if ((0, jws_js_1.isEs256PublicJwk)(asJwk(jwk)))
249
+ out.push((0, jws_js_1.jwkThumbprint)(asJwk(jwk)));
250
+ }
251
+ }
252
+ return out;
253
+ }
254
+ function payloadIssuerRootKid(payload) {
255
+ const issuerRoot = readRecord(payload?.issuer_root);
256
+ return typeof issuerRoot?.kid === 'string' && issuerRoot.kid ? issuerRoot.kid : null;
257
+ }
258
+ /**
259
+ * Kids the pin check is allowed to trust.
260
+ *
261
+ * A compact `issuer_signature.jws` is verified against the pin key. The kid
262
+ * comes from that protected header, and a v11 `issuer_root.kid` comes from
263
+ * the verified payload. Unsigned envelope copies are not a second source of
264
+ * truth: when they disagree with the signed values the check fails closed.
265
+ *
266
+ * When the receipt or the head claims `issuer_key_pin`, unsigned
267
+ * `issuer_signature.kid`, `issuer_jwk`, and `issuer_root.kid` do not satisfy
268
+ * the check. A missing JWS fails closed. Stripping the JWS and leaving a
269
+ * matching unsigned kid is `ISSUER_PIN_MISMATCH`.
270
+ */
271
+ function receiptKids(receipt, pin, requireVerifiedJws) {
272
+ const root = readRecord(receipt);
273
+ const sig = readRecord(root?.issuer_signature);
274
+ const outerKid = typeof sig?.kid === 'string' && sig.kid ? sig.kid : null;
275
+ const embedded = readRecord(sig?.issuer_jwk);
276
+ const embeddedKids = [];
277
+ if (embedded && (0, jws_js_1.isEs256PublicJwk)(asJwk(embedded))) {
278
+ embeddedKids.push((0, jws_js_1.jwkThumbprint)(asJwk(embedded)));
279
+ if (typeof embedded.kid === 'string' && embedded.kid)
280
+ embeddedKids.push(embedded.kid);
281
+ }
282
+ const outerRootKid = payloadIssuerRootKid(root);
283
+ const pinKid = pin.kid || (0, jws_js_1.jwkThumbprint)(pin);
284
+ const jws = typeof sig?.jws === 'string' ? sig.jws : '';
285
+ if (!jws) {
286
+ const unsigned = [...(outerKid ? [outerKid] : []), ...embeddedKids];
287
+ if (outerRootKid)
288
+ unsigned.push(outerRootKid);
289
+ if (!requireVerifiedJws) {
290
+ return { ok: true, kids: unsigned, issuerRoot: outerRootKid };
291
+ }
292
+ for (const kid of unsigned) {
293
+ if (kid !== pinKid)
294
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
295
+ }
296
+ return { ok: true, kids: [], issuerRoot: null };
297
+ }
298
+ const verified = (0, jws_js_1.verifyIssuerJws)(jws, pin);
299
+ if (!verified.valid || !verified.payload)
300
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
301
+ const header = (0, jws_js_1.readJwsHeader)(jws);
302
+ const signedKid = typeof header?.kid === 'string' && header.kid ? header.kid : pinKid;
303
+ if (signedKid !== pinKid)
304
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
305
+ const signedRootKid = payloadIssuerRootKid(verified.payload);
306
+ if (outerKid && outerKid !== signedKid)
307
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
308
+ for (const kid of embeddedKids) {
309
+ if (kid !== signedKid)
310
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
311
+ }
312
+ if (signedRootKid && signedRootKid !== signedKid)
313
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
314
+ if (outerRootKid && outerRootKid !== (signedRootKid || signedKid)) {
315
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
316
+ }
317
+ return { ok: true, kids: [signedKid], issuerRoot: signedRootKid };
318
+ }
319
+ function verifyCitizenRotation(input) {
320
+ const priorKid = input.prior.jwk.kid || '';
321
+ const nextKid = input.next.jwk.kid || '';
322
+ // A prior that is not the published specimen is not a control key.
323
+ // Same-kid copies of an attacker pin do not waive the specimen gate.
324
+ if (priorKid !== exports.PUBLISHED_ISSUER_PIN_KID) {
325
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
326
+ }
327
+ if (nextKid === priorKid)
328
+ return { ok: true };
329
+ if (!input.controlJws)
330
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
331
+ if (!COMMIT_SHA.test(input.nextCommit) || !FILE_SHA.test(input.nextHash)) {
332
+ return { ok: false, code: exports.ISSUER_PIN_MUTABLE_REF };
333
+ }
334
+ const verified = (0, jws_js_1.verifyIssuerJws)(input.controlJws, input.prior.jwk);
335
+ if (!verified.valid || !verified.payload)
336
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
337
+ const payload = verified.payload;
338
+ if (payload.chain_id != null && payload.chain_id !== exports.ISSUER_PIN_CHAIN_ID) {
339
+ return { ok: false, code: exports.ISSUER_PIN_CHAIN_REFUSED };
340
+ }
341
+ const statement = rotationStatement({
342
+ priorKid,
343
+ nextKid,
344
+ pinSha256: input.nextHash,
345
+ pinCommit: input.nextCommit,
346
+ createdAt: input.next.created_at,
347
+ });
348
+ if (payload.schema !== exports.CITIZEN_FREEZE_SCHEMA)
349
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
350
+ if (payload.purpose !== exports.CITIZEN_FREEZE_PURPOSE)
351
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
352
+ if (payload.chain_id !== exports.ISSUER_PIN_CHAIN_ID)
353
+ return { ok: false, code: exports.ISSUER_PIN_CHAIN_REFUSED };
354
+ if (payload.prior_kid !== priorKid || payload.next_kid !== nextKid) {
355
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
356
+ }
357
+ if (payload.pin_sha256 !== input.nextHash || payload.pin_commit !== input.nextCommit) {
358
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
359
+ }
360
+ if (payload.statement !== statement)
361
+ return { ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
362
+ return { ok: true };
363
+ }
364
+ function refOk(ref) {
365
+ if (!ref)
366
+ return { ok: false, code: exports.ISSUER_PIN_DOWNGRADE };
367
+ const commit = typeof ref.commit === 'string' ? ref.commit.trim().toLowerCase() : '';
368
+ const sha256 = typeof ref.sha256 === 'string' ? ref.sha256.trim().toLowerCase() : '';
369
+ if (!COMMIT_SHA.test(commit) || ref.path !== exports.ISSUER_PIN_PATH) {
370
+ return { ok: false, code: exports.ISSUER_PIN_MUTABLE_REF };
371
+ }
372
+ if (!FILE_SHA.test(sha256))
373
+ return { ok: false, code: exports.ISSUER_PIN_HASH_MISMATCH };
374
+ return { ok: true, ref: { commit, path: ref.path, sha256 } };
375
+ }
376
+ function namedPinField(value) {
377
+ if (typeof value !== 'string')
378
+ return null;
379
+ const trimmed = value.trim();
380
+ return trimmed ? trimmed : null;
381
+ }
382
+ function pinIdentity(ref) {
383
+ return {
384
+ commit: namedPinField(ref.commit)?.toLowerCase() ?? null,
385
+ path: namedPinField(ref.path),
386
+ sha256: namedPinField(ref.sha256)?.toLowerCase() ?? null,
387
+ };
388
+ }
389
+ function sourceIsComplete(field) {
390
+ return !!field.commit && !!field.sha256;
391
+ }
392
+ /**
393
+ * Agree one named field. An empty side does not fill the other and does not
394
+ * disagree with it.
395
+ */
396
+ function agreeNamed(current, next) {
397
+ if (!next)
398
+ return { ok: true, value: current };
399
+ if (current && current !== next)
400
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
401
+ return { ok: true, value: next };
402
+ }
403
+ function mergePinFields(fields) {
404
+ let commit = null;
405
+ let path = null;
406
+ let sha256 = null;
407
+ for (const field of fields) {
408
+ const nextCommit = agreeNamed(commit, field.commit);
409
+ if (!nextCommit.ok)
410
+ return nextCommit;
411
+ commit = nextCommit.value;
412
+ const nextPath = agreeNamed(path, field.path);
413
+ if (!nextPath.ok)
414
+ return nextPath;
415
+ path = nextPath.value;
416
+ const nextHash = agreeNamed(sha256, field.sha256);
417
+ if (!nextHash.ok)
418
+ return nextHash;
419
+ sha256 = nextHash.value;
420
+ }
421
+ return { ok: true, field: { commit, path, sha256 } };
422
+ }
423
+ /**
424
+ * Every pin ref the receipt, the head, and the caller supplied.
425
+ *
426
+ * A source fills a blank commit or hash only when that source already names
427
+ * both. A commit from one claim and a hash from another are not one pin.
428
+ * Two sources that name different commits or hashes fail closed. Commit hex
429
+ * is compared in lowercase, the same way as the file hash.
430
+ */
431
+ function agreedPinRef(refs) {
432
+ const present = refs.filter((item) => !!item);
433
+ if (present.length === 0)
434
+ return { ok: false, code: exports.ISSUER_PIN_DOWNGRADE };
435
+ const fields = present.map(pinIdentity);
436
+ const complete = fields.filter(sourceIsComplete);
437
+ const partial = fields.filter((field) => !sourceIsComplete(field));
438
+ if (complete.length === 0) {
439
+ const merged = mergePinFields(fields);
440
+ if (!merged.ok)
441
+ return merged;
442
+ const checked = refOk({
443
+ commit: merged.field.commit || '',
444
+ path: merged.field.path || exports.ISSUER_PIN_PATH,
445
+ sha256: merged.field.sha256 || '',
446
+ });
447
+ if (!checked.ok)
448
+ return checked;
449
+ return { ok: false, code: exports.ISSUER_PIN_DOWNGRADE };
450
+ }
451
+ const merged = mergePinFields(complete);
452
+ if (!merged.ok)
453
+ return merged;
454
+ const checked = refOk({
455
+ commit: merged.field.commit || '',
456
+ path: merged.field.path || exports.ISSUER_PIN_PATH,
457
+ sha256: merged.field.sha256 || '',
458
+ });
459
+ if (!checked.ok)
460
+ return checked;
461
+ for (const field of partial) {
462
+ if (field.commit && field.commit !== checked.ref.commit)
463
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
464
+ if (field.path && field.path !== checked.ref.path)
465
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
466
+ if (field.sha256 && field.sha256 !== checked.ref.sha256)
467
+ return { ok: false, code: exports.ISSUER_PIN_MISMATCH };
468
+ }
469
+ return checked;
470
+ }
471
+ /**
472
+ * Compare a receipt's issuer key to the pinned file, and to issuer_root
473
+ * and a /api/witnesses document when those sources are present.
474
+ * A receipt or head that claims a pinned era and omits the pin fails closed.
475
+ * No claim and no explicit pin leaves the caller on the previous path.
476
+ */
477
+ function assessIssuerPin(input) {
478
+ const receiptClaim = readIssuerPinClaim(input.receipt);
479
+ const headClaim = readIssuerPinClaim(input.head);
480
+ const claimed = receiptClaim.claimed || headClaim.claimed;
481
+ const required = input.required === true || claimed;
482
+ if (!required && (input.pinBytes == null || input.pinBytes === '')) {
483
+ return { checked: false, ok: true, code: null };
484
+ }
485
+ if (input.pinBytes == null || input.pinBytes === '') {
486
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_DOWNGRADE };
487
+ }
488
+ const checkedRef = agreedPinRef([input.ref, receiptClaim.ref, headClaim.ref]);
489
+ if (!checkedRef.ok)
490
+ return { checked: true, ok: false, code: checkedRef.code };
491
+ if (issuerPinFileHash(input.pinBytes) !== checkedRef.ref.sha256) {
492
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_HASH_MISMATCH };
493
+ }
494
+ const parsed = parsePinDocument(input.pinBytes);
495
+ if (!parsed.ok)
496
+ return { checked: true, ok: false, code: parsed.code };
497
+ const pin = parsed.pin;
498
+ if (input.sigBytes != null && input.sigBytes.trim() !== '') {
499
+ if (pin.self_signature == null || input.sigBytes.trim() !== pin.self_signature) {
500
+ return { checked: true, ok: false, code: exports.ISSUER_SELF_SIG_INVALID };
501
+ }
502
+ }
503
+ const signature = verifyRegistrationSignature(pin);
504
+ if (!signature.ok)
505
+ return { checked: true, ok: false, code: signature.code };
506
+ const pinKid = pin.jwk.kid || (0, jws_js_1.jwkThumbprint)(pin.jwk);
507
+ // Signed kids are checked before the specimen gate so a JWS that does not
508
+ // verify, or a signed kid that disagrees with the envelope, is
509
+ // ISSUER_PIN_MISMATCH rather than a rotation error.
510
+ const fromReceipt = receiptKids(input.receipt, pin.jwk, claimed);
511
+ if (!fromReceipt.ok)
512
+ return { checked: true, ok: false, code: fromReceipt.code };
513
+ const fromHead = receiptKids(input.head, pin.jwk, claimed);
514
+ if (!fromHead.ok)
515
+ return { checked: true, ok: false, code: fromHead.code };
516
+ const signedKids = [...fromReceipt.kids, ...fromHead.kids];
517
+ if (claimed && signedKids.length === 0) {
518
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_MISMATCH };
519
+ }
520
+ const compared = [...signedKids];
521
+ if (fromReceipt.issuerRoot)
522
+ compared.push(fromReceipt.issuerRoot);
523
+ if (fromHead.issuerRoot)
524
+ compared.push(fromHead.issuerRoot);
525
+ if (input.witnesses !== undefined)
526
+ compared.push(...witnessKids(input.witnesses));
527
+ if (required && compared.length === 0) {
528
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_MISMATCH };
529
+ }
530
+ for (const kid of compared) {
531
+ if (kid !== pinKid)
532
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_MISMATCH };
533
+ }
534
+ let rotatedFromSpecimen = false;
535
+ if (input.priorPinBytes != null && input.priorPinBytes !== '') {
536
+ if (!input.priorRef)
537
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_MUTABLE_REF };
538
+ const priorChecked = refOk(input.priorRef);
539
+ if (!priorChecked.ok)
540
+ return { checked: true, ok: false, code: priorChecked.code };
541
+ if (issuerPinFileHash(input.priorPinBytes) !== priorChecked.ref.sha256) {
542
+ return { checked: true, ok: false, code: exports.ISSUER_PIN_HASH_MISMATCH };
543
+ }
544
+ const prior = parsePinDocument(input.priorPinBytes);
545
+ if (!prior.ok)
546
+ return { checked: true, ok: false, code: prior.code };
547
+ const control = input.controlJws || pin.control?.jws || null;
548
+ const rotation = verifyCitizenRotation({
549
+ prior: prior.pin,
550
+ next: pin,
551
+ nextHash: checkedRef.ref.sha256,
552
+ nextCommit: checkedRef.ref.commit,
553
+ controlJws: control,
554
+ });
555
+ if (!rotation.ok)
556
+ return { checked: true, ok: false, code: rotation.code };
557
+ rotatedFromSpecimen = (prior.pin.jwk.kid || '') !== (pin.jwk.kid || '');
558
+ }
559
+ else if (pin.control) {
560
+ return { checked: true, ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
561
+ }
562
+ if (pinKid !== exports.PUBLISHED_ISSUER_PIN_KID && !rotatedFromSpecimen) {
563
+ return { checked: true, ok: false, code: exports.ISSUER_ROTATION_UNCONTROLLED };
564
+ }
565
+ return { checked: true, ok: true, code: null };
566
+ }
567
+ //# sourceMappingURL=issuer-pin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuer-pin.js","sourceRoot":"","sources":["../src/issuer-pin.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,17 @@ export interface PreimageLeaf {
2
2
  preimage_utf8?: string;
3
3
  preimage_hex?: string;
4
4
  }
5
+ export interface AuditSibling {
6
+ hash?: string;
7
+ /** Ignored. Index and tree size choose the side. */
8
+ position?: string;
9
+ }
10
+ export interface AuditPath {
11
+ index?: number;
12
+ tree_size?: number;
13
+ siblings?: AuditSibling[];
14
+ root?: string;
15
+ }
5
16
  export interface PreimageEntry {
6
17
  field?: string;
7
18
  alg?: string;
@@ -10,7 +21,15 @@ export interface PreimageEntry {
10
21
  preimage_hex?: string;
11
22
  hash?: string;
12
23
  merkle?: string;
24
+ /** Old public shape: every leaf body in the prefix. Still accepted. */
13
25
  leaves?: PreimageLeaf[];
26
+ /** This receipt's leaf body. Other leaves are not on this object. */
27
+ leaf?: PreimageLeaf & {
28
+ index?: number;
29
+ task_id?: string;
30
+ kind?: string;
31
+ };
32
+ audit_path?: AuditPath;
14
33
  url?: string;
15
34
  }
16
35
  export interface PreimageBlock {
@@ -35,6 +54,16 @@ export interface PreimageCheck {
35
54
  reason?: string;
36
55
  }[];
37
56
  }
57
+ /** The audit path folds to this receipt's leaf. A different leaf in the same prefix is not this receipt. */
58
+ export declare const LEAF_NOT_BOUND = "leaf_not_bound";
59
+ /**
60
+ * Bind an audit path to this receipt. Returns `leaf_not_bound` when any
61
+ * check fails, including when the agreed row hash is null, empty, or
62
+ * disagreed, or the leaf encoding does not canonicalize to `task_id|row_hash`.
63
+ * Inclusion leaf hash and leaf index are checked only when that field is present.
64
+ * Inclusion tree size is not compared: the witness can cover a longer log.
65
+ */
66
+ export declare function auditLeafBinding(receipt: Record<string, unknown>, entry: PreimageEntry): string | null;
38
67
  /**
39
68
  * Fields a stranger is expected to recompute when they are present.
40
69
  * Coverage and tree_head_hash count only when the issuer published a preimage.
@@ -1 +1 @@
1
- {"version":3,"file":"preimage.d.ts","sourceRoot":"","sources":["../src/preimage.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3D;AAkGD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAUjF;AAmBD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,EACE,gBAAwB,EACxB,SAA4B,EAC5B,YAAkC,GACnC,GAAE;IACD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,GACL,OAAO,CAAC,aAAa,CAAC,CAoDxB"}
1
+ {"version":3,"file":"preimage.d.ts","sourceRoot":"","sources":["../src/preimage.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,qEAAqE;IACrE,IAAI,CAAC,EAAE,YAAY,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3D;AA6DD,4GAA4G;AAC5G,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAqE/C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CA6BtG;AAyED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAUjF;AAmBD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,EACE,gBAAwB,EACxB,SAA4B,EAC5B,YAAkC,GACnC,GAAE;IACD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,GACL,OAAO,CAAC,aAAa,CAAC,CA4DxB"}