@mikeargento/bitgraph-audit 0.1.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/LICENSE +21 -0
- package/README.md +11 -0
- package/dist/anchors.d.ts +31 -0
- package/dist/anchors.d.ts.map +1 -0
- package/dist/anchors.js +116 -0
- package/dist/anchors.js.map +1 -0
- package/dist/anomalies.d.ts +42 -0
- package/dist/anomalies.d.ts.map +1 -0
- package/dist/anomalies.js +642 -0
- package/dist/anomalies.js.map +1 -0
- package/dist/attestation.d.ts +20 -0
- package/dist/attestation.d.ts.map +1 -0
- package/dist/attestation.js +795 -0
- package/dist/attestation.js.map +1 -0
- package/dist/audit.d.ts +19 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +116 -0
- package/dist/audit.js.map +1 -0
- package/dist/authority.d.ts +37 -0
- package/dist/authority.d.ts.map +1 -0
- package/dist/authority.js +126 -0
- package/dist/authority.js.map +1 -0
- package/dist/aws-nitro-root-ca.d.ts +24 -0
- package/dist/aws-nitro-root-ca.d.ts.map +1 -0
- package/dist/aws-nitro-root-ca.js +44 -0
- package/dist/aws-nitro-root-ca.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +257 -0
- package/dist/cli.js.map +1 -0
- package/dist/contents-hash.d.ts +30 -0
- package/dist/contents-hash.d.ts.map +1 -0
- package/dist/contents-hash.js +73 -0
- package/dist/contents-hash.js.map +1 -0
- package/dist/export.d.ts +64 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +192 -0
- package/dist/export.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +36 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +828 -0
- package/dist/ingest.js.map +1 -0
- package/dist/reconstruct.d.ts +40 -0
- package/dist/reconstruct.d.ts.map +1 -0
- package/dist/reconstruct.js +400 -0
- package/dist/reconstruct.js.map +1 -0
- package/dist/report-json.d.ts +3 -0
- package/dist/report-json.d.ts.map +1 -0
- package/dist/report-json.js +290 -0
- package/dist/report-json.js.map +1 -0
- package/dist/report-md.d.ts +3 -0
- package/dist/report-md.d.ts.map +1 -0
- package/dist/report-md.js +853 -0
- package/dist/report-md.js.map +1 -0
- package/dist/rlp.d.ts +37 -0
- package/dist/rlp.d.ts.map +1 -0
- package/dist/rlp.js +120 -0
- package/dist/rlp.js.map +1 -0
- package/dist/tar.d.ts +47 -0
- package/dist/tar.d.ts.map +1 -0
- package/dist/tar.js +483 -0
- package/dist/tar.js.map +1 -0
- package/dist/temporal.d.ts +55 -0
- package/dist/temporal.d.ts.map +1 -0
- package/dist/temporal.js +461 -0
- package/dist/temporal.js.map +1 -0
- package/dist/types.d.ts +1389 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validity.d.ts +21 -0
- package/dist/validity.d.ts.map +1 -0
- package/dist/validity.js +86 -0
- package/dist/validity.js.map +1 -0
- package/dist/verify-tiers.d.ts +11 -0
- package/dist/verify-tiers.d.ts.map +1 -0
- package/dist/verify-tiers.js +120 -0
- package/dist/verify-tiers.js.map +1 -0
- package/dist/witness.d.ts +25 -0
- package/dist/witness.d.ts.map +1 -0
- package/dist/witness.js +308 -0
- package/dist/witness.js.map +1 -0
- package/package.json +42 -0
- package/src/anchors.ts +168 -0
- package/src/anomalies.ts +773 -0
- package/src/attestation.ts +878 -0
- package/src/audit.ts +136 -0
- package/src/authority.ts +165 -0
- package/src/aws-nitro-root-ca.ts +47 -0
- package/src/cli.ts +284 -0
- package/src/contents-hash.ts +95 -0
- package/src/export.ts +278 -0
- package/src/index.ts +122 -0
- package/src/ingest.ts +967 -0
- package/src/reconstruct.ts +491 -0
- package/src/report-json.ts +331 -0
- package/src/report-md.ts +1067 -0
- package/src/rlp.ts +142 -0
- package/src/tar.ts +587 -0
- package/src/temporal.ts +629 -0
- package/src/types.ts +1528 -0
- package/src/validity.ts +90 -0
- package/src/verify-tiers.ts +137 -0
- package/src/witness.ts +407 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qFAAqF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ObservedProof } from "./types.js";
|
|
2
|
+
/** See module doc. Results are cached per ObservedProof object. */
|
|
3
|
+
export declare function isIntrinsicallyValid(observed: ObservedProof): Promise<boolean>;
|
|
4
|
+
/**
|
|
5
|
+
* Strict decimal counter parse for topology purposes. Accepts ASCII digit
|
|
6
|
+
* strings (leading zeros normalize through BigInt); anything else is
|
|
7
|
+
* treated as no counter evidence. The canonical verifier separately
|
|
8
|
+
* reports malformed counters on the verification dimension.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseCounter(value: string | undefined): bigint | undefined;
|
|
11
|
+
/** Deterministic member order: parseable counter ascending, then canonical hash. */
|
|
12
|
+
export declare function byCounterThenHash(a: {
|
|
13
|
+
counter?: string;
|
|
14
|
+
proofHash: string;
|
|
15
|
+
}, b: {
|
|
16
|
+
counter?: string;
|
|
17
|
+
proofHash: string;
|
|
18
|
+
}): number;
|
|
19
|
+
/** Append to a Map-of-arrays. */
|
|
20
|
+
export declare function pushMap<K, V>(map: Map<K, V[]>, key: K, value: V): void;
|
|
21
|
+
//# sourceMappingURL=validity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity.d.ts","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,mEAAmE;AACnE,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBpF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG1E;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC1C,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACzC,MAAM,CAOR;AAED,iCAAiC;AACjC,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAItE"}
|
package/dist/validity.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
/**
|
|
3
|
+
* bitgraph-audit intrinsic validity (internal)
|
|
4
|
+
*
|
|
5
|
+
* Shared by reconstruction and anomaly classification to answer one
|
|
6
|
+
* question: is this proof object cryptographically sound on its own
|
|
7
|
+
* (structure, canonical signature, slot binding, epoch link shape and
|
|
8
|
+
* successor binding), independent of run-order effects and of any supplied
|
|
9
|
+
* trust policy?
|
|
10
|
+
*
|
|
11
|
+
* Sources, in order:
|
|
12
|
+
*
|
|
13
|
+
* 1. The run verification record: "verified" and "artifact-unavailable"
|
|
14
|
+
* are intrinsically valid.
|
|
15
|
+
* 2. Anything else (status "failed", or the verification pass has not
|
|
16
|
+
* run) gets an isolated bytes-free recheck through
|
|
17
|
+
* verifyProofIntegrity with a fresh epoch link state and no policy.
|
|
18
|
+
* This separates order-dependent failures (the epoch link
|
|
19
|
+
* single-successor check fails whichever fork consumer verifies
|
|
20
|
+
* second) and policy rejections from cryptographic unsoundness.
|
|
21
|
+
*
|
|
22
|
+
* The run verification record is never modified: a proof that failed in
|
|
23
|
+
* the run keeps that status everywhere it is reported. Intrinsic validity
|
|
24
|
+
* only decides whether the proof may stand as a competing branch in a
|
|
25
|
+
* divergence or carry a hard lineage edge.
|
|
26
|
+
*
|
|
27
|
+
* State discipline: the recheck resets the verify package's module-level
|
|
28
|
+
* epoch link state before and after each call. Callers therefore run
|
|
29
|
+
* reconstruction and classification only after verifyObservedProofs has
|
|
30
|
+
* completed; that pass resets its own state at the start of every run, so
|
|
31
|
+
* later audit runs are unaffected.
|
|
32
|
+
*/
|
|
33
|
+
import { resetEpochLinkState, verifyProofIntegrity } from "@mikeargento/bitgraph-verify";
|
|
34
|
+
const cache = new WeakMap();
|
|
35
|
+
/** See module doc. Results are cached per ObservedProof object. */
|
|
36
|
+
export async function isIntrinsicallyValid(observed) {
|
|
37
|
+
const status = observed.verification?.status;
|
|
38
|
+
if (status === "verified" || status === "artifact-unavailable")
|
|
39
|
+
return true;
|
|
40
|
+
const cached = cache.get(observed);
|
|
41
|
+
if (cached !== undefined)
|
|
42
|
+
return cached;
|
|
43
|
+
resetEpochLinkState();
|
|
44
|
+
let valid = false;
|
|
45
|
+
try {
|
|
46
|
+
valid = (await verifyProofIntegrity({ proof: observed.proof })).valid;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
valid = false;
|
|
50
|
+
}
|
|
51
|
+
resetEpochLinkState();
|
|
52
|
+
cache.set(observed, valid);
|
|
53
|
+
return valid;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Strict decimal counter parse for topology purposes. Accepts ASCII digit
|
|
57
|
+
* strings (leading zeros normalize through BigInt); anything else is
|
|
58
|
+
* treated as no counter evidence. The canonical verifier separately
|
|
59
|
+
* reports malformed counters on the verification dimension.
|
|
60
|
+
*/
|
|
61
|
+
export function parseCounter(value) {
|
|
62
|
+
if (value === undefined || value.length === 0 || !/^[0-9]+$/.test(value))
|
|
63
|
+
return undefined;
|
|
64
|
+
return BigInt(value);
|
|
65
|
+
}
|
|
66
|
+
/** Deterministic member order: parseable counter ascending, then canonical hash. */
|
|
67
|
+
export function byCounterThenHash(a, b) {
|
|
68
|
+
const ca = parseCounter(a.counter);
|
|
69
|
+
const cb = parseCounter(b.counter);
|
|
70
|
+
if (ca !== undefined && cb !== undefined && ca !== cb)
|
|
71
|
+
return ca < cb ? -1 : 1;
|
|
72
|
+
if (ca !== undefined && cb === undefined)
|
|
73
|
+
return -1;
|
|
74
|
+
if (ca === undefined && cb !== undefined)
|
|
75
|
+
return 1;
|
|
76
|
+
return a.proofHash < b.proofHash ? -1 : a.proofHash > b.proofHash ? 1 : 0;
|
|
77
|
+
}
|
|
78
|
+
/** Append to a Map-of-arrays. */
|
|
79
|
+
export function pushMap(map, key, value) {
|
|
80
|
+
const list = map.get(key);
|
|
81
|
+
if (list === undefined)
|
|
82
|
+
map.set(key, [value]);
|
|
83
|
+
else
|
|
84
|
+
list.push(value);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=validity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity.js","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzF,MAAM,KAAK,GAAG,IAAI,OAAO,EAAmB,CAAC;AAE7C,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAuB;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC7C,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,sBAAsB;QAAE,OAAO,IAAI,CAAC;IAE5E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,mBAAmB,EAAE,CAAC;IACtB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,oBAAoB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IACD,mBAAmB,EAAE,CAAC;IAEtB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAyB;IACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3F,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,iBAAiB,CAC/B,CAA0C,EAC1C,CAA0C;IAE1C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC;IACpD,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,OAAO,CAAO,GAAgB,EAAE,GAAM,EAAE,KAAQ;IAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IngestResult, VerificationSummary, VerifyObservedOptions } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Verify every unique observed proof in the ingest result, attaching a
|
|
4
|
+
* ProofVerification record to each. Idempotent per proof: records already
|
|
5
|
+
* attached (from a previous call on the same object) are left untouched;
|
|
6
|
+
* for a fresh deterministic run, re-ingest the bundle first.
|
|
7
|
+
*
|
|
8
|
+
* @returns aggregate counts. Per-proof results live on ingest.proofs.
|
|
9
|
+
*/
|
|
10
|
+
export declare function verifyObservedProofs(ingest: IngestResult, options?: VerifyObservedOptions): Promise<VerificationSummary>;
|
|
11
|
+
//# sourceMappingURL=verify-tiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-tiers.d.ts","sourceRoot":"","sources":["../src/verify-tiers.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EACV,YAAY,EAGZ,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA8E9B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
/**
|
|
3
|
+
* bitgraph-audit verification tiers
|
|
4
|
+
*
|
|
5
|
+
* Applies the canonical verification tiers to every unique observed proof
|
|
6
|
+
* in an IngestResult:
|
|
7
|
+
*
|
|
8
|
+
* - Artifact bytes present (content-addressed match in the bundle):
|
|
9
|
+
* full verification through verify() from @mikeargento/bitgraph-verify,
|
|
10
|
+
* with the actual artifact bytes. Status "verified" or "failed" with
|
|
11
|
+
* the verifier's exact reason.
|
|
12
|
+
* - Artifact bytes absent: verifyProofIntegrity(), the bytes-free
|
|
13
|
+
* integrity API. Status "artifact-unavailable" when the checks pass;
|
|
14
|
+
* never "verified", because digest matching was not independently
|
|
15
|
+
* checked. Status "failed" with the exact reason otherwise.
|
|
16
|
+
*
|
|
17
|
+
* All verification semantics live in the verify package; this module only
|
|
18
|
+
* routes proofs and records results. Verification status and chain
|
|
19
|
+
* topology are separate dimensions: nothing here reads or writes chain
|
|
20
|
+
* structure, and chainless proofs (tagged at ingest) verify exactly like
|
|
21
|
+
* any other proof.
|
|
22
|
+
*
|
|
23
|
+
* Ordering and epoch link state: verifyEpochLink() in the verify package
|
|
24
|
+
* keeps module-level single-successor state, so resetEpochLinkState() is
|
|
25
|
+
* called exactly once per audit run, before any proof is verified. Within
|
|
26
|
+
* a run, proofs are verified in a deterministic order: first the
|
|
27
|
+
* artifact-matched proofs as their artifact bytes stream by (container
|
|
28
|
+
* order), then the remaining proofs in first-observation order. Re-running
|
|
29
|
+
* the pass over a re-ingested bundle therefore always reproduces the same
|
|
30
|
+
* results.
|
|
31
|
+
*/
|
|
32
|
+
import { resetEpochLinkState, verify, verifyProofIntegrity, } from "@mikeargento/bitgraph-verify";
|
|
33
|
+
import { streamMatchedArtifacts } from "./ingest.js";
|
|
34
|
+
/**
|
|
35
|
+
* Verify every unique observed proof in the ingest result, attaching a
|
|
36
|
+
* ProofVerification record to each. Idempotent per proof: records already
|
|
37
|
+
* attached (from a previous call on the same object) are left untouched;
|
|
38
|
+
* for a fresh deterministic run, re-ingest the bundle first.
|
|
39
|
+
*
|
|
40
|
+
* @returns aggregate counts. Per-proof results live on ingest.proofs.
|
|
41
|
+
*/
|
|
42
|
+
export async function verifyObservedProofs(ingest, options) {
|
|
43
|
+
// Fresh single-successor state once per audit run (verify package G7).
|
|
44
|
+
resetEpochLinkState();
|
|
45
|
+
const trustAnchors = options?.trustAnchors;
|
|
46
|
+
// Index proofs by the hex form of their artifact digest, mirroring the
|
|
47
|
+
// strict decoding used for artifact matching at ingest. Resolution goes
|
|
48
|
+
// through a proofHash map so a bundle with many artifacts stays
|
|
49
|
+
// O(proofs + artifacts + matches); ingest built matchedProofHashes in
|
|
50
|
+
// first-observation order, so the per-artifact proof order is unchanged.
|
|
51
|
+
const proofsByHash = new Map(ingest.proofs.map((p) => [p.proofHash, p]));
|
|
52
|
+
const byDigestHex = new Map();
|
|
53
|
+
for (const artifact of ingest.artifacts) {
|
|
54
|
+
if (artifact.matchedProofHashes.length === 0)
|
|
55
|
+
continue;
|
|
56
|
+
const matched = artifact.matchedProofHashes
|
|
57
|
+
.map((hash) => proofsByHash.get(hash))
|
|
58
|
+
.filter((p) => p !== undefined);
|
|
59
|
+
byDigestHex.set(artifact.sha256Hex, matched);
|
|
60
|
+
}
|
|
61
|
+
// Tier 1: full verification for proofs whose artifact bytes are present.
|
|
62
|
+
for await (const artifact of streamMatchedArtifacts(ingest)) {
|
|
63
|
+
const proofs = byDigestHex.get(artifact.sha256Hex) ?? [];
|
|
64
|
+
for (const proof of proofs) {
|
|
65
|
+
if (proof.verification !== undefined)
|
|
66
|
+
continue;
|
|
67
|
+
const result = await verify({
|
|
68
|
+
proof: proof.proof,
|
|
69
|
+
bytes: artifact.bytes,
|
|
70
|
+
...(trustAnchors !== undefined ? { trustAnchors } : {}),
|
|
71
|
+
});
|
|
72
|
+
const record = {
|
|
73
|
+
tier: "full",
|
|
74
|
+
status: result.valid ? "verified" : "failed",
|
|
75
|
+
...(result.reason !== undefined ? { reason: result.reason } : {}),
|
|
76
|
+
artifactPath: artifact.path,
|
|
77
|
+
};
|
|
78
|
+
proof.verification = record;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Tier 2: bytes-free integrity for everything else, in observation order.
|
|
82
|
+
for (const proof of ingest.proofs) {
|
|
83
|
+
if (proof.verification !== undefined)
|
|
84
|
+
continue;
|
|
85
|
+
const result = await verifyProofIntegrity({
|
|
86
|
+
proof: proof.proof,
|
|
87
|
+
...(trustAnchors !== undefined ? { trustAnchors } : {}),
|
|
88
|
+
});
|
|
89
|
+
const record = {
|
|
90
|
+
tier: "integrity",
|
|
91
|
+
status: result.valid ? "artifact-unavailable" : "failed",
|
|
92
|
+
...(result.reason !== undefined ? { reason: result.reason } : {}),
|
|
93
|
+
};
|
|
94
|
+
proof.verification = record;
|
|
95
|
+
}
|
|
96
|
+
// Summary.
|
|
97
|
+
let verified = 0;
|
|
98
|
+
let failed = 0;
|
|
99
|
+
let artifactUnavailable = 0;
|
|
100
|
+
let chainless = 0;
|
|
101
|
+
for (const proof of ingest.proofs) {
|
|
102
|
+
const status = proof.verification?.status;
|
|
103
|
+
if (status === "verified")
|
|
104
|
+
verified++;
|
|
105
|
+
else if (status === "failed")
|
|
106
|
+
failed++;
|
|
107
|
+
else if (status === "artifact-unavailable")
|
|
108
|
+
artifactUnavailable++;
|
|
109
|
+
if (proof.chainless)
|
|
110
|
+
chainless++;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
total: ingest.proofs.length,
|
|
114
|
+
verified,
|
|
115
|
+
failed,
|
|
116
|
+
artifactUnavailable,
|
|
117
|
+
chainless,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=verify-tiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-tiers.js","sourceRoot":"","sources":["../src/verify-tiers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AnchorIdentification, AnchorWitnessAnalysis, AnchorWitnessFile, AnchorWitnessOutcome, IngestResult, ObservedProof } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Verify every witness file in the bundle against the identified anchors.
|
|
4
|
+
*
|
|
5
|
+
* Matching is by block hash: a witness is a candidate for every anchor
|
|
6
|
+
* whose signed attribution.message equals (case-insensitively) either the
|
|
7
|
+
* locally recomputed header hash or the witness's claimed blockHash. The
|
|
8
|
+
* second route exists so a witness with a tampered header still fails
|
|
9
|
+
* loudly against its intended anchor (witness-hash-mismatch) instead of
|
|
10
|
+
* disappearing as unmatched. A witness matching no anchor is reported
|
|
11
|
+
* witness-unmatched.
|
|
12
|
+
*
|
|
13
|
+
* Deterministic: witnesses in observation order, candidate anchors in
|
|
14
|
+
* identification (observation) order. Run after verifyObservedProofs and
|
|
15
|
+
* identifyAnchors.
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyAnchorWitnesses(ingest: IngestResult, identification: AnchorIdentification): Promise<AnchorWitnessAnalysis>;
|
|
18
|
+
/**
|
|
19
|
+
* Verify one witness file against one specific anchor proof, running the
|
|
20
|
+
* full spec 10.3 procedure. Exposed for targeted use; the pipeline
|
|
21
|
+
* (verifyAnchorWitnesses) applies the same procedure with hash-based
|
|
22
|
+
* matching.
|
|
23
|
+
*/
|
|
24
|
+
export declare function verifyAnchorWitness(witnessFile: AnchorWitnessFile, anchorProof: ObservedProof): Promise<AnchorWitnessOutcome>;
|
|
25
|
+
//# sourceMappingURL=witness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../src/witness.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EAGpB,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAWpB;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,oBAAoB,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAoDhC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,aAAa,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAa/B"}
|
package/dist/witness.js
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
|
|
2
|
+
/**
|
|
3
|
+
* bitgraph-audit anchor witness verification
|
|
4
|
+
*
|
|
5
|
+
* Implements the mandatory procedure of docs/BUNDLE-FORMAT.md section
|
|
6
|
+
* 10.3, exactly and fully offline:
|
|
7
|
+
*
|
|
8
|
+
* 1. Hex-decode headerRlpHex and require a single well-formed RLP list.
|
|
9
|
+
* 2. Recompute the block hash locally with Keccak-256 (Ethereum's
|
|
10
|
+
* original Keccak padding, explicitly NOT FIPS-202 SHA3-256).
|
|
11
|
+
* 3. Compare against the anchor's SIGNED attribution.message
|
|
12
|
+
* (lowercased, full 0x string).
|
|
13
|
+
* 4. Bind the signed message to the committed artifact: SHA-256 over
|
|
14
|
+
* the UTF-8 bytes of the exact signed message string must equal the
|
|
15
|
+
* strictly decoded artifact.digestB64.
|
|
16
|
+
* 5. Cross-check the claimed fields: header RLP index 8 (number)
|
|
17
|
+
* against the witness's blockNumber and, when the signed
|
|
18
|
+
* attribution.title parses as an Etherscan block URL, against the
|
|
19
|
+
* URL; and the witness's claimed blockHash against the recomputed
|
|
20
|
+
* hash.
|
|
21
|
+
* 6. Only then read the timestamp from RLP index 11 as external
|
|
22
|
+
* wall-clock evidence.
|
|
23
|
+
*
|
|
24
|
+
* Preconditions per the spec: the candidate anchor is identified by its
|
|
25
|
+
* signed attribution and its own cryptographic verification has
|
|
26
|
+
* succeeded. A witness cannot rescue an invalid proof. Intrinsic
|
|
27
|
+
* validity (validity.ts) is used for the precondition, so a run-order
|
|
28
|
+
* epoch-link artifact never disqualifies a sound anchor, and the run
|
|
29
|
+
* verification record is never modified.
|
|
30
|
+
*
|
|
31
|
+
* Any failure means the witness confers nothing: no timestamp is
|
|
32
|
+
* reported, and the anchor proof's own standing is unchanged in both
|
|
33
|
+
* directions. Failure codes are stable AnomalyCode literals.
|
|
34
|
+
*
|
|
35
|
+
* Zero network access: witnesses are inbound files, trust in them is
|
|
36
|
+
* established purely by local recomputation.
|
|
37
|
+
*/
|
|
38
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
39
|
+
import { keccak_256 } from "@noble/hashes/sha3";
|
|
40
|
+
import { bytesToHex0x, decodeRlpList, hexToBytes, rlpBytesToBigInt } from "./rlp.js";
|
|
41
|
+
import { isIntrinsicallyValid } from "./validity.js";
|
|
42
|
+
const HEADER_NUMBER_INDEX = 8;
|
|
43
|
+
const HEADER_TIMESTAMP_INDEX = 11;
|
|
44
|
+
const BLOCK_HASH_SHAPE = /^0x[0-9a-fA-F]{64}$/;
|
|
45
|
+
const ETHERSCAN_BLOCK_URL = /^https:\/\/etherscan\.io\/block\/([0-9]+)$/;
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Public API
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Verify every witness file in the bundle against the identified anchors.
|
|
51
|
+
*
|
|
52
|
+
* Matching is by block hash: a witness is a candidate for every anchor
|
|
53
|
+
* whose signed attribution.message equals (case-insensitively) either the
|
|
54
|
+
* locally recomputed header hash or the witness's claimed blockHash. The
|
|
55
|
+
* second route exists so a witness with a tampered header still fails
|
|
56
|
+
* loudly against its intended anchor (witness-hash-mismatch) instead of
|
|
57
|
+
* disappearing as unmatched. A witness matching no anchor is reported
|
|
58
|
+
* witness-unmatched.
|
|
59
|
+
*
|
|
60
|
+
* Deterministic: witnesses in observation order, candidate anchors in
|
|
61
|
+
* identification (observation) order. Run after verifyObservedProofs and
|
|
62
|
+
* identifyAnchors.
|
|
63
|
+
*/
|
|
64
|
+
export async function verifyAnchorWitnesses(ingest, identification) {
|
|
65
|
+
const outcomes = [];
|
|
66
|
+
const findings = [];
|
|
67
|
+
const byHash = new Map(ingest.proofs.map((p) => [p.proofHash, p]));
|
|
68
|
+
for (const witnessFile of ingest.witnesses) {
|
|
69
|
+
const decoded = decodeWitness(witnessFile);
|
|
70
|
+
if (decoded.failure !== undefined) {
|
|
71
|
+
const outcome = {
|
|
72
|
+
witnessPath: witnessFile.path,
|
|
73
|
+
verified: false,
|
|
74
|
+
reason: decoded.failure.reason,
|
|
75
|
+
detail: decoded.failure.detail,
|
|
76
|
+
};
|
|
77
|
+
outcomes.push(outcome);
|
|
78
|
+
findings.push(toFinding(outcome));
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Candidate anchors by recomputed hash or claimed hash.
|
|
82
|
+
const computed = decoded.computedHash;
|
|
83
|
+
const claimed = decoded.claimedHash.toLowerCase();
|
|
84
|
+
const candidates = identification.anchors.filter((anchor) => {
|
|
85
|
+
const message = anchor.blockHash?.toLowerCase();
|
|
86
|
+
return message !== undefined && (message === computed || message === claimed);
|
|
87
|
+
});
|
|
88
|
+
if (candidates.length === 0) {
|
|
89
|
+
const outcome = {
|
|
90
|
+
witnessPath: witnessFile.path,
|
|
91
|
+
verified: false,
|
|
92
|
+
reason: "witness-unmatched",
|
|
93
|
+
detail: "neither the locally recomputed block hash nor the claimed blockHash matches any " +
|
|
94
|
+
"observed anchor's signed attribution.message",
|
|
95
|
+
computedBlockHash: computed,
|
|
96
|
+
};
|
|
97
|
+
outcomes.push(outcome);
|
|
98
|
+
findings.push(toFinding(outcome));
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
for (const candidate of candidates) {
|
|
102
|
+
const anchorProof = byHash.get(candidate.proofHash);
|
|
103
|
+
const anchorValid = anchorProof !== undefined && (await isIntrinsicallyValid(anchorProof));
|
|
104
|
+
const outcome = runProcedure(decoded, witnessFile.path, candidate.proofHash, anchorProof, anchorValid);
|
|
105
|
+
outcomes.push(outcome);
|
|
106
|
+
if (!outcome.verified)
|
|
107
|
+
findings.push(toFinding(outcome));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { outcomes, findings };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Verify one witness file against one specific anchor proof, running the
|
|
114
|
+
* full spec 10.3 procedure. Exposed for targeted use; the pipeline
|
|
115
|
+
* (verifyAnchorWitnesses) applies the same procedure with hash-based
|
|
116
|
+
* matching.
|
|
117
|
+
*/
|
|
118
|
+
export async function verifyAnchorWitness(witnessFile, anchorProof) {
|
|
119
|
+
const decoded = decodeWitness(witnessFile);
|
|
120
|
+
if (decoded.failure !== undefined) {
|
|
121
|
+
return {
|
|
122
|
+
witnessPath: witnessFile.path,
|
|
123
|
+
anchorProofHash: anchorProof.proofHash,
|
|
124
|
+
verified: false,
|
|
125
|
+
reason: decoded.failure.reason,
|
|
126
|
+
detail: decoded.failure.detail,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const anchorValid = await isIntrinsicallyValid(anchorProof);
|
|
130
|
+
return runProcedure(decoded, witnessFile.path, anchorProof.proofHash, anchorProof, anchorValid);
|
|
131
|
+
}
|
|
132
|
+
function decodeWitness(witnessFile) {
|
|
133
|
+
const w = witnessFile.witness;
|
|
134
|
+
// Field rules of spec 10.2.
|
|
135
|
+
const headerRlpHex = w["headerRlpHex"];
|
|
136
|
+
if (typeof headerRlpHex !== "string") {
|
|
137
|
+
return malformed("headerRlpHex is missing or not a string");
|
|
138
|
+
}
|
|
139
|
+
const blockNumber = w["blockNumber"];
|
|
140
|
+
if (typeof blockNumber !== "number" || !Number.isInteger(blockNumber) || blockNumber < 0) {
|
|
141
|
+
return malformed("blockNumber is missing or not a non-negative integer");
|
|
142
|
+
}
|
|
143
|
+
const blockHash = w["blockHash"];
|
|
144
|
+
if (typeof blockHash !== "string" || !BLOCK_HASH_SHAPE.test(blockHash)) {
|
|
145
|
+
return malformed("blockHash is missing or not 0x followed by 64 hex characters");
|
|
146
|
+
}
|
|
147
|
+
// Step 1: hex-decode, then require a single well-formed RLP list.
|
|
148
|
+
const headerBytes = hexToBytes(headerRlpHex);
|
|
149
|
+
if (headerBytes === null) {
|
|
150
|
+
return malformed("headerRlpHex is not 0x-prefixed even-length hex");
|
|
151
|
+
}
|
|
152
|
+
let items;
|
|
153
|
+
try {
|
|
154
|
+
items = decodeRlpList(headerBytes);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return {
|
|
158
|
+
failure: {
|
|
159
|
+
reason: "witness-rlp-invalid",
|
|
160
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// Step 2: Keccak-256 over the exact decoded header bytes.
|
|
165
|
+
const computedHash = bytesToHex0x(keccak_256(headerBytes));
|
|
166
|
+
return {
|
|
167
|
+
computedHash,
|
|
168
|
+
items,
|
|
169
|
+
claimedHash: blockHash,
|
|
170
|
+
claimedNumber: BigInt(blockNumber),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function malformed(detail) {
|
|
174
|
+
return { failure: { reason: "witness-malformed", detail } };
|
|
175
|
+
}
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
// Steps 3 through 6 against one candidate anchor
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
function runProcedure(decoded, witnessPath, anchorProofHash, anchorProof, anchorValid) {
|
|
180
|
+
const computedHash = decoded.computedHash;
|
|
181
|
+
const base = {
|
|
182
|
+
witnessPath,
|
|
183
|
+
anchorProofHash,
|
|
184
|
+
computedBlockHash: computedHash,
|
|
185
|
+
};
|
|
186
|
+
const fail = (reason, detail, extra) => ({
|
|
187
|
+
...base,
|
|
188
|
+
verified: false,
|
|
189
|
+
reason,
|
|
190
|
+
detail,
|
|
191
|
+
...(extra?.blockNumber !== undefined ? { blockNumber: extra.blockNumber } : {}),
|
|
192
|
+
});
|
|
193
|
+
// Preconditions: the anchor proof's own cryptographic verification must
|
|
194
|
+
// have succeeded. A witness cannot rescue an invalid proof.
|
|
195
|
+
if (anchorProof === undefined || !anchorValid) {
|
|
196
|
+
return fail("witness-anchor-invalid", "the candidate anchor proof is not cryptographically valid; the witness confers nothing");
|
|
197
|
+
}
|
|
198
|
+
// Step 3: recomputed hash against the SIGNED attribution.message.
|
|
199
|
+
const message = readSignedMessage(anchorProof);
|
|
200
|
+
if (message === undefined || message.toLowerCase() !== computedHash) {
|
|
201
|
+
return fail("witness-hash-mismatch", message === undefined
|
|
202
|
+
? "the anchor carries no signed attribution.message to compare against"
|
|
203
|
+
: "the locally recomputed block hash does not equal the anchor's signed attribution.message");
|
|
204
|
+
}
|
|
205
|
+
// Step 4: bind the signed message string to the committed artifact.
|
|
206
|
+
// SHA-256 over the exact signed string, no case normalization: the
|
|
207
|
+
// digest covers the string as signed (bitcoin-anchor.ts hashes the
|
|
208
|
+
// block-hash STRING).
|
|
209
|
+
const digest = strictBase64Decode32(readDigestB64(anchorProof));
|
|
210
|
+
if (digest === null) {
|
|
211
|
+
return fail("witness-digest-mismatch", "the anchor's artifact.digestB64 does not strictly decode as base64 of 32 bytes");
|
|
212
|
+
}
|
|
213
|
+
const messageHash = sha256(new TextEncoder().encode(message));
|
|
214
|
+
if (!bytesEqual(messageHash, digest)) {
|
|
215
|
+
return fail("witness-digest-mismatch", "SHA-256 of the exact signed attribution.message string does not equal the anchor's artifact digest");
|
|
216
|
+
}
|
|
217
|
+
// Step 5: cross-check the claimed fields.
|
|
218
|
+
const items = decoded.items;
|
|
219
|
+
const numberItem = items[HEADER_NUMBER_INDEX];
|
|
220
|
+
if (numberItem === undefined || !(numberItem instanceof Uint8Array)) {
|
|
221
|
+
return fail("witness-header-shape", `header RLP item ${HEADER_NUMBER_INDEX} (block number) is missing or not a byte string`);
|
|
222
|
+
}
|
|
223
|
+
const headerNumber = rlpBytesToBigInt(numberItem);
|
|
224
|
+
if (headerNumber !== decoded.claimedNumber) {
|
|
225
|
+
return fail("witness-block-number-mismatch", `the witness claims blockNumber ${decoded.claimedNumber}, but the header's number field is ${headerNumber}`, { blockNumber: String(headerNumber) });
|
|
226
|
+
}
|
|
227
|
+
const title = readSignedTitle(anchorProof);
|
|
228
|
+
if (title !== undefined) {
|
|
229
|
+
const urlNumber = ETHERSCAN_BLOCK_URL.exec(title)?.[1];
|
|
230
|
+
if (urlNumber !== undefined && BigInt(urlNumber) !== headerNumber) {
|
|
231
|
+
return fail("witness-block-number-mismatch", `the anchor's signed Etherscan URL names block ${urlNumber}, but the header's number field is ${headerNumber}`, { blockNumber: String(headerNumber) });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (decoded.claimedHash.toLowerCase() !== computedHash) {
|
|
235
|
+
return fail("witness-claimed-hash-mismatch", "the witness's claimed blockHash does not equal the locally recomputed block hash", { blockNumber: String(headerNumber) });
|
|
236
|
+
}
|
|
237
|
+
// Step 6: only now, read the timestamp.
|
|
238
|
+
const timestampItem = items[HEADER_TIMESTAMP_INDEX];
|
|
239
|
+
if (timestampItem === undefined || !(timestampItem instanceof Uint8Array)) {
|
|
240
|
+
return fail("witness-header-shape", `header RLP item ${HEADER_TIMESTAMP_INDEX} (timestamp) is missing or not a byte string`, { blockNumber: String(headerNumber) });
|
|
241
|
+
}
|
|
242
|
+
const timestamp = rlpBytesToBigInt(timestampItem);
|
|
243
|
+
if (timestamp > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
244
|
+
return fail("witness-header-shape", "header timestamp does not fit a safe integer", { blockNumber: String(headerNumber) });
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
...base,
|
|
248
|
+
verified: true,
|
|
249
|
+
blockNumber: String(headerNumber),
|
|
250
|
+
timestamp: Number(timestamp),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// ---------------------------------------------------------------------------
|
|
254
|
+
// Helpers
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
function readSignedMessage(proof) {
|
|
257
|
+
return readAttribution(proof, "message");
|
|
258
|
+
}
|
|
259
|
+
function readSignedTitle(proof) {
|
|
260
|
+
return readAttribution(proof, "title");
|
|
261
|
+
}
|
|
262
|
+
function readAttribution(proof, field) {
|
|
263
|
+
const attribution = proof.proof["attribution"];
|
|
264
|
+
if (attribution === null || typeof attribution !== "object" || Array.isArray(attribution)) {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
const value = attribution[field];
|
|
268
|
+
return typeof value === "string" ? value : undefined;
|
|
269
|
+
}
|
|
270
|
+
function readDigestB64(proof) {
|
|
271
|
+
const artifact = proof.proof["artifact"];
|
|
272
|
+
if (artifact === null || typeof artifact !== "object" || Array.isArray(artifact)) {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
const value = artifact["digestB64"];
|
|
276
|
+
return typeof value === "string" ? value : undefined;
|
|
277
|
+
}
|
|
278
|
+
/** Strict standard base64 of exactly 32 bytes (spec 6.3 rules), or null. */
|
|
279
|
+
function strictBase64Decode32(value) {
|
|
280
|
+
if (value === undefined || value.length === 0)
|
|
281
|
+
return null;
|
|
282
|
+
const decoded = Buffer.from(value, "base64");
|
|
283
|
+
if (decoded.length !== 32 || decoded.toString("base64") !== value)
|
|
284
|
+
return null;
|
|
285
|
+
return new Uint8Array(decoded);
|
|
286
|
+
}
|
|
287
|
+
function bytesEqual(a, b) {
|
|
288
|
+
if (a.length !== b.length)
|
|
289
|
+
return false;
|
|
290
|
+
let diff = 0;
|
|
291
|
+
for (let i = 0; i < a.length; i++)
|
|
292
|
+
diff |= a[i] ^ b[i];
|
|
293
|
+
return diff === 0;
|
|
294
|
+
}
|
|
295
|
+
function toFinding(outcome) {
|
|
296
|
+
return {
|
|
297
|
+
code: outcome.reason,
|
|
298
|
+
path: outcome.witnessPath,
|
|
299
|
+
message: `anchor witness rejected: ${outcome.detail ?? "verification failed"}. The witness confers nothing; the anchor proof's own standing is unchanged.`,
|
|
300
|
+
details: {
|
|
301
|
+
...(outcome.anchorProofHash !== undefined ? { anchorProofHash: outcome.anchorProofHash } : {}),
|
|
302
|
+
...(outcome.computedBlockHash !== undefined
|
|
303
|
+
? { computedBlockHash: outcome.computedBlockHash }
|
|
304
|
+
: {}),
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=witness.js.map
|