@xfuel/verify 0.1.1 → 0.3.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.
- package/README.md +62 -17
- package/dist/anchor-witness.d.ts +138 -0
- package/dist/anchor-witness.d.ts.map +1 -0
- package/dist/anchor-witness.js +365 -0
- package/dist/anchor-witness.js.map +1 -0
- package/dist/base-payer.d.ts +8 -1
- package/dist/base-payer.d.ts.map +1 -1
- package/dist/base-payer.js +64 -20
- package/dist/base-payer.js.map +1 -1
- 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/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +424 -25
- package/dist/cli.js.map +1 -1
- 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 +263 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +919 -140
- package/dist/index.js.map +1 -1
- package/dist/issuer-history.d.ts +91 -0
- package/dist/issuer-history.d.ts.map +1 -0
- package/dist/issuer-history.js +292 -0
- package/dist/issuer-history.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 +23 -0
- package/dist/jws.d.ts.map +1 -1
- package/dist/jws.js +71 -1
- package/dist/jws.js.map +1 -1
- package/dist/payer.d.ts +16 -5
- package/dist/payer.d.ts.map +1 -1
- package/dist/payer.js +38 -26
- package/dist/payer.js.map +1 -1
- package/dist/preimage.d.ts +49 -0
- package/dist/preimage.d.ts.map +1 -0
- package/dist/preimage.js +203 -0
- package/dist/preimage.js.map +1 -0
- package/dist/receipt-lane.d.ts +234 -0
- package/dist/receipt-lane.d.ts.map +1 -0
- package/dist/receipt-lane.js +443 -0
- package/dist/receipt-lane.js.map +1 -0
- package/dist/refusal.d.ts +90 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +226 -0
- package/dist/refusal.js.map +1 -0
- package/package.json +9 -5
package/dist/jws.d.ts
CHANGED
|
@@ -14,7 +14,30 @@ export interface ReceiptWithIssuerJwk {
|
|
|
14
14
|
issuer_jwk?: Es256Jwk;
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Production issuer kid (RFC 7638 thumbprint of the api.chit402.com ES256 key).
|
|
19
|
+
* Offline default pin. Override with `trustedKids` / `--trusted-kid`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_TRUSTED_ISSUER_KIDS: readonly ["IvFpmC-vPhkY_v0vidsrWVT9uzlE5XWKZgAEOeJTq1Q"];
|
|
22
|
+
/** Hosts whose published JWKS may be fetched and treated as a trust root. */
|
|
23
|
+
export declare const DEFAULT_TRUSTED_JWKS_HOSTS: readonly ["api.chit402.com"];
|
|
24
|
+
export declare const KEY_UNTRUSTED = "key untrusted";
|
|
17
25
|
export declare function resolvePinnedIssuerJwk(receipt: ReceiptWithIssuerJwk): Es256Jwk | null;
|
|
26
|
+
/**
|
|
27
|
+
* RFC 7638 JWK thumbprint (SHA-256, base64url).
|
|
28
|
+
* EC required members in lexicographic order: crv, kty, x, y.
|
|
29
|
+
*/
|
|
30
|
+
export declare function jwkThumbprint(jwk: Pick<Es256Jwk, 'kty' | 'crv' | 'x' | 'y'>): string;
|
|
31
|
+
export declare function isEs256PublicJwk(jwk: Es256Jwk | null | undefined): jwk is Es256Jwk;
|
|
32
|
+
/** True when the key's RFC 7638 thumbprint is one of the pinned trusted kids. */
|
|
33
|
+
export declare function isPinnedTrustedJwk(jwk: Es256Jwk | null | undefined, trustedKids: readonly string[]): boolean;
|
|
34
|
+
export declare function sameEs256Key(a: Es256Jwk, b: Es256Jwk): boolean;
|
|
35
|
+
export declare function readJwsHeader(jws: string): {
|
|
36
|
+
alg?: string;
|
|
37
|
+
kid?: string;
|
|
38
|
+
jku?: string;
|
|
39
|
+
} | null;
|
|
40
|
+
export declare function jwksHostAllowed(uri: string, hosts: readonly string[]): boolean;
|
|
18
41
|
export declare function verifyIssuerJws(jws: string, jwk: Es256Jwk): {
|
|
19
42
|
valid: boolean;
|
|
20
43
|
payload?: Record<string, unknown>;
|
package/dist/jws.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jws.d.ts","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jws.d.ts","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,OAAO,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,QAAQ,CAAC;KACvB,CAAC;CACH;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,0DAE9B,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,8BAA+B,CAAC;AAEvE,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,QAAQ,GAAG,IAAI,CAMrF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,CAQpF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,IAAI,QAAQ,CAElF;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAChC,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAGT;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAE9D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQ9F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAQ9E;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,QAAQ,GACZ;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAyCxE"}
|
package/dist/jws.js
CHANGED
|
@@ -1,20 +1,90 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KEY_UNTRUSTED = exports.DEFAULT_TRUSTED_JWKS_HOSTS = exports.DEFAULT_TRUSTED_ISSUER_KIDS = void 0;
|
|
3
4
|
exports.resolvePinnedIssuerJwk = resolvePinnedIssuerJwk;
|
|
5
|
+
exports.jwkThumbprint = jwkThumbprint;
|
|
6
|
+
exports.isEs256PublicJwk = isEs256PublicJwk;
|
|
7
|
+
exports.isPinnedTrustedJwk = isPinnedTrustedJwk;
|
|
8
|
+
exports.sameEs256Key = sameEs256Key;
|
|
9
|
+
exports.readJwsHeader = readJwsHeader;
|
|
10
|
+
exports.jwksHostAllowed = jwksHostAllowed;
|
|
4
11
|
exports.verifyIssuerJws = verifyIssuerJws;
|
|
5
12
|
/**
|
|
6
13
|
* Compact JWS (ES256) verification for Chit402 receipts.
|
|
14
|
+
*
|
|
15
|
+
* A signature is only valid when the verifying key is trusted:
|
|
16
|
+
* - it is the JWKS entry for the JWS `kid` (caller-supplied file, or a JWKS
|
|
17
|
+
* fetched from an allowlisted issuer `jwks_uri`), or
|
|
18
|
+
* - its RFC 7638 thumbprint equals a pinned trusted kid.
|
|
19
|
+
* The receipt's embedded `issuer_jwk` is not a trust root by itself.
|
|
7
20
|
*/
|
|
8
21
|
const node_crypto_1 = require("node:crypto");
|
|
22
|
+
/**
|
|
23
|
+
* Production issuer kid (RFC 7638 thumbprint of the api.chit402.com ES256 key).
|
|
24
|
+
* Offline default pin. Override with `trustedKids` / `--trusted-kid`.
|
|
25
|
+
*/
|
|
26
|
+
exports.DEFAULT_TRUSTED_ISSUER_KIDS = [
|
|
27
|
+
'IvFpmC-vPhkY_v0vidsrWVT9uzlE5XWKZgAEOeJTq1Q',
|
|
28
|
+
];
|
|
29
|
+
/** Hosts whose published JWKS may be fetched and treated as a trust root. */
|
|
30
|
+
exports.DEFAULT_TRUSTED_JWKS_HOSTS = ['api.chit402.com'];
|
|
31
|
+
exports.KEY_UNTRUSTED = 'key untrusted';
|
|
9
32
|
function resolvePinnedIssuerJwk(receipt) {
|
|
10
33
|
const jwk = receipt.issuer_signature?.issuer_jwk;
|
|
11
|
-
if (!jwk || jwk.kty !== 'EC' || jwk.crv !== 'P-256')
|
|
34
|
+
if (!jwk || jwk.kty !== 'EC' || jwk.crv !== 'P-256' || !jwk.x || !jwk.y)
|
|
12
35
|
return null;
|
|
13
36
|
const kid = receipt.issuer_signature?.kid;
|
|
14
37
|
if (kid && jwk.kid && kid !== jwk.kid)
|
|
15
38
|
return null;
|
|
16
39
|
return jwk;
|
|
17
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* RFC 7638 JWK thumbprint (SHA-256, base64url).
|
|
43
|
+
* EC required members in lexicographic order: crv, kty, x, y.
|
|
44
|
+
*/
|
|
45
|
+
function jwkThumbprint(jwk) {
|
|
46
|
+
const canonical = JSON.stringify({
|
|
47
|
+
crv: jwk.crv,
|
|
48
|
+
kty: jwk.kty,
|
|
49
|
+
x: jwk.x,
|
|
50
|
+
y: jwk.y,
|
|
51
|
+
});
|
|
52
|
+
return (0, node_crypto_1.createHash)('sha256').update(canonical).digest('base64url');
|
|
53
|
+
}
|
|
54
|
+
function isEs256PublicJwk(jwk) {
|
|
55
|
+
return !!jwk && jwk.kty === 'EC' && jwk.crv === 'P-256' && !!jwk.x && !!jwk.y;
|
|
56
|
+
}
|
|
57
|
+
/** True when the key's RFC 7638 thumbprint is one of the pinned trusted kids. */
|
|
58
|
+
function isPinnedTrustedJwk(jwk, trustedKids) {
|
|
59
|
+
if (!isEs256PublicJwk(jwk) || trustedKids.length === 0)
|
|
60
|
+
return false;
|
|
61
|
+
return trustedKids.includes(jwkThumbprint(jwk));
|
|
62
|
+
}
|
|
63
|
+
function sameEs256Key(a, b) {
|
|
64
|
+
return a.x === b.x && a.y === b.y && a.crv === b.crv && a.kty === b.kty;
|
|
65
|
+
}
|
|
66
|
+
function readJwsHeader(jws) {
|
|
67
|
+
const headerB64 = jws.split('.')[0];
|
|
68
|
+
if (!headerB64)
|
|
69
|
+
return null;
|
|
70
|
+
try {
|
|
71
|
+
return JSON.parse(Buffer.from(headerB64, 'base64url').toString('utf8'));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function jwksHostAllowed(uri, hosts) {
|
|
78
|
+
try {
|
|
79
|
+
const url = new URL(uri);
|
|
80
|
+
if (url.protocol !== 'https:')
|
|
81
|
+
return false;
|
|
82
|
+
return hosts.some((host) => host.toLowerCase() === url.hostname.toLowerCase());
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
18
88
|
function verifyIssuerJws(jws, jwk) {
|
|
19
89
|
if (!jws || typeof jws !== 'string') {
|
|
20
90
|
return { valid: false, reason: 'invalid_jws' };
|
package/dist/jws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jws.js","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jws.js","sourceRoot":"","sources":["../src/jws.ts"],"names":[],"mappings":";;;AA0CA,wDAMC;AAMD,sCAQC;AAED,4CAEC;AAGD,gDAMC;AAED,oCAEC;AAED,sCAQC;AAED,0CAQC;AAED,0CA4CC;AAjJD;;;;;;;;GAQG;AACH,6CAAkF;AAoBlF;;;GAGG;AACU,QAAA,2BAA2B,GAAG;IACzC,6CAA6C;CACrC,CAAC;AAEX,6EAA6E;AAChE,QAAA,0BAA0B,GAAG,CAAC,iBAAiB,CAAU,CAAC;AAE1D,QAAA,aAAa,GAAG,eAAe,CAAC;AAE7C,SAAgB,sBAAsB,CAAC,OAA6B;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,EAAE,UAAkC,CAAC;IACzE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;IAC1C,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,GAA8C;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,CAAC,EAAE,GAAG,CAAC,CAAC;KACT,CAAC,CAAC;IACH,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAgC;IAC/D,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,iFAAiF;AACjF,SAAgB,kBAAkB,CAChC,GAAgC,EAChC,WAA8B;IAE9B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,OAAO,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,YAAY,CAAC,CAAW,EAAE,CAAW;IACnD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC;AAC1E,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,GAAW,EAAE,KAAwB;IACnE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,GAAW,EACX,GAAa;IAEb,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC;IACpD,IAAI,MAAsC,CAAC;IAC3C,IAAI,OAAgC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1E,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAc,IAAA,6BAAe,EAAC;YAC3C,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YACvD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAA,oBAAM,EAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE;YAChE,GAAG,EAAE,SAAS;YACd,WAAW,EAAE,YAAY;SAC1B,EAAE,SAAS,CAAC,CAAC;QACd,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC1F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAwB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IACnF,CAAC;AACH,CAAC"}
|
package/dist/payer.d.ts
CHANGED
|
@@ -19,6 +19,9 @@ export interface ReceiptPayerClaims {
|
|
|
19
19
|
payment?: {
|
|
20
20
|
ref?: string | null;
|
|
21
21
|
gross_amount?: string | null;
|
|
22
|
+
payee?: string | null;
|
|
23
|
+
asset?: string | null;
|
|
24
|
+
rail?: string | null;
|
|
22
25
|
} | null;
|
|
23
26
|
caller_binding?: {
|
|
24
27
|
payer_wallet?: string | null;
|
|
@@ -32,14 +35,21 @@ export interface VerifyPayerBindingOptions {
|
|
|
32
35
|
}
|
|
33
36
|
/** Decode the payload segment of a compact JWS (no signature check). */
|
|
34
37
|
export declare function decodeJwsPayload(jws: string): Record<string, unknown> | null;
|
|
38
|
+
interface PaymentClaim {
|
|
39
|
+
ref?: string | null;
|
|
40
|
+
gross_amount?: string | null;
|
|
41
|
+
payee?: string | null;
|
|
42
|
+
asset?: string | null;
|
|
43
|
+
rail?: string | null;
|
|
44
|
+
}
|
|
35
45
|
/**
|
|
36
|
-
*
|
|
46
|
+
* Payer facts from the JWS payload when one is present.
|
|
47
|
+
* The outer `payment` / `caller_binding` copies are unsigned and are used only
|
|
48
|
+
* when the receipt has no JWS. Callers that need verified facts must check the
|
|
49
|
+
* issuer signature first; this decode does not itself prove the signature.
|
|
37
50
|
*/
|
|
38
51
|
export declare function receiptPayerClaimsFromEnvelope(receipt: {
|
|
39
|
-
payment?:
|
|
40
|
-
ref?: string | null;
|
|
41
|
-
gross_amount?: string | null;
|
|
42
|
-
} | null;
|
|
52
|
+
payment?: PaymentClaim | null;
|
|
43
53
|
caller_binding?: {
|
|
44
54
|
payer_wallet?: string | null;
|
|
45
55
|
} | null;
|
|
@@ -51,4 +61,5 @@ export declare function receiptPayerClaimsFromEnvelope(receipt: {
|
|
|
51
61
|
* Verify caller_binding.payer_wallet against on-chain settlement in payment.ref.
|
|
52
62
|
*/
|
|
53
63
|
export declare function verifyPayerBinding(claims: ReceiptPayerClaims, options?: VerifyPayerBindingOptions): Promise<PayerBindingVerification>;
|
|
64
|
+
export {};
|
|
54
65
|
//# sourceMappingURL=payer.d.ts.map
|
package/dist/payer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payer.d.ts","sourceRoot":"","sources":["../src/payer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"payer.d.ts","sourceRoot":"","sources":["../src/payer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmB,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAC7B,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,GAAG,IAAI,CAAC;IACT,cAAc,CAAC,EAAE;QACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB,CAAC,EAAE,gBAAgB,CAAC;IAC1C,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ5E;AAED,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAYD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5C,GAAG,kBAAkB,CAyBrB;AAYD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA2EnC"}
|
package/dist/payer.js
CHANGED
|
@@ -20,41 +20,43 @@ function decodeJwsPayload(jws) {
|
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
function paymentClaims(payment) {
|
|
24
|
+
return {
|
|
25
|
+
ref: payment?.ref ?? null,
|
|
26
|
+
gross_amount: payment?.gross_amount != null ? String(payment.gross_amount) : null,
|
|
27
|
+
payee: payment?.payee ?? null,
|
|
28
|
+
asset: payment?.asset ?? null,
|
|
29
|
+
rail: payment?.rail ?? null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
23
32
|
/**
|
|
24
|
-
*
|
|
33
|
+
* Payer facts from the JWS payload when one is present.
|
|
34
|
+
* The outer `payment` / `caller_binding` copies are unsigned and are used only
|
|
35
|
+
* when the receipt has no JWS. Callers that need verified facts must check the
|
|
36
|
+
* issuer signature first; this decode does not itself prove the signature.
|
|
25
37
|
*/
|
|
26
38
|
function receiptPayerClaimsFromEnvelope(receipt) {
|
|
27
|
-
if (receipt.payment?.ref || receipt.caller_binding?.payer_wallet) {
|
|
28
|
-
return {
|
|
29
|
-
payment: {
|
|
30
|
-
ref: receipt.payment?.ref ?? null,
|
|
31
|
-
gross_amount: receipt.payment?.gross_amount ?? null,
|
|
32
|
-
},
|
|
33
|
-
caller_binding: receipt.caller_binding ?? null,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
39
|
const jws = receipt.issuer_signature?.jws;
|
|
37
|
-
if (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
if (jws) {
|
|
41
|
+
const claims = decodeJwsPayload(jws);
|
|
42
|
+
if (claims) {
|
|
43
|
+
const payment = claims.payment;
|
|
44
|
+
const callerBinding = claims.caller_binding;
|
|
45
|
+
return {
|
|
46
|
+
payment: paymentClaims(payment),
|
|
47
|
+
caller_binding: callerBinding ?? null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
42
50
|
}
|
|
43
|
-
|
|
44
|
-
if (!claims) {
|
|
51
|
+
if (receipt.payment?.ref || receipt.caller_binding?.payer_wallet) {
|
|
45
52
|
return {
|
|
46
|
-
payment:
|
|
47
|
-
caller_binding: null,
|
|
53
|
+
payment: paymentClaims(receipt.payment),
|
|
54
|
+
caller_binding: receipt.caller_binding ?? null,
|
|
48
55
|
};
|
|
49
56
|
}
|
|
50
|
-
const payment = claims.payment;
|
|
51
|
-
const callerBinding = claims.caller_binding;
|
|
52
57
|
return {
|
|
53
|
-
payment: {
|
|
54
|
-
|
|
55
|
-
gross_amount: payment?.gross_amount ?? null,
|
|
56
|
-
},
|
|
57
|
-
caller_binding: callerBinding ?? null,
|
|
58
|
+
payment: { ref: null, gross_amount: null, payee: null, asset: null, rail: null },
|
|
59
|
+
caller_binding: null,
|
|
58
60
|
};
|
|
59
61
|
}
|
|
60
62
|
function detectRail(paymentRef) {
|
|
@@ -75,6 +77,8 @@ async function verifyPayerBinding(claims, options = {}) {
|
|
|
75
77
|
const paymentRef = claims.payment?.ref ?? null;
|
|
76
78
|
const payerWallet = claims.caller_binding?.payer_wallet ?? null;
|
|
77
79
|
const grossAmount = claims.payment?.gross_amount ?? null;
|
|
80
|
+
const payee = claims.payment?.payee ?? null;
|
|
81
|
+
const asset = claims.payment?.asset ?? null;
|
|
78
82
|
const rail = detectRail(paymentRef);
|
|
79
83
|
if (!paymentRef) {
|
|
80
84
|
return { checked: false, valid: false, rail, reason: 'no_payment_ref' };
|
|
@@ -105,10 +109,18 @@ async function verifyPayerBinding(claims, options = {}) {
|
|
|
105
109
|
};
|
|
106
110
|
}
|
|
107
111
|
if (rail === 'base') {
|
|
112
|
+
if (!payee) {
|
|
113
|
+
return { checked: false, valid: false, rail, paymentRef, payerWallet, expectedAmount: grossAmount, reason: 'no_payee' };
|
|
114
|
+
}
|
|
115
|
+
if (!asset) {
|
|
116
|
+
return { checked: false, valid: false, rail, paymentRef, payerWallet, expectedAmount: grossAmount, reason: 'no_asset' };
|
|
117
|
+
}
|
|
108
118
|
const base = await (0, base_payer_js_1.verifyBasePayer)({
|
|
109
119
|
paymentRef,
|
|
110
120
|
payerWallet,
|
|
111
121
|
grossAmount,
|
|
122
|
+
payee,
|
|
123
|
+
asset,
|
|
112
124
|
rpcUrl: options.rpcUrl,
|
|
113
125
|
fetchReceipt: options.fetchBaseReceipt,
|
|
114
126
|
});
|
package/dist/payer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payer.js","sourceRoot":"","sources":["../src/payer.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"payer.js","sourceRoot":"","sources":["../src/payer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface PreimageLeaf {
|
|
2
|
+
preimage_utf8?: string;
|
|
3
|
+
preimage_hex?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface PreimageEntry {
|
|
6
|
+
field?: string;
|
|
7
|
+
alg?: string;
|
|
8
|
+
recomputable?: boolean;
|
|
9
|
+
preimage_utf8?: string;
|
|
10
|
+
preimage_hex?: string;
|
|
11
|
+
hash?: string;
|
|
12
|
+
merkle?: string;
|
|
13
|
+
leaves?: PreimageLeaf[];
|
|
14
|
+
url?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PreimageBlock {
|
|
17
|
+
schema?: string;
|
|
18
|
+
fields?: Record<string, PreimageEntry>;
|
|
19
|
+
not_recomputable?: {
|
|
20
|
+
field?: string;
|
|
21
|
+
hash?: string | null;
|
|
22
|
+
reason?: string;
|
|
23
|
+
}[];
|
|
24
|
+
links?: {
|
|
25
|
+
preimage?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface PreimageCheck {
|
|
29
|
+
checked: boolean;
|
|
30
|
+
ok: boolean;
|
|
31
|
+
errors: string[];
|
|
32
|
+
fields: {
|
|
33
|
+
field: string;
|
|
34
|
+
ok: boolean;
|
|
35
|
+
reason?: string;
|
|
36
|
+
}[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fields a stranger is expected to recompute when they are present.
|
|
40
|
+
* Coverage and tree_head_hash count only when the issuer published a preimage.
|
|
41
|
+
* Output, HMAC, and book-row universe hashes do not.
|
|
42
|
+
*/
|
|
43
|
+
export declare function requiredPreimageFields(receipt: Record<string, unknown>): string[];
|
|
44
|
+
export declare function verifyPublishedPreimages(receipt: Record<string, unknown>, { requirePreimages, fetchImpl, trustedHosts, }?: {
|
|
45
|
+
requirePreimages?: boolean;
|
|
46
|
+
fetchImpl?: typeof fetch;
|
|
47
|
+
trustedHosts?: readonly string[];
|
|
48
|
+
}): Promise<PreimageCheck>;
|
|
49
|
+
//# sourceMappingURL=preimage.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/preimage.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requiredPreimageFields = requiredPreimageFields;
|
|
4
|
+
exports.verifyPublishedPreimages = verifyPublishedPreimages;
|
|
5
|
+
/**
|
|
6
|
+
* Recompute published receipt preimages.
|
|
7
|
+
* A missing or mismatched preimage fails closed when the caller requires it,
|
|
8
|
+
* and whenever a `preimages` block is present.
|
|
9
|
+
*/
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
const ethers_1 = require("ethers");
|
|
12
|
+
const ALWAYS_REQUIRED = [
|
|
13
|
+
'book_chain.row_hash',
|
|
14
|
+
'book_row.row_hash',
|
|
15
|
+
'inclusion.leaf',
|
|
16
|
+
'binding.expected_commitment',
|
|
17
|
+
'job_spec_hash',
|
|
18
|
+
'response_hash',
|
|
19
|
+
];
|
|
20
|
+
function sha256(buf) {
|
|
21
|
+
return (0, node_crypto_1.createHash)('sha256').update(buf).digest();
|
|
22
|
+
}
|
|
23
|
+
function bytesOf(entry) {
|
|
24
|
+
if (!entry)
|
|
25
|
+
return null;
|
|
26
|
+
if (typeof entry.preimage_hex === 'string' && entry.preimage_hex !== '') {
|
|
27
|
+
const hex = entry.preimage_hex.replace(/^0x/, '');
|
|
28
|
+
if (!/^[0-9a-fA-F]*$/.test(hex) || hex.length % 2)
|
|
29
|
+
return null;
|
|
30
|
+
return Buffer.from(hex, 'hex');
|
|
31
|
+
}
|
|
32
|
+
if (typeof entry.preimage_utf8 === 'string')
|
|
33
|
+
return Buffer.from(entry.preimage_utf8, 'utf8');
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function leafInput(leaf) {
|
|
37
|
+
if (typeof leaf.preimage_hex === 'string' && leaf.preimage_hex !== '') {
|
|
38
|
+
return bytesOf(leaf);
|
|
39
|
+
}
|
|
40
|
+
if (typeof leaf.preimage_utf8 === 'string') {
|
|
41
|
+
return Buffer.concat([Buffer.from([0x00]), Buffer.from(leaf.preimage_utf8, 'utf8')]);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function merkleRoot(leaves) {
|
|
46
|
+
const level = [];
|
|
47
|
+
for (const leaf of leaves) {
|
|
48
|
+
const input = leafInput(leaf);
|
|
49
|
+
if (!input)
|
|
50
|
+
return null;
|
|
51
|
+
level.push(sha256(input));
|
|
52
|
+
}
|
|
53
|
+
if (!level.length)
|
|
54
|
+
return null;
|
|
55
|
+
let nodes = level;
|
|
56
|
+
while (nodes.length > 1) {
|
|
57
|
+
const next = [];
|
|
58
|
+
for (let i = 0; i < nodes.length; i += 2) {
|
|
59
|
+
if (i + 1 === nodes.length)
|
|
60
|
+
next.push(nodes[i]);
|
|
61
|
+
else
|
|
62
|
+
next.push(sha256(Buffer.concat([Buffer.from([0x01]), nodes[i], nodes[i + 1]])));
|
|
63
|
+
}
|
|
64
|
+
nodes = next;
|
|
65
|
+
}
|
|
66
|
+
return nodes[0].toString('hex');
|
|
67
|
+
}
|
|
68
|
+
function digestHex(entry) {
|
|
69
|
+
if (entry.merkle === 'rfc6962' && Array.isArray(entry.leaves)) {
|
|
70
|
+
return merkleRoot(entry.leaves);
|
|
71
|
+
}
|
|
72
|
+
const bytes = bytesOf(entry);
|
|
73
|
+
if (!bytes)
|
|
74
|
+
return null;
|
|
75
|
+
if (entry.alg === 'keccak256')
|
|
76
|
+
return (0, ethers_1.keccak256)(bytes).toLowerCase();
|
|
77
|
+
if (entry.alg === 'sha256') {
|
|
78
|
+
const hex = sha256(bytes).toString('hex');
|
|
79
|
+
const published = String(entry.hash || '');
|
|
80
|
+
if (published.startsWith('0x') || published.startsWith('sha256:'))
|
|
81
|
+
return `0x${hex}`;
|
|
82
|
+
return hex;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function sameHash(left, right) {
|
|
87
|
+
const norm = (value) => value.trim().toLowerCase().replace(/^sha256=/, '');
|
|
88
|
+
return norm(left) === norm(right);
|
|
89
|
+
}
|
|
90
|
+
function readPath(receipt, field) {
|
|
91
|
+
if (field === 'job_spec_hash') {
|
|
92
|
+
return receipt.job_spec_hash
|
|
93
|
+
?? receipt.board?.job_spec_hash
|
|
94
|
+
?? receipt.a2a_escrow?.job_spec_hash
|
|
95
|
+
?? null;
|
|
96
|
+
}
|
|
97
|
+
return field.split('.').reduce((obj, key) => {
|
|
98
|
+
if (obj == null || typeof obj !== 'object')
|
|
99
|
+
return undefined;
|
|
100
|
+
return obj[key];
|
|
101
|
+
}, receipt);
|
|
102
|
+
}
|
|
103
|
+
function hasHash(value) {
|
|
104
|
+
return value != null && value !== '';
|
|
105
|
+
}
|
|
106
|
+
function withheld(block, field) {
|
|
107
|
+
return (block?.not_recomputable || []).some((row) => row.field === field);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Fields a stranger is expected to recompute when they are present.
|
|
111
|
+
* Coverage and tree_head_hash count only when the issuer published a preimage.
|
|
112
|
+
* Output, HMAC, and book-row universe hashes do not.
|
|
113
|
+
*/
|
|
114
|
+
function requiredPreimageFields(receipt) {
|
|
115
|
+
const block = (receipt.preimages || null);
|
|
116
|
+
const fields = [];
|
|
117
|
+
for (const field of ALWAYS_REQUIRED) {
|
|
118
|
+
if (hasHash(readPath(receipt, field)) && !withheld(block, field))
|
|
119
|
+
fields.push(field);
|
|
120
|
+
}
|
|
121
|
+
for (const field of ['tree_head_hash', 'coverage.universe_hash', 'coverage.enumerated_hash']) {
|
|
122
|
+
if (block?.fields?.[field])
|
|
123
|
+
fields.push(field);
|
|
124
|
+
}
|
|
125
|
+
return [...new Set(fields)];
|
|
126
|
+
}
|
|
127
|
+
async function loadRemote(entry, fetchImpl, hosts) {
|
|
128
|
+
if (!entry.url)
|
|
129
|
+
return null;
|
|
130
|
+
let url;
|
|
131
|
+
try {
|
|
132
|
+
url = new URL(entry.url);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (url.protocol !== 'https:' || !hosts.some((host) => host.toLowerCase() === url.hostname.toLowerCase())) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const res = await fetchImpl(entry.url);
|
|
141
|
+
if (!res.ok)
|
|
142
|
+
return null;
|
|
143
|
+
const body = await res.json();
|
|
144
|
+
return body && typeof body === 'object' ? { ...entry, ...body } : null;
|
|
145
|
+
}
|
|
146
|
+
async function verifyPublishedPreimages(receipt, { requirePreimages = false, fetchImpl = globalThis.fetch, trustedHosts = ['api.chit402.com'], } = {}) {
|
|
147
|
+
const block = (receipt.preimages || null);
|
|
148
|
+
const required = requiredPreimageFields(receipt);
|
|
149
|
+
if (!block && !requirePreimages) {
|
|
150
|
+
return { checked: false, ok: true, errors: [], fields: [] };
|
|
151
|
+
}
|
|
152
|
+
if (!block && required.length === 0) {
|
|
153
|
+
return { checked: true, ok: true, errors: [], fields: [] };
|
|
154
|
+
}
|
|
155
|
+
const errors = [];
|
|
156
|
+
const fields = [];
|
|
157
|
+
const published = block?.fields || {};
|
|
158
|
+
const targets = new Set([...required, ...Object.keys(published)]);
|
|
159
|
+
for (const field of targets) {
|
|
160
|
+
if (withheld(block, field) && !published[field])
|
|
161
|
+
continue;
|
|
162
|
+
let entry = published[field];
|
|
163
|
+
if (!entry) {
|
|
164
|
+
const message = `preimage missing for ${field}`;
|
|
165
|
+
errors.push(message);
|
|
166
|
+
fields.push({ field, ok: false, reason: 'preimage_missing' });
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (entry.recomputable === false)
|
|
170
|
+
continue;
|
|
171
|
+
if (!bytesOf(entry) && !(entry.leaves && entry.leaves.length) && entry.url && fetchImpl) {
|
|
172
|
+
try {
|
|
173
|
+
const remote = await loadRemote(entry, fetchImpl, trustedHosts);
|
|
174
|
+
if (remote)
|
|
175
|
+
entry = remote;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
/* fall through to missing */
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const digest = digestHex(entry);
|
|
182
|
+
const expected = entry.hash != null ? String(entry.hash) : '';
|
|
183
|
+
const onReceipt = readPath(receipt, field);
|
|
184
|
+
if (digest == null) {
|
|
185
|
+
errors.push(`preimage missing for ${field}`);
|
|
186
|
+
fields.push({ field, ok: false, reason: 'preimage_missing' });
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (!sameHash(digest, expected)) {
|
|
190
|
+
errors.push(`preimage mismatch for ${field}: hash does not match the published bytes`);
|
|
191
|
+
fields.push({ field, ok: false, reason: 'preimage_mismatch' });
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (hasHash(onReceipt) && !sameHash(digest, String(onReceipt))) {
|
|
195
|
+
errors.push(`preimage mismatch for ${field}: recomputed hash does not match the receipt`);
|
|
196
|
+
fields.push({ field, ok: false, reason: 'preimage_mismatch' });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
fields.push({ field, ok: true });
|
|
200
|
+
}
|
|
201
|
+
return { checked: true, ok: errors.length === 0, errors, fields };
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=preimage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preimage.js","sourceRoot":"","sources":["../src/preimage.ts"],"names":[],"mappings":"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"}
|