chit402-verify 0.3.5 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +205 -17
- package/dist/anchor-trust.d.ts +144 -0
- package/dist/anchor-trust.d.ts.map +1 -0
- package/dist/anchor-trust.js +441 -0
- package/dist/anchor-trust.js.map +1 -0
- package/dist/anchor-witness.d.ts +265 -0
- package/dist/anchor-witness.d.ts.map +1 -0
- package/dist/anchor-witness.js +833 -0
- package/dist/anchor-witness.js.map +1 -0
- package/dist/base-payer.d.ts +65 -0
- package/dist/base-payer.d.ts.map +1 -0
- package/dist/base-payer.js +222 -0
- package/dist/base-payer.js.map +1 -0
- package/dist/binding.d.ts +52 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +80 -0
- package/dist/binding.js.map +1 -0
- package/dist/canonical-preimage.d.ts +9 -0
- package/dist/canonical-preimage.d.ts.map +1 -0
- package/dist/canonical-preimage.js +25 -0
- package/dist/canonical-preimage.js.map +1 -0
- package/dist/carry-forward.d.ts +79 -0
- package/dist/carry-forward.d.ts.map +1 -0
- package/dist/carry-forward.js +184 -0
- package/dist/carry-forward.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2086 -0
- package/dist/cli.js.map +1 -0
- package/dist/epoch.d.ts +143 -0
- package/dist/epoch.d.ts.map +1 -0
- package/dist/epoch.js +352 -0
- package/dist/epoch.js.map +1 -0
- package/dist/head-binding.d.ts +24 -0
- package/dist/head-binding.d.ts.map +1 -0
- package/dist/head-binding.js +61 -0
- package/dist/head-binding.js.map +1 -0
- package/dist/index.d.ts +585 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1648 -0
- package/dist/index.js.map +1 -0
- package/dist/issuer-history.d.ts +151 -0
- package/dist/issuer-history.d.ts.map +1 -0
- package/dist/issuer-history.js +595 -0
- package/dist/issuer-history.js.map +1 -0
- package/dist/issuer-pin.d.ts +126 -0
- package/dist/issuer-pin.d.ts.map +1 -0
- package/dist/issuer-pin.js +567 -0
- package/dist/issuer-pin.js.map +1 -0
- package/dist/jcs.d.ts +8 -0
- package/dist/jcs.d.ts.map +1 -0
- package/dist/jcs.js +64 -0
- package/dist/jcs.js.map +1 -0
- package/dist/jws.d.ts +46 -0
- package/dist/jws.d.ts.map +1 -0
- package/dist/jws.js +129 -0
- package/dist/jws.js.map +1 -0
- package/dist/payer.d.ts +65 -0
- package/dist/payer.d.ts.map +1 -0
- package/dist/payer.js +148 -0
- package/dist/payer.js.map +1 -0
- package/dist/preimage.d.ts +78 -0
- package/dist/preimage.d.ts.map +1 -0
- package/dist/preimage.js +363 -0
- package/dist/preimage.js.map +1 -0
- package/dist/receipt-lane.d.ts +235 -0
- package/dist/receipt-lane.d.ts.map +1 -0
- package/dist/receipt-lane.js +446 -0
- package/dist/receipt-lane.js.map +1 -0
- package/dist/receipt-version.d.ts +98 -0
- package/dist/receipt-version.d.ts.map +1 -0
- package/dist/receipt-version.js +364 -0
- package/dist/receipt-version.js.map +1 -0
- package/dist/refusal.d.ts +93 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +249 -0
- package/dist/refusal.js.map +1 -0
- package/dist/request-binding.d.ts +7 -0
- package/dist/request-binding.d.ts.map +1 -0
- package/dist/request-binding.js +26 -0
- package/dist/request-binding.js.map +1 -0
- package/dist/row-hash.d.ts +22 -0
- package/dist/row-hash.d.ts.map +1 -0
- package/dist/row-hash.js +26 -0
- package/dist/row-hash.js.map +1 -0
- package/dist/shell.d.ts +65 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +268 -0
- package/dist/shell.js.map +1 -0
- package/dist/solana-payer.d.ts +99 -0
- package/dist/solana-payer.d.ts.map +1 -0
- package/dist/solana-payer.js +258 -0
- package/dist/solana-payer.js.map +1 -0
- package/dist/v11-receipt.d.ts +23 -0
- package/dist/v11-receipt.d.ts.map +1 -0
- package/dist/v11-receipt.js +368 -0
- package/dist/v11-receipt.js.map +1 -0
- package/dist/verdict.d.ts +98 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +390 -0
- package/dist/verdict.js.map +1 -0
- package/issuer-history.snapshot.json +1 -0
- package/package.json +32 -22
- package/cli.js +0 -42
- package/index.cjs +0 -8
- package/index.d.ts +0 -5
- package/index.js +0 -7
package/dist/refusal.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REFUSAL_DOES_NOT_PROVE = exports.REFUSAL_PROVES = exports.REFUSAL_PAYLOAD_VERSION = exports.REFUSAL_PAYLOAD_VERSIONS = exports.REFUSAL_SCHEMA_V2 = exports.REFUSAL_SCHEMA = void 0;
|
|
4
|
+
exports.jwsPayloadSchema = jwsPayloadSchema;
|
|
5
|
+
exports.isRefusalDocument = isRefusalDocument;
|
|
6
|
+
exports.verifyRefusal = verifyRefusal;
|
|
7
|
+
/**
|
|
8
|
+
* Offline check for a chit402.refusal.v1 document.
|
|
9
|
+
*
|
|
10
|
+
* Same ES256 issuer key and JWKS trust rules as a payment receipt.
|
|
11
|
+
* A refusal is not a payment. verifyReceipt refuses to treat one as spend.
|
|
12
|
+
*/
|
|
13
|
+
const jws_js_1 = require("./jws.js");
|
|
14
|
+
const request_binding_js_1 = require("./request-binding.js");
|
|
15
|
+
const receipt_version_js_1 = require("./receipt-version.js");
|
|
16
|
+
exports.REFUSAL_SCHEMA = 'chit402.refusal.v1';
|
|
17
|
+
exports.REFUSAL_SCHEMA_V2 = 'chit402.refusal.v2';
|
|
18
|
+
/** Versions a verifier accepts. Version 1 has no history pin. Version 3 is refusal v2. */
|
|
19
|
+
exports.REFUSAL_PAYLOAD_VERSIONS = [1, 2, 3];
|
|
20
|
+
/** Current issuance version. Version 1 still verifies. */
|
|
21
|
+
exports.REFUSAL_PAYLOAD_VERSION = 2;
|
|
22
|
+
exports.REFUSAL_PROVES = [
|
|
23
|
+
'The issuer signed that it refused this spend.',
|
|
24
|
+
'refusal_code is the code the issuer recorded.',
|
|
25
|
+
'nonce identifies this refusal document.',
|
|
26
|
+
'chain_id and anchor are the Base observation at refusal time. status UNAVAILABLE means the issuer had no block.',
|
|
27
|
+
'When status is observed, block_number and block_hash are that block. state_root is copied only when the RPC returned one; otherwise it is null.',
|
|
28
|
+
'book_row.seq, task_id, and row_hash name the policy_blocked row this refusal joins.',
|
|
29
|
+
'charged is false and amount_charged is 0. This refusal took no USDC.',
|
|
30
|
+
];
|
|
31
|
+
exports.REFUSAL_DOES_NOT_PROVE = [
|
|
32
|
+
'It does not prove a payment, a settlement, or a balance change.',
|
|
33
|
+
'It does not prove the refused spend would have landed in that block.',
|
|
34
|
+
'It does not prove a later reorg left the block hash or state root in place.',
|
|
35
|
+
'UNAVAILABLE means the issuer did not have a block. It does not mean the chain was empty.',
|
|
36
|
+
'It does not prove the policy rule was the right rule. It proves the issuer refused under that code.',
|
|
37
|
+
'It does not prove amount_requested would have been the settled price.',
|
|
38
|
+
'It is not a payment receipt. A payment verifier must not treat it as proof of spend.',
|
|
39
|
+
'verify_url is not inside the signature.',
|
|
40
|
+
];
|
|
41
|
+
/** Schema inside the JWS payload. Unverified; callers still check the signature. */
|
|
42
|
+
function jwsPayloadSchema(doc) {
|
|
43
|
+
if (!doc || typeof doc !== 'object')
|
|
44
|
+
return null;
|
|
45
|
+
const jws = doc.issuer_signature?.jws;
|
|
46
|
+
if (!jws || typeof jws !== 'string')
|
|
47
|
+
return null;
|
|
48
|
+
const payloadB64 = jws.split('.')[1];
|
|
49
|
+
if (!payloadB64)
|
|
50
|
+
return null;
|
|
51
|
+
try {
|
|
52
|
+
const payload = JSON.parse(Buffer.from(payloadB64, 'base64url').toString('utf8'));
|
|
53
|
+
return typeof payload.schema === 'string' ? payload.schema : null;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function isRefusalDocument(doc) {
|
|
60
|
+
if (!doc || typeof doc !== 'object')
|
|
61
|
+
return false;
|
|
62
|
+
const schema = doc.schema;
|
|
63
|
+
if (schema === exports.REFUSAL_SCHEMA || schema === exports.REFUSAL_SCHEMA_V2)
|
|
64
|
+
return true;
|
|
65
|
+
const signedSchema = jwsPayloadSchema(doc);
|
|
66
|
+
return signedSchema === exports.REFUSAL_SCHEMA || signedSchema === exports.REFUSAL_SCHEMA_V2;
|
|
67
|
+
}
|
|
68
|
+
function jwksCandidates(jwks, kid) {
|
|
69
|
+
if (!jwks?.keys?.length)
|
|
70
|
+
return [];
|
|
71
|
+
const es256 = jwks.keys.filter((key) => key.kty === 'EC' && key.crv === 'P-256' && key.x && key.y);
|
|
72
|
+
if (!kid)
|
|
73
|
+
return es256;
|
|
74
|
+
return es256.filter((key) => key.kid === kid);
|
|
75
|
+
}
|
|
76
|
+
function same(left, right) {
|
|
77
|
+
return left === right;
|
|
78
|
+
}
|
|
79
|
+
function anchorSame(outer, signed) {
|
|
80
|
+
if (!outer || !signed)
|
|
81
|
+
return false;
|
|
82
|
+
return same(outer.status, signed.status)
|
|
83
|
+
&& same(outer.rail, signed.rail)
|
|
84
|
+
&& same(outer.chain_id ?? null, signed.chain_id ?? null)
|
|
85
|
+
&& same(outer.block_number ?? null, signed.block_number ?? null)
|
|
86
|
+
&& same(outer.block_hash ?? null, signed.block_hash ?? null)
|
|
87
|
+
&& same(outer.state_root ?? null, signed.state_root ?? null);
|
|
88
|
+
}
|
|
89
|
+
function bookRowSame(outer, signed) {
|
|
90
|
+
if (!outer || !signed)
|
|
91
|
+
return false;
|
|
92
|
+
return same(outer.task_id, signed.task_id)
|
|
93
|
+
&& Number(outer.seq) === Number(signed.seq)
|
|
94
|
+
&& same(outer.prev_hash || null, signed.prev_hash || null)
|
|
95
|
+
&& same(outer.row_hash, signed.row_hash)
|
|
96
|
+
&& same(outer.event, signed.event);
|
|
97
|
+
}
|
|
98
|
+
function requestPreimageOf(doc) {
|
|
99
|
+
if (typeof doc.request_preimage === 'string' && doc.request_preimage)
|
|
100
|
+
return doc.request_preimage;
|
|
101
|
+
const published = doc.preimages?.fields?.request_digest?.preimage_utf8;
|
|
102
|
+
return typeof published === 'string' && published ? published : null;
|
|
103
|
+
}
|
|
104
|
+
function failed(reason, extra = {}) {
|
|
105
|
+
return {
|
|
106
|
+
schema: exports.REFUSAL_SCHEMA,
|
|
107
|
+
checked: extra.checked ?? true,
|
|
108
|
+
reason,
|
|
109
|
+
charged: false,
|
|
110
|
+
proves: exports.REFUSAL_PROVES,
|
|
111
|
+
does_not_prove: exports.REFUSAL_DOES_NOT_PROVE,
|
|
112
|
+
errors: [reason],
|
|
113
|
+
kid: extra.kid,
|
|
114
|
+
valid: false,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Verify the issuer signature and that the outer refusal fields match it.
|
|
119
|
+
* Trust is a JWKS key matched by kid, or an embedded key whose thumbprint
|
|
120
|
+
* is a pinned trusted kid. The embedded key alone is not a trust root.
|
|
121
|
+
*/
|
|
122
|
+
function verifyRefusal(doc, options = {}) {
|
|
123
|
+
if (!isRefusalDocument(doc)) {
|
|
124
|
+
return failed('not_a_refusal', { checked: false });
|
|
125
|
+
}
|
|
126
|
+
const jws = doc.issuer_signature?.jws;
|
|
127
|
+
if (!jws)
|
|
128
|
+
return failed('no_signature', { checked: false });
|
|
129
|
+
const trustedKids = options.trustedKids ?? jws_js_1.DEFAULT_TRUSTED_ISSUER_KIDS;
|
|
130
|
+
const header = (0, jws_js_1.readJwsHeader)(jws);
|
|
131
|
+
const kid = header?.kid || doc.issuer_signature?.kid;
|
|
132
|
+
const embedded = (0, jws_js_1.resolvePinnedIssuerJwk)(doc);
|
|
133
|
+
const pinned = !!(embedded && (0, jws_js_1.isPinnedTrustedJwk)(embedded, trustedKids));
|
|
134
|
+
const fromJwks = jwksCandidates(options.jwks, kid);
|
|
135
|
+
let payload = null;
|
|
136
|
+
let trusted = false;
|
|
137
|
+
let reason = 'signature_invalid';
|
|
138
|
+
for (const jwk of fromJwks) {
|
|
139
|
+
const result = (0, jws_js_1.verifyIssuerJws)(jws, jwk);
|
|
140
|
+
if (result.valid && result.payload) {
|
|
141
|
+
payload = result.payload;
|
|
142
|
+
trusted = true;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
reason = result.reason || 'signature_invalid';
|
|
146
|
+
}
|
|
147
|
+
if (!payload && pinned && embedded) {
|
|
148
|
+
const result = (0, jws_js_1.verifyIssuerJws)(jws, embedded);
|
|
149
|
+
if (result.valid && result.payload) {
|
|
150
|
+
payload = result.payload;
|
|
151
|
+
trusted = true;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
reason = result.reason || 'signature_invalid';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (!payload && embedded && (0, jws_js_1.verifyIssuerJws)(jws, embedded).valid && !pinned && fromJwks.length === 0) {
|
|
158
|
+
return failed(jws_js_1.KEY_UNTRUSTED, { kid: kid || null });
|
|
159
|
+
}
|
|
160
|
+
if (!payload) {
|
|
161
|
+
if (fromJwks.length === 0 && !pinned)
|
|
162
|
+
return failed(jws_js_1.KEY_UNTRUSTED, { kid: kid || null });
|
|
163
|
+
return failed(reason, { kid: kid || null });
|
|
164
|
+
}
|
|
165
|
+
if (!trusted)
|
|
166
|
+
return failed(jws_js_1.KEY_UNTRUSTED, { kid: kid || null });
|
|
167
|
+
const signed = payload;
|
|
168
|
+
const versionCheck = (0, receipt_version_js_1.refusalPayloadVersion)(payload);
|
|
169
|
+
if (!versionCheck.ok)
|
|
170
|
+
return failed('unsupported_version', { kid });
|
|
171
|
+
const version = versionCheck.version;
|
|
172
|
+
const boundRefusal = signed.schema === exports.REFUSAL_SCHEMA_V2 || version === 3;
|
|
173
|
+
if (boundRefusal) {
|
|
174
|
+
const digest = signed.request_digest;
|
|
175
|
+
const preimage = requestPreimageOf(doc);
|
|
176
|
+
if (typeof digest !== 'string' || !/^[0-9a-f]{64}$/.test(digest) || !preimage) {
|
|
177
|
+
return { ...failed('REQUEST_UNBOUND', { kid }), request_binding: 'REQUEST_UNBOUND' };
|
|
178
|
+
}
|
|
179
|
+
const recomputed = (0, request_binding_js_1.verifyRequestDigest)(digest, preimage);
|
|
180
|
+
if (!recomputed.ok) {
|
|
181
|
+
return { ...failed('request_digest_mismatch', { kid }), request_binding: 'request_digest_mismatch' };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (signed.schema !== exports.REFUSAL_SCHEMA && signed.schema !== exports.REFUSAL_SCHEMA_V2)
|
|
185
|
+
return failed('schema_mismatch', { kid });
|
|
186
|
+
// The outer schema is unsigned. A present value that disagrees with the
|
|
187
|
+
// signed schema fails. An omitted outer schema still follows the JWS.
|
|
188
|
+
if (doc.schema != null && doc.schema !== signed.schema)
|
|
189
|
+
return failed('schema_mismatch', { kid });
|
|
190
|
+
if (doc.payload_version != null && doc.payload_version !== version) {
|
|
191
|
+
return failed('payload_version_mismatch', { kid });
|
|
192
|
+
}
|
|
193
|
+
if (version >= 2) {
|
|
194
|
+
const pin = signed.issuer_history;
|
|
195
|
+
if (!pin || typeof pin.hash !== 'string' || pin.version == null || pin.seq == null) {
|
|
196
|
+
return failed('issuer_history_pin_missing', { kid });
|
|
197
|
+
}
|
|
198
|
+
const payloadHash = signed.payload_hash;
|
|
199
|
+
if (typeof payloadHash !== 'string' || !/^[0-9a-f]{64}$/.test(payloadHash)) {
|
|
200
|
+
return failed('payload_hash_missing', { kid });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (signed.kind !== 'refusal')
|
|
204
|
+
return failed('kind_mismatch', { kid });
|
|
205
|
+
if (signed.charged !== false || signed.amount_charged !== '0'
|
|
206
|
+
|| doc.charged !== false || doc.amount_charged !== '0') {
|
|
207
|
+
return failed('charged_not_zero', { kid });
|
|
208
|
+
}
|
|
209
|
+
if (!same(doc.refusal_code, signed.refusal_code))
|
|
210
|
+
return failed('refusal_code_mismatch', { kid });
|
|
211
|
+
if (!same(doc.nonce, signed.nonce))
|
|
212
|
+
return failed('nonce_mismatch', { kid });
|
|
213
|
+
if (!same(doc.refusal_id, signed.refusal_id))
|
|
214
|
+
return failed('refusal_id_mismatch', { kid });
|
|
215
|
+
if (!same(doc.chain_id ?? null, signed.chain_id ?? null))
|
|
216
|
+
return failed('chain_id_mismatch', { kid });
|
|
217
|
+
if (!same(doc.task_id, signed.task_id)
|
|
218
|
+
|| Number(doc.agent_id) !== Number(signed.agent_id)
|
|
219
|
+
|| Number(doc.book_id) !== Number(signed.book_id)) {
|
|
220
|
+
return failed('identity_mismatch', { kid });
|
|
221
|
+
}
|
|
222
|
+
if (!same(doc.issued_at, signed.issued_at))
|
|
223
|
+
return failed('issued_at_mismatch', { kid });
|
|
224
|
+
if (!same(doc.amount_requested ?? null, signed.amount_requested ?? null)) {
|
|
225
|
+
return failed('amount_mismatch', { kid });
|
|
226
|
+
}
|
|
227
|
+
if (!anchorSame(doc.anchor, signed.anchor))
|
|
228
|
+
return failed('anchor_mismatch', { kid });
|
|
229
|
+
if (!bookRowSame(doc.book_row, signed.book_row))
|
|
230
|
+
return failed('book_row_mismatch', { kid });
|
|
231
|
+
return {
|
|
232
|
+
schema: exports.REFUSAL_SCHEMA,
|
|
233
|
+
valid: true,
|
|
234
|
+
checked: true,
|
|
235
|
+
kid: kid || null,
|
|
236
|
+
refusal_id: signed.refusal_id || null,
|
|
237
|
+
refusal_code: signed.refusal_code || null,
|
|
238
|
+
nonce: signed.nonce || null,
|
|
239
|
+
chain_id: signed.chain_id ?? null,
|
|
240
|
+
charged: false,
|
|
241
|
+
proves: exports.REFUSAL_PROVES,
|
|
242
|
+
does_not_prove: exports.REFUSAL_DOES_NOT_PROVE,
|
|
243
|
+
errors: [],
|
|
244
|
+
payload_version: version,
|
|
245
|
+
issuer_history: signed.issuer_history ?? null,
|
|
246
|
+
payload_hash: signed.payload_hash ?? null,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=refusal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal.js","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type RequestBindingStatus = 'REQUEST_UNBOUND' | 'request_digest_mismatch' | 'recomputed';
|
|
2
|
+
export declare function requestDigestOfPreimage(preimageUtf8: string): string;
|
|
3
|
+
export declare function verifyRequestDigest(digest: string, preimageUtf8: string): {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
reason: RequestBindingStatus;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=request-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-binding.d.ts","sourceRoot":"","sources":["../src/request-binding.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,YAAY,CAAC;AAEhG,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAW/C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requestDigestOfPreimage = requestDigestOfPreimage;
|
|
4
|
+
exports.verifyRequestDigest = verifyRequestDigest;
|
|
5
|
+
/**
|
|
6
|
+
* Recompute request_digest from the published RFC 8785 preimage.
|
|
7
|
+
* The preimage is the exact UTF-8 string. This function does not rebuild it.
|
|
8
|
+
* Gateway field order is body_sha256, idempotency_key, method, nonce, path.
|
|
9
|
+
*/
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
function requestDigestOfPreimage(preimageUtf8) {
|
|
12
|
+
return (0, node_crypto_1.createHash)('sha256').update(preimageUtf8, 'utf8').digest('hex');
|
|
13
|
+
}
|
|
14
|
+
function verifyRequestDigest(digest, preimageUtf8) {
|
|
15
|
+
if (typeof digest !== 'string' || !/^[0-9a-f]{64}$/.test(digest)) {
|
|
16
|
+
return { ok: false, reason: 'REQUEST_UNBOUND' };
|
|
17
|
+
}
|
|
18
|
+
if (typeof preimageUtf8 !== 'string' || preimageUtf8 === '') {
|
|
19
|
+
return { ok: false, reason: 'REQUEST_UNBOUND' };
|
|
20
|
+
}
|
|
21
|
+
if (requestDigestOfPreimage(preimageUtf8) !== digest) {
|
|
22
|
+
return { ok: false, reason: 'request_digest_mismatch' };
|
|
23
|
+
}
|
|
24
|
+
return { ok: true, reason: 'recomputed' };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=request-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-binding.js","sourceRoot":"","sources":["../src/request-binding.ts"],"names":[],"mappings":";;AASA,0DAEC;AAED,kDAcC;AA3BD;;;;GAIG;AACH,6CAAyC;AAIzC,SAAgB,uBAAuB,CAAC,YAAoB;IAC1D,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,SAAgB,mBAAmB,CACjC,MAAc,EACd,YAAoB;IAEpB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,uBAAuB,CAAC,YAAY,CAAC,KAAK,MAAM,EAAE,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leaf input for `task_id|row_hash`.
|
|
3
|
+
* Same order as verifyAnchoredRoot: top-level row_hash, then book_chain, then
|
|
4
|
+
* the inclusion or carry document. One source is enough. Two or three that
|
|
5
|
+
* differ fail closed. The value used for the leaf is the one they agree on.
|
|
6
|
+
* No string at all is `row: null`. An empty string is a present source.
|
|
7
|
+
*/
|
|
8
|
+
export declare function boundRowHash(receipt: {
|
|
9
|
+
row_hash?: string | null;
|
|
10
|
+
book_chain?: {
|
|
11
|
+
row_hash?: string | null;
|
|
12
|
+
} | null;
|
|
13
|
+
}, extra?: {
|
|
14
|
+
row_hash?: string | null;
|
|
15
|
+
} | null): {
|
|
16
|
+
ok: true;
|
|
17
|
+
row: string | null;
|
|
18
|
+
} | {
|
|
19
|
+
ok: false;
|
|
20
|
+
reason: 'row_hash_mismatch';
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=row-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-hash.d.ts","sourceRoot":"","sources":["../src/row-hash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,EACvF,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAC1C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAS/E"}
|
package/dist/row-hash.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.boundRowHash = boundRowHash;
|
|
4
|
+
/**
|
|
5
|
+
* Leaf input for `task_id|row_hash`.
|
|
6
|
+
* Same order as verifyAnchoredRoot: top-level row_hash, then book_chain, then
|
|
7
|
+
* the inclusion or carry document. One source is enough. Two or three that
|
|
8
|
+
* differ fail closed. The value used for the leaf is the one they agree on.
|
|
9
|
+
* No string at all is `row: null`. An empty string is a present source.
|
|
10
|
+
*/
|
|
11
|
+
function boundRowHash(receipt, extra) {
|
|
12
|
+
const present = [];
|
|
13
|
+
if (typeof receipt.row_hash === 'string')
|
|
14
|
+
present.push(receipt.row_hash);
|
|
15
|
+
if (typeof receipt.book_chain?.row_hash === 'string')
|
|
16
|
+
present.push(receipt.book_chain.row_hash);
|
|
17
|
+
if (typeof extra?.row_hash === 'string')
|
|
18
|
+
present.push(extra.row_hash);
|
|
19
|
+
if (present.length === 0)
|
|
20
|
+
return { ok: true, row: null };
|
|
21
|
+
const agreed = present[0];
|
|
22
|
+
if (present.some((value) => value !== agreed))
|
|
23
|
+
return { ok: false, reason: 'row_hash_mismatch' };
|
|
24
|
+
return { ok: true, row: agreed };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=row-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-hash.js","sourceRoot":"","sources":["../src/row-hash.ts"],"names":[],"mappings":";;AAOA,oCAYC;AAnBD;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,OAAuF,EACvF,KAA2C;IAE3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzE,IAAI,OAAO,OAAO,CAAC,UAAU,EAAE,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAChG,IAAI,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACjG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC"}
|
package/dist/shell.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export declare const SHELL_SCHEMA = "chit402.receipt_shell.v1";
|
|
2
|
+
export declare const INCLUDED_SHELL_LINE = "INCLUDED_SHELL: signature requires owner view";
|
|
3
|
+
export declare function isReceiptShell(doc: unknown): doc is Record<string, unknown>;
|
|
4
|
+
export declare function decodeJwsPayload(jws: unknown): Record<string, unknown> | null;
|
|
5
|
+
/** Project the public shell from a holder receipt. Leaf proof is not invented. */
|
|
6
|
+
export declare function shellFromHolder(receipt: Record<string, unknown>): Record<string, unknown>;
|
|
7
|
+
/**
|
|
8
|
+
* The owner view returns `{ jws, salt, private_fields }`. A saved holder
|
|
9
|
+
* receipt has `issuer_signature`. Either can be the `--jws` file.
|
|
10
|
+
* An `issuer_jwk` on the owner-view body is ignored. Trust is a pinned
|
|
11
|
+
* kid or a JWKS entry, not a key the response carries.
|
|
12
|
+
*/
|
|
13
|
+
export declare function holderDocumentFromOwnerView(doc: Record<string, unknown> | string): Record<string, unknown>;
|
|
14
|
+
export interface ShellHolderCheck {
|
|
15
|
+
signatureValid: boolean;
|
|
16
|
+
keyTrusted: boolean;
|
|
17
|
+
signatureReason?: string | null;
|
|
18
|
+
inclusionSupplied: boolean;
|
|
19
|
+
inclusionOk: boolean;
|
|
20
|
+
inclusionReason?: string | null;
|
|
21
|
+
paymentRef?: string | null;
|
|
22
|
+
bindingExpected?: boolean;
|
|
23
|
+
bindingMatches?: boolean;
|
|
24
|
+
shellLeaf?: string | null;
|
|
25
|
+
provedLeaf?: string | null;
|
|
26
|
+
/** The supplied head carries an issuer JWS (checked by verifyReceipt). */
|
|
27
|
+
headSigned?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* VERIFIED requires a trusted issuer key, a passing inclusion proof, and a
|
|
31
|
+
* signed payment. A shell alone, a missing proof, or a key that only
|
|
32
|
+
* verifies because it is embedded in the holder is not VERIFIED.
|
|
33
|
+
*/
|
|
34
|
+
export declare function shellHolderVerdict(check: ShellHolderCheck): {
|
|
35
|
+
verified: boolean;
|
|
36
|
+
reason: string | null;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Expected shell from the signed JWS claims only. Outer holder fields
|
|
40
|
+
* (payment.settled_amount, payment.network, payment_meta, task_id) are
|
|
41
|
+
* not signed and are not used, so they cannot ride along under VERIFIED.
|
|
42
|
+
*/
|
|
43
|
+
export declare function signedShellFromHolder(holder: Record<string, unknown> | string): Record<string, unknown>;
|
|
44
|
+
export declare function compareShellToJws(shell: Record<string, unknown>, holder: Record<string, unknown> | string): {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
field?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* v11: body_commitment = HMAC-SHA256(salt, raw body),
|
|
50
|
+
* request_digest = SHA-256 of the JCS object
|
|
51
|
+
* {body_commitment, idempotency_key, method, nonce, path}.
|
|
52
|
+
*/
|
|
53
|
+
export declare function openV11Commitment(input: {
|
|
54
|
+
payload: Record<string, unknown> | null;
|
|
55
|
+
saltHex: string;
|
|
56
|
+
body: Buffer | string;
|
|
57
|
+
method?: string;
|
|
58
|
+
path?: string;
|
|
59
|
+
nonce?: string;
|
|
60
|
+
idempotencyKey?: string;
|
|
61
|
+
}): {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
reason?: string;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,6BAA6B,CAAC;AACvD,eAAO,MAAM,mBAAmB,kDAAkD,CAAC;AAEnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE3E;AAoBD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS7E;AAuBD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCzF;AAcD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoC1G;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAyBxG;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMvG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAc3I;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBnC"}
|