@mikeargento/bitgraph 1.9.1 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/README.md +21 -21
  2. package/dist/fuse-cli.js +2 -2
  3. package/dist/fuse-cli.js.map +1 -1
  4. package/dist/fuse.d.ts +15 -1
  5. package/dist/fuse.d.ts.map +1 -1
  6. package/dist/fuse.js +29 -12
  7. package/dist/fuse.js.map +1 -1
  8. package/package.json +12 -8
  9. package/src/fuse-cli.ts +2 -2
  10. package/src/fuse.ts +46 -13
  11. package/dist/__tests__/audit-anchors.test.d.ts +0 -2
  12. package/dist/__tests__/audit-anchors.test.d.ts.map +0 -1
  13. package/dist/__tests__/audit-anchors.test.js +0 -152
  14. package/dist/__tests__/audit-anchors.test.js.map +0 -1
  15. package/dist/__tests__/audit-anomalies.test.d.ts +0 -2
  16. package/dist/__tests__/audit-anomalies.test.d.ts.map +0 -1
  17. package/dist/__tests__/audit-anomalies.test.js +0 -663
  18. package/dist/__tests__/audit-anomalies.test.js.map +0 -1
  19. package/dist/__tests__/audit-attestation.test.d.ts +0 -2
  20. package/dist/__tests__/audit-attestation.test.d.ts.map +0 -1
  21. package/dist/__tests__/audit-attestation.test.js +0 -403
  22. package/dist/__tests__/audit-attestation.test.js.map +0 -1
  23. package/dist/__tests__/audit-bench-smoke.test.d.ts +0 -2
  24. package/dist/__tests__/audit-bench-smoke.test.d.ts.map +0 -1
  25. package/dist/__tests__/audit-bench-smoke.test.js +0 -87
  26. package/dist/__tests__/audit-bench-smoke.test.js.map +0 -1
  27. package/dist/__tests__/audit-boundary.test.d.ts +0 -20
  28. package/dist/__tests__/audit-boundary.test.d.ts.map +0 -1
  29. package/dist/__tests__/audit-boundary.test.js +0 -84
  30. package/dist/__tests__/audit-boundary.test.js.map +0 -1
  31. package/dist/__tests__/audit-cli.test.d.ts +0 -2
  32. package/dist/__tests__/audit-cli.test.d.ts.map +0 -1
  33. package/dist/__tests__/audit-cli.test.js +0 -239
  34. package/dist/__tests__/audit-cli.test.js.map +0 -1
  35. package/dist/__tests__/audit-dependencies.test.d.ts +0 -2
  36. package/dist/__tests__/audit-dependencies.test.d.ts.map +0 -1
  37. package/dist/__tests__/audit-dependencies.test.js +0 -116
  38. package/dist/__tests__/audit-dependencies.test.js.map +0 -1
  39. package/dist/__tests__/audit-fixtures.d.ts +0 -265
  40. package/dist/__tests__/audit-fixtures.d.ts.map +0 -1
  41. package/dist/__tests__/audit-fixtures.js +0 -511
  42. package/dist/__tests__/audit-fixtures.js.map +0 -1
  43. package/dist/__tests__/audit-ingest.test.d.ts +0 -2
  44. package/dist/__tests__/audit-ingest.test.d.ts.map +0 -1
  45. package/dist/__tests__/audit-ingest.test.js +0 -473
  46. package/dist/__tests__/audit-ingest.test.js.map +0 -1
  47. package/dist/__tests__/audit-memory-ingest.test.d.ts +0 -12
  48. package/dist/__tests__/audit-memory-ingest.test.d.ts.map +0 -1
  49. package/dist/__tests__/audit-memory-ingest.test.js +0 -135
  50. package/dist/__tests__/audit-memory-ingest.test.js.map +0 -1
  51. package/dist/__tests__/audit-property.test.d.ts +0 -2
  52. package/dist/__tests__/audit-property.test.d.ts.map +0 -1
  53. package/dist/__tests__/audit-property.test.js +0 -771
  54. package/dist/__tests__/audit-property.test.js.map +0 -1
  55. package/dist/__tests__/audit-real-fixtures.test.d.ts +0 -2
  56. package/dist/__tests__/audit-real-fixtures.test.d.ts.map +0 -1
  57. package/dist/__tests__/audit-real-fixtures.test.js +0 -132
  58. package/dist/__tests__/audit-real-fixtures.test.js.map +0 -1
  59. package/dist/__tests__/audit-real-live.test.d.ts +0 -2
  60. package/dist/__tests__/audit-real-live.test.d.ts.map +0 -1
  61. package/dist/__tests__/audit-real-live.test.js +0 -107
  62. package/dist/__tests__/audit-real-live.test.js.map +0 -1
  63. package/dist/__tests__/audit-reconstruct.test.d.ts +0 -2
  64. package/dist/__tests__/audit-reconstruct.test.d.ts.map +0 -1
  65. package/dist/__tests__/audit-reconstruct.test.js +0 -287
  66. package/dist/__tests__/audit-reconstruct.test.js.map +0 -1
  67. package/dist/__tests__/audit-report.test.d.ts +0 -2
  68. package/dist/__tests__/audit-report.test.d.ts.map +0 -1
  69. package/dist/__tests__/audit-report.test.js +0 -186
  70. package/dist/__tests__/audit-report.test.js.map +0 -1
  71. package/dist/__tests__/audit-roundtrip.test.d.ts +0 -2
  72. package/dist/__tests__/audit-roundtrip.test.d.ts.map +0 -1
  73. package/dist/__tests__/audit-roundtrip.test.js +0 -368
  74. package/dist/__tests__/audit-roundtrip.test.js.map +0 -1
  75. package/dist/__tests__/audit-temporal.test.d.ts +0 -2
  76. package/dist/__tests__/audit-temporal.test.d.ts.map +0 -1
  77. package/dist/__tests__/audit-temporal.test.js +0 -364
  78. package/dist/__tests__/audit-temporal.test.js.map +0 -1
  79. package/dist/__tests__/audit-tiers.test.d.ts +0 -2
  80. package/dist/__tests__/audit-tiers.test.d.ts.map +0 -1
  81. package/dist/__tests__/audit-tiers.test.js +0 -282
  82. package/dist/__tests__/audit-tiers.test.js.map +0 -1
  83. package/dist/__tests__/audit-witness-real.test.d.ts +0 -19
  84. package/dist/__tests__/audit-witness-real.test.d.ts.map +0 -1
  85. package/dist/__tests__/audit-witness-real.test.js +0 -82
  86. package/dist/__tests__/audit-witness-real.test.js.map +0 -1
  87. package/dist/__tests__/audit-witness.test.d.ts +0 -2
  88. package/dist/__tests__/audit-witness.test.d.ts.map +0 -1
  89. package/dist/__tests__/audit-witness.test.js +0 -308
  90. package/dist/__tests__/audit-witness.test.js.map +0 -1
  91. package/dist/__tests__/canonical.test.d.ts +0 -2
  92. package/dist/__tests__/canonical.test.d.ts.map +0 -1
  93. package/dist/__tests__/canonical.test.js +0 -162
  94. package/dist/__tests__/canonical.test.js.map +0 -1
  95. package/dist/__tests__/chain-hash-anchor.test.d.ts +0 -22
  96. package/dist/__tests__/chain-hash-anchor.test.d.ts.map +0 -1
  97. package/dist/__tests__/chain-hash-anchor.test.js +0 -55
  98. package/dist/__tests__/chain-hash-anchor.test.js.map +0 -1
  99. package/dist/__tests__/commit-service.integration.test.d.ts +0 -2
  100. package/dist/__tests__/commit-service.integration.test.d.ts.map +0 -1
  101. package/dist/__tests__/commit-service.integration.test.js +0 -95
  102. package/dist/__tests__/commit-service.integration.test.js.map +0 -1
  103. package/dist/__tests__/constructor.test.d.ts +0 -2
  104. package/dist/__tests__/constructor.test.d.ts.map +0 -1
  105. package/dist/__tests__/constructor.test.js +0 -267
  106. package/dist/__tests__/constructor.test.js.map +0 -1
  107. package/dist/__tests__/declared-proof-fixture.d.ts +0 -66
  108. package/dist/__tests__/declared-proof-fixture.d.ts.map +0 -1
  109. package/dist/__tests__/declared-proof-fixture.js +0 -66
  110. package/dist/__tests__/declared-proof-fixture.js.map +0 -1
  111. package/dist/__tests__/fuse-inline.test.d.ts +0 -2
  112. package/dist/__tests__/fuse-inline.test.d.ts.map +0 -1
  113. package/dist/__tests__/fuse-inline.test.js +0 -181
  114. package/dist/__tests__/fuse-inline.test.js.map +0 -1
  115. package/dist/__tests__/fuse-placement.test.d.ts +0 -2
  116. package/dist/__tests__/fuse-placement.test.d.ts.map +0 -1
  117. package/dist/__tests__/fuse-placement.test.js +0 -31
  118. package/dist/__tests__/fuse-placement.test.js.map +0 -1
  119. package/dist/__tests__/fuse-roundtrip.test.d.ts +0 -2
  120. package/dist/__tests__/fuse-roundtrip.test.d.ts.map +0 -1
  121. package/dist/__tests__/fuse-roundtrip.test.js +0 -241
  122. package/dist/__tests__/fuse-roundtrip.test.js.map +0 -1
  123. package/dist/__tests__/fuse-sdk.test.d.ts +0 -2
  124. package/dist/__tests__/fuse-sdk.test.d.ts.map +0 -1
  125. package/dist/__tests__/fuse-sdk.test.js +0 -117
  126. package/dist/__tests__/fuse-sdk.test.js.map +0 -1
  127. package/dist/__tests__/fuse-set-sdk.test.d.ts +0 -2
  128. package/dist/__tests__/fuse-set-sdk.test.d.ts.map +0 -1
  129. package/dist/__tests__/fuse-set-sdk.test.js +0 -721
  130. package/dist/__tests__/fuse-set-sdk.test.js.map +0 -1
  131. package/dist/__tests__/fuse-set.test.d.ts +0 -2
  132. package/dist/__tests__/fuse-set.test.d.ts.map +0 -1
  133. package/dist/__tests__/fuse-set.test.js +0 -889
  134. package/dist/__tests__/fuse-set.test.js.map +0 -1
  135. package/dist/__tests__/fuse-set2.test.d.ts +0 -2
  136. package/dist/__tests__/fuse-set2.test.d.ts.map +0 -1
  137. package/dist/__tests__/fuse-set2.test.js +0 -294
  138. package/dist/__tests__/fuse-set2.test.js.map +0 -1
  139. package/dist/__tests__/fuse-vectors.test.d.ts +0 -2
  140. package/dist/__tests__/fuse-vectors.test.d.ts.map +0 -1
  141. package/dist/__tests__/fuse-vectors.test.js +0 -175
  142. package/dist/__tests__/fuse-vectors.test.js.map +0 -1
  143. package/dist/__tests__/fuse-verify.test.d.ts +0 -2
  144. package/dist/__tests__/fuse-verify.test.d.ts.map +0 -1
  145. package/dist/__tests__/fuse-verify.test.js +0 -250
  146. package/dist/__tests__/fuse-verify.test.js.map +0 -1
  147. package/dist/__tests__/hello-world.test.d.ts +0 -2
  148. package/dist/__tests__/hello-world.test.d.ts.map +0 -1
  149. package/dist/__tests__/hello-world.test.js +0 -9
  150. package/dist/__tests__/hello-world.test.js.map +0 -1
  151. package/dist/__tests__/mock-proof-fixture.d.ts +0 -15
  152. package/dist/__tests__/mock-proof-fixture.d.ts.map +0 -1
  153. package/dist/__tests__/mock-proof-fixture.js +0 -34
  154. package/dist/__tests__/mock-proof-fixture.js.map +0 -1
  155. package/dist/__tests__/policy-enforcement.test.d.ts +0 -2
  156. package/dist/__tests__/policy-enforcement.test.d.ts.map +0 -1
  157. package/dist/__tests__/policy-enforcement.test.js +0 -188
  158. package/dist/__tests__/policy-enforcement.test.js.map +0 -1
  159. package/dist/__tests__/proof-hash-regression.test.d.ts +0 -2
  160. package/dist/__tests__/proof-hash-regression.test.d.ts.map +0 -1
  161. package/dist/__tests__/proof-hash-regression.test.js +0 -95
  162. package/dist/__tests__/proof-hash-regression.test.js.map +0 -1
  163. package/dist/__tests__/proof-hash.test.d.ts +0 -2
  164. package/dist/__tests__/proof-hash.test.d.ts.map +0 -1
  165. package/dist/__tests__/proof-hash.test.js +0 -116
  166. package/dist/__tests__/proof-hash.test.js.map +0 -1
  167. package/dist/__tests__/proof-integrity.test.d.ts +0 -2
  168. package/dist/__tests__/proof-integrity.test.d.ts.map +0 -1
  169. package/dist/__tests__/proof-integrity.test.js +0 -454
  170. package/dist/__tests__/proof-integrity.test.js.map +0 -1
  171. package/dist/__tests__/realistic-proof-fixture.d.ts +0 -56
  172. package/dist/__tests__/realistic-proof-fixture.d.ts.map +0 -1
  173. package/dist/__tests__/realistic-proof-fixture.js +0 -57
  174. package/dist/__tests__/realistic-proof-fixture.js.map +0 -1
  175. package/dist/__tests__/run.test.d.ts +0 -2
  176. package/dist/__tests__/run.test.d.ts.map +0 -1
  177. package/dist/__tests__/run.test.js +0 -178
  178. package/dist/__tests__/run.test.js.map +0 -1
  179. package/dist/__tests__/verifier.test.d.ts +0 -2
  180. package/dist/__tests__/verifier.test.d.ts.map +0 -1
  181. package/dist/__tests__/verifier.test.js +0 -531
  182. package/dist/__tests__/verifier.test.js.map +0 -1
  183. package/dist/canonical.d.ts +0 -54
  184. package/dist/canonical.d.ts.map +0 -1
  185. package/dist/canonical.js +0 -119
  186. package/dist/canonical.js.map +0 -1
  187. package/dist/proof-hash.d.ts +0 -9
  188. package/dist/proof-hash.d.ts.map +0 -1
  189. package/dist/proof-hash.js +0 -75
  190. package/dist/proof-hash.js.map +0 -1
  191. package/dist/types.d.ts +0 -705
  192. package/dist/types.d.ts.map +0 -1
  193. package/dist/types.js +0 -3
  194. package/dist/types.js.map +0 -1
  195. package/dist/verifier.d.ts +0 -27
  196. package/dist/verifier.d.ts.map +0 -1
  197. package/dist/verifier.js +0 -844
  198. package/dist/verifier.js.map +0 -1
  199. package/src/__tests__/audit-anchors.test.ts +0 -188
  200. package/src/__tests__/audit-anomalies.test.ts +0 -815
  201. package/src/__tests__/audit-attestation.test.ts +0 -529
  202. package/src/__tests__/audit-bench-smoke.test.ts +0 -108
  203. package/src/__tests__/audit-boundary.test.ts +0 -96
  204. package/src/__tests__/audit-cli.test.ts +0 -288
  205. package/src/__tests__/audit-dependencies.test.ts +0 -141
  206. package/src/__tests__/audit-fixtures.ts +0 -736
  207. package/src/__tests__/audit-ingest.test.ts +0 -575
  208. package/src/__tests__/audit-memory-ingest.test.ts +0 -156
  209. package/src/__tests__/audit-property.test.ts +0 -892
  210. package/src/__tests__/audit-real-fixtures.test.ts +0 -153
  211. package/src/__tests__/audit-real-live.test.ts +0 -128
  212. package/src/__tests__/audit-reconstruct.test.ts +0 -353
  213. package/src/__tests__/audit-report.test.ts +0 -222
  214. package/src/__tests__/audit-roundtrip.test.ts +0 -464
  215. package/src/__tests__/audit-temporal.test.ts +0 -446
  216. package/src/__tests__/audit-tiers.test.ts +0 -343
  217. package/src/__tests__/audit-witness-real.test.ts +0 -92
  218. package/src/__tests__/audit-witness.test.ts +0 -345
  219. package/src/__tests__/canonical.test.ts +0 -253
  220. package/src/__tests__/chain-hash-anchor.test.ts +0 -67
  221. package/src/__tests__/commit-service.integration.test.ts +0 -117
  222. package/src/__tests__/constructor.test.ts +0 -340
  223. package/src/__tests__/declared-proof-fixture.ts +0 -65
  224. package/src/__tests__/fuse-inline.test.ts +0 -211
  225. package/src/__tests__/fuse-placement.test.ts +0 -32
  226. package/src/__tests__/fuse-roundtrip.test.ts +0 -243
  227. package/src/__tests__/fuse-sdk.test.ts +0 -142
  228. package/src/__tests__/fuse-set-sdk.test.ts +0 -852
  229. package/src/__tests__/fuse-set.test.ts +0 -1027
  230. package/src/__tests__/fuse-set2.test.ts +0 -343
  231. package/src/__tests__/fuse-vectors.test.ts +0 -218
  232. package/src/__tests__/fuse-verify.test.ts +0 -278
  233. package/src/__tests__/hello-world.test.ts +0 -10
  234. package/src/__tests__/mock-proof-fixture.ts +0 -36
  235. package/src/__tests__/policy-enforcement.test.ts +0 -226
  236. package/src/__tests__/proof-hash-regression.test.ts +0 -107
  237. package/src/__tests__/proof-hash.test.ts +0 -129
  238. package/src/__tests__/proof-integrity.test.ts +0 -576
  239. package/src/__tests__/real-fixtures/anchor-after-112762.json +0 -47
  240. package/src/__tests__/real-fixtures/anchor-with-ethereum-112758.json +0 -47
  241. package/src/__tests__/real-fixtures/live-proof-0.json +0 -42
  242. package/src/__tests__/real-fixtures/live-proof-1.json +0 -43
  243. package/src/__tests__/real-fixtures/live-proof-2.json +0 -43
  244. package/src/__tests__/real-fixtures/successor-112760.json +0 -38
  245. package/src/__tests__/real-fixtures/witness-25525146.json +0 -6
  246. package/src/__tests__/real-fixtures/witness-25525147.json +0 -6
  247. package/src/__tests__/realistic-proof-fixture.ts +0 -57
  248. package/src/__tests__/verifier.test.ts +0 -624
@@ -1,282 +0,0 @@
1
- // Copyright (c) Argento Computing Inc. All rights reserved. See LICENSE.
2
- /**
3
- * Tests for @mikeargento/bitgraph-audit verification tiers: full
4
- * verification when artifact bytes are present (canonical verify()),
5
- * bytes-free integrity when they are absent (verifyProofIntegrity()),
6
- * exact failure reasons, VerificationPolicy passthrough, and per-run
7
- * epoch link state reset.
8
- */
9
- import { describe, test, before, after } from "node:test";
10
- import * as assert from "node:assert/strict";
11
- import { rm, writeFile } from "node:fs/promises";
12
- import { join } from "node:path";
13
- import { computeProofHash } from "@mikeargento/bitgraph-verify";
14
- import { ingestBundle, verifyObservedProofs } from "@mikeargento/bitgraph-audit";
15
- import { b64, makeChainIdProof, makeConstructorProof, makeEpochLinkProof, makeTar, makeTempDir, proofJson, utf8, writeBundleDir, } from "./audit-fixtures.js";
16
- import { sha256 } from "@noble/hashes/sha256";
17
- const tempDirs = [];
18
- async function newBundleDir() {
19
- const dir = await makeTempDir("bitgraph-audit-tiers-");
20
- tempDirs.push(dir);
21
- return dir;
22
- }
23
- after(async () => {
24
- for (const dir of tempDirs) {
25
- await rm(dir, { recursive: true, force: true });
26
- }
27
- });
28
- let fxProof;
29
- let fxBytes;
30
- let fxHash;
31
- before(async () => {
32
- const made = await makeConstructorProof();
33
- fxProof = made.proof;
34
- fxBytes = made.bytes;
35
- fxHash = computeProofHash(fxProof);
36
- });
37
- function clone(proof) {
38
- return JSON.parse(JSON.stringify(proof));
39
- }
40
- // ---------------------------------------------------------------------------
41
- // Tier routing
42
- // ---------------------------------------------------------------------------
43
- describe("audit tiers: artifact present", () => {
44
- test("full verification through canonical verify(), status verified", async () => {
45
- const dir = await newBundleDir();
46
- await writeBundleDir(dir, {
47
- "proofs/p.json": proofJson(fxProof),
48
- "media/original.bin": fxBytes,
49
- });
50
- const ingest = await ingestBundle(dir);
51
- const summary = await verifyObservedProofs(ingest);
52
- assert.deepEqual(summary, {
53
- total: 1,
54
- verified: 1,
55
- failed: 0,
56
- artifactUnavailable: 0,
57
- chainless: 1,
58
- });
59
- const verification = ingest.proofs[0].verification;
60
- assert.equal(verification.tier, "full");
61
- assert.equal(verification.status, "verified");
62
- assert.equal(verification.artifactPath, "media/original.bin");
63
- assert.equal(verification.reason, undefined);
64
- });
65
- test("tampered signature fails at the full tier with the verifier's exact reason", async () => {
66
- const tampered = clone(fxProof);
67
- const sigBytes = Buffer.from(tampered.signer.signatureB64, "base64");
68
- sigBytes[0] = (sigBytes[0] + 1) % 256;
69
- tampered.signer.signatureB64 = sigBytes.toString("base64");
70
- const dir = await newBundleDir();
71
- await writeBundleDir(dir, {
72
- "proofs/p.json": proofJson(tampered),
73
- "media/original.bin": fxBytes,
74
- });
75
- const ingest = await ingestBundle(dir);
76
- const summary = await verifyObservedProofs(ingest);
77
- assert.equal(summary.failed, 1);
78
- const verification = ingest.proofs[0].verification;
79
- assert.equal(verification.tier, "full");
80
- assert.equal(verification.status, "failed");
81
- assert.equal(verification.reason, "signature verification failed: signature does not match");
82
- });
83
- test("full verification works through a tar container (bytes re-streamed)", async () => {
84
- const dir = await newBundleDir();
85
- const tar = makeTar([
86
- { name: "proofs/p.json", content: proofJson(fxProof) },
87
- { name: "media/original.bin", content: fxBytes },
88
- ]);
89
- const tarPath = join(dir, "bundle.tar");
90
- await writeFile(tarPath, tar);
91
- const ingest = await ingestBundle(tarPath);
92
- const summary = await verifyObservedProofs(ingest);
93
- assert.equal(summary.verified, 1);
94
- assert.equal(ingest.proofs[0].verification.tier, "full");
95
- });
96
- test("a proof with a signed chainId verifies fully (unknown-field tolerance end to end)", async () => {
97
- const made = await makeChainIdProof({ chainId: "bitgraph:main", counter: "2", epochId: "epoch-c" });
98
- const dir = await newBundleDir();
99
- await writeBundleDir(dir, {
100
- "p.json": proofJson(made.proof),
101
- "artifact.bin": made.bytes,
102
- });
103
- const ingest = await ingestBundle(dir);
104
- const summary = await verifyObservedProofs(ingest);
105
- assert.equal(summary.verified, 1);
106
- assert.equal(ingest.proofs[0].chainId, "bitgraph:main");
107
- });
108
- });
109
- describe("audit tiers: artifact absent", () => {
110
- test("integrity tier records artifact-unavailable, never verified", async () => {
111
- const dir = await newBundleDir();
112
- await writeBundleDir(dir, {
113
- "proofs/p.json": proofJson(fxProof),
114
- });
115
- const ingest = await ingestBundle(dir);
116
- const summary = await verifyObservedProofs(ingest);
117
- assert.deepEqual(summary, {
118
- total: 1,
119
- verified: 0,
120
- failed: 0,
121
- artifactUnavailable: 1,
122
- chainless: 1,
123
- });
124
- const verification = ingest.proofs[0].verification;
125
- assert.equal(verification.tier, "integrity");
126
- assert.equal(verification.status, "artifact-unavailable");
127
- assert.equal(verification.artifactPath, undefined);
128
- });
129
- test("a decoy file named like the artifact does not bind (matching is content-addressed)", async () => {
130
- const dir = await newBundleDir();
131
- await writeBundleDir(dir, {
132
- "proofs/p.json": proofJson(fxProof),
133
- // Named to look like the artifact, but the bytes hash differently.
134
- "artifacts/original.bin": utf8("not the committed bytes"),
135
- });
136
- const ingest = await ingestBundle(dir);
137
- const summary = await verifyObservedProofs(ingest);
138
- assert.equal(summary.artifactUnavailable, 1);
139
- assert.equal(summary.verified, 0);
140
- assert.equal(ingest.proofs[0].verification.tier, "integrity");
141
- });
142
- test("a corrupted artifact digest fails integrity with the verifier's exact reason", async () => {
143
- // Flip the committed digest to some other 32-byte value. Content
144
- // addressing then finds no artifact (the original bytes no longer
145
- // match), and the signature check fails because the digest sits
146
- // inside the signed body.
147
- const corrupted = clone(fxProof);
148
- corrupted.artifact.digestB64 = b64(sha256(utf8("some other content")));
149
- const dir = await newBundleDir();
150
- await writeBundleDir(dir, {
151
- "proofs/p.json": proofJson(corrupted),
152
- "media/original.bin": fxBytes,
153
- });
154
- const ingest = await ingestBundle(dir);
155
- const summary = await verifyObservedProofs(ingest);
156
- assert.equal(summary.failed, 1);
157
- assert.equal(summary.verified, 0);
158
- const verification = ingest.proofs[0].verification;
159
- assert.equal(verification.tier, "integrity");
160
- assert.equal(verification.status, "failed");
161
- assert.equal(verification.reason, "signature verification failed: signature does not match");
162
- // The genuine artifact bytes did not bind to the corrupted digest.
163
- assert.equal(ingest.artifacts.find((a) => a.paths.includes("media/original.bin")).matchedProofHashes.length, 0);
164
- });
165
- });
166
- // ---------------------------------------------------------------------------
167
- // Deduplication and exclusion interplay
168
- // ---------------------------------------------------------------------------
169
- describe("audit tiers: unique verification", () => {
170
- test("semantic duplicates are verified once, as one observed proof", async () => {
171
- const dir = await newBundleDir();
172
- await writeBundleDir(dir, {
173
- "compact.json": JSON.stringify(fxProof),
174
- "pretty.json": JSON.stringify(fxProof, null, 2),
175
- "media/original.bin": fxBytes,
176
- });
177
- const ingest = await ingestBundle(dir);
178
- const summary = await verifyObservedProofs(ingest);
179
- assert.equal(summary.total, 1);
180
- assert.equal(summary.verified, 1);
181
- assert.equal(ingest.proofs[0].sources.length, 2);
182
- });
183
- test("unsupported-version files are excluded from verification entirely", async () => {
184
- const dir = await newBundleDir();
185
- await writeBundleDir(dir, {
186
- "legacy.json": JSON.stringify({
187
- version: "occ/1",
188
- artifact: { hashAlg: "sha256", digestB64: b64(sha256(fxBytes)) },
189
- commit: { nonceB64: "AAAA" },
190
- signer: { publicKeyB64: "AAAA", signatureB64: "AAAA" },
191
- }),
192
- "good.json": proofJson(fxProof),
193
- });
194
- const ingest = await ingestBundle(dir);
195
- const summary = await verifyObservedProofs(ingest);
196
- assert.equal(summary.total, 1);
197
- assert.equal(ingest.counts.unsupportedVersion, 1);
198
- });
199
- });
200
- // ---------------------------------------------------------------------------
201
- // Policy passthrough
202
- // ---------------------------------------------------------------------------
203
- describe("audit tiers: VerificationPolicy passthrough", () => {
204
- test("trustAnchors constraints are applied by the canonical verifier", async () => {
205
- const dir = await newBundleDir();
206
- await writeBundleDir(dir, {
207
- "proofs/p.json": proofJson(fxProof),
208
- "media/original.bin": fxBytes,
209
- });
210
- const ingest = await ingestBundle(dir);
211
- const summary = await verifyObservedProofs(ingest, {
212
- trustAnchors: { allowedMeasurements: ["some-other-measurement"] },
213
- });
214
- assert.equal(summary.failed, 1);
215
- const verification = ingest.proofs[0].verification;
216
- assert.equal(verification.status, "failed");
217
- assert.match(verification.reason ?? "", /is not in the allowed set/);
218
- });
219
- test("a satisfied policy leaves the proof verified", async () => {
220
- const dir = await newBundleDir();
221
- await writeBundleDir(dir, {
222
- "proofs/p.json": proofJson(fxProof),
223
- "media/original.bin": fxBytes,
224
- });
225
- const ingest = await ingestBundle(dir);
226
- const summary = await verifyObservedProofs(ingest, {
227
- trustAnchors: { allowedMeasurements: [fxProof.environment.measurement] },
228
- });
229
- assert.equal(summary.verified, 1);
230
- });
231
- });
232
- // ---------------------------------------------------------------------------
233
- // Epoch link state
234
- // ---------------------------------------------------------------------------
235
- describe("audit tiers: epoch link state", () => {
236
- const predecessor = {
237
- prevEpochId: "epoch-predecessor",
238
- prevCounter: "42",
239
- prevProofHashB64: b64(sha256(utf8("terminal-proof-of-predecessor"))),
240
- };
241
- test("within one run, a second consumption of the same predecessor is a detected fork", async () => {
242
- const first = await makeEpochLinkProof({ ...predecessor, toEpochId: "epoch-successor-a" });
243
- const second = await makeEpochLinkProof({ ...predecessor, toEpochId: "epoch-successor-b" });
244
- const dir = await newBundleDir();
245
- // Observation order is deterministic (sorted directory walk):
246
- // a-genesis before b-genesis.
247
- await writeBundleDir(dir, {
248
- "a-genesis.json": proofJson(first.proof),
249
- "b-genesis.json": proofJson(second.proof),
250
- });
251
- const ingest = await ingestBundle(dir);
252
- const summary = await verifyObservedProofs(ingest);
253
- assert.equal(summary.total, 2);
254
- assert.equal(summary.artifactUnavailable, 1);
255
- assert.equal(summary.failed, 1);
256
- const a = ingest.proofs.find((p) => p.sources[0].path === "a-genesis.json");
257
- const b = ingest.proofs.find((p) => p.sources[0].path === "b-genesis.json");
258
- assert.equal(a.verification.status, "artifact-unavailable");
259
- assert.equal(b.verification.status, "failed");
260
- assert.match(b.verification.reason ?? "", /FORK DETECTED/);
261
- assert.equal(a.hasEpochLink, true);
262
- });
263
- test("state is reset per run: a fresh audit is not poisoned by a previous one", async () => {
264
- const runOne = await makeEpochLinkProof({ ...predecessor, toEpochId: "epoch-successor-x" });
265
- const dirOne = await newBundleDir();
266
- await writeBundleDir(dirOne, { "genesis-x.json": proofJson(runOne.proof) });
267
- const ingestOne = await ingestBundle(dirOne);
268
- const summaryOne = await verifyObservedProofs(ingestOne);
269
- assert.equal(summaryOne.failed, 0);
270
- // A different successor consumes the same predecessor in a separate
271
- // bundle. Within one run that would be a fork; across runs the state
272
- // must have been reset, so this verifies cleanly.
273
- const runTwo = await makeEpochLinkProof({ ...predecessor, toEpochId: "epoch-successor-y" });
274
- const dirTwo = await newBundleDir();
275
- await writeBundleDir(dirTwo, { "genesis-y.json": proofJson(runTwo.proof) });
276
- const ingestTwo = await ingestBundle(dirTwo);
277
- const summaryTwo = await verifyObservedProofs(ingestTwo);
278
- assert.equal(summaryTwo.failed, 0);
279
- assert.equal(summaryTwo.artifactUnavailable, 1);
280
- });
281
- });
282
- //# sourceMappingURL=audit-tiers.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-tiers.test.js","sourceRoot":"","sources":["../../src/__tests__/audit-tiers.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * End-to-end: block-header witnesses produced by the exporter make an anchor's
3
- * Ethereum time claim verifiable FULLY OFFLINE, and the audit accepts them.
4
- *
5
- * The two witness fixtures were produced by the same header-RLP encoder the
6
- * website export uses (website/src/lib/eth-header.ts), for the two real
7
- * Ethereum blocks the whitepaper bundle's anchors signed: 25525146 (the before
8
- * anchor, block of commit 112758) and 25525147 (the after anchor, block of
9
- * commit 112762). Each was self-checked at generation time: keccak256(headerRlp)
10
- * equals the block hash.
11
- *
12
- * This test bundles the three real proofs plus the two witnesses and confirms
13
- * the audit's zero-network witness procedure verifies both, so the exporter's
14
- * output and the verifier's expectations actually meet. Before this feature the
15
- * anchors carried a block hash but no header, so the timestamp could only be
16
- * resolved online; now the bundle stands alone.
17
- */
18
- export {};
19
- //# sourceMappingURL=audit-witness-real.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-witness-real.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audit-witness-real.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,82 +0,0 @@
1
- /**
2
- * End-to-end: block-header witnesses produced by the exporter make an anchor's
3
- * Ethereum time claim verifiable FULLY OFFLINE, and the audit accepts them.
4
- *
5
- * The two witness fixtures were produced by the same header-RLP encoder the
6
- * website export uses (website/src/lib/eth-header.ts), for the two real
7
- * Ethereum blocks the whitepaper bundle's anchors signed: 25525146 (the before
8
- * anchor, block of commit 112758) and 25525147 (the after anchor, block of
9
- * commit 112762). Each was self-checked at generation time: keccak256(headerRlp)
10
- * equals the block hash.
11
- *
12
- * This test bundles the three real proofs plus the two witnesses and confirms
13
- * the audit's zero-network witness procedure verifies both, so the exporter's
14
- * output and the verifier's expectations actually meet. Before this feature the
15
- * anchors carried a block hash but no header, so the timestamp could only be
16
- * resolved online; now the bundle stands alone.
17
- */
18
- import { describe, it, before, after } from "node:test";
19
- import * as assert from "node:assert/strict";
20
- import { mkdtemp, mkdir, writeFile, rm, readFile } from "node:fs/promises";
21
- import { tmpdir } from "node:os";
22
- import { join } from "node:path";
23
- import { fileURLToPath } from "node:url";
24
- import { runAudit, buildJsonReport, computeExitFlags } from "@mikeargento/bitgraph-audit";
25
- import { computeProofHash } from "@mikeargento/bitgraph-verify";
26
- function safe(value) {
27
- return value.replace(/[^A-Za-z0-9]/g, "_");
28
- }
29
- async function fixture(name) {
30
- const url = new URL(`../../src/__tests__/real-fixtures/${name}`, import.meta.url);
31
- return JSON.parse(await readFile(fileURLToPath(url), "utf8"));
32
- }
33
- describe("audit: real block-header witnesses verify offline", () => {
34
- let dir;
35
- let result;
36
- before(async () => {
37
- const proofs = await Promise.all([
38
- fixture("anchor-with-ethereum-112758.json"),
39
- fixture("successor-112760.json"),
40
- fixture("anchor-after-112762.json"),
41
- ]);
42
- dir = await mkdtemp(join(tmpdir(), "bitgraph-audit-witness-"));
43
- for (const proof of proofs) {
44
- const commit = proof.commit;
45
- const epochDir = join(dir, "proofs", safe(commit.epochId));
46
- await mkdir(epochDir, { recursive: true });
47
- await writeFile(join(epochDir, `${commit.counter}-${safe(computeProofHash(proof))}.json`), JSON.stringify(proof));
48
- }
49
- // Witnesses discovered by shape; path is conventional only.
50
- const witnessDir = join(dir, "witnesses");
51
- await mkdir(witnessDir, { recursive: true });
52
- for (const block of [25525146, 25525147]) {
53
- const w = await fixture(`witness-${block}.json`);
54
- await writeFile(join(witnessDir, `${block}.json`), JSON.stringify(w));
55
- }
56
- result = await runAudit(dir);
57
- });
58
- after(async () => {
59
- if (dir !== undefined)
60
- await rm(dir, { recursive: true, force: true });
61
- });
62
- it("ingests both witnesses and verifies both against the signed anchor hashes", () => {
63
- const report = buildJsonReport(result);
64
- assert.equal(report.input.counts.witnesses, 2);
65
- assert.equal(report.summary.temporal.anchorsWithVerifiedWitness, 2);
66
- });
67
- it("lower-bounds the whitepaper's causal segment and records its following anchor", () => {
68
- const report = buildJsonReport(result);
69
- // Both bounding anchors now carry a verified offline timestamp, so the
70
- // segment holding the whitepaper commit is bracketed (upper AND lower).
71
- assert.equal(report.summary.temporal.segmentsWithFollowingAnchor, 1);
72
- assert.equal(report.summary.temporal.segmentsUnanchored, 0);
73
- });
74
- it("exits clean (code 0): witnesses only add evidence, never failure", () => {
75
- assert.deepEqual(computeExitFlags(result), {
76
- verificationFailures: false,
77
- chainAnomaliesOrDivergences: false,
78
- code: 0,
79
- });
80
- });
81
- });
82
- //# sourceMappingURL=audit-witness-real.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-witness-real.test.js","sourceRoot":"","sources":["../../src/__tests__/audit-witness-real.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAoB,MAAM,6BAA6B,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAsB,MAAM,8BAA8B,CAAC;AAEpF,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AACD,KAAK,UAAU,OAAO,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,qCAAqC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,IAAI,GAAW,CAAC;IAChB,IAAI,MAAmB,CAAC;IAExB,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/B,OAAO,CAAC,kCAAkC,CAAC;YAC3C,OAAO,CAAC,uBAAuB,CAAC;YAChC,OAAO,CAAC,0BAA0B,CAAC;SACpC,CAAC,CAAC;QAEH,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAA8C,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,MAAM,SAAS,CACb,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAiC,CAAC,CAAC,OAAO,CAAC,EACrG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CACtB,CAAC;QACJ,CAAC;QACD,4DAA4D;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC;YACjD,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE;YACzC,oBAAoB,EAAE,KAAK;YAC3B,2BAA2B,EAAE,KAAK;YAClC,IAAI,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=audit-witness.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-witness.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audit-witness.test.ts"],"names":[],"mappings":""}