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
@@ -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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"}
package/dist/jcs.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * RFC 8785 JSON Canonicalization.
3
+ * Same rules as `jcsCanonicalize` in services/gateway/src/offer-receipt.js.
4
+ * Issuer-history entry hashes and the receipt canonical object use this form.
5
+ * Per-field receipt hashes keep the encoding they were signed with.
6
+ */
7
+ export declare function jcsCanonicalize(value: unknown): string;
8
+ //# sourceMappingURL=jcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jcs.d.ts","sourceRoot":"","sources":["../src/jcs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD"}