@mikeargento/bitgraph 1.9.0 → 1.9.2

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 (252) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +58 -35
  3. package/dist/constructor.js +1 -1
  4. package/dist/constructor.js.map +1 -1
  5. package/dist/fuse-cli.js +1 -1
  6. package/dist/fuse-cli.js.map +1 -1
  7. package/dist/fuse.js +1 -1
  8. package/dist/fuse.js.map +1 -1
  9. package/dist/host.js +1 -1
  10. package/dist/host.js.map +1 -1
  11. package/dist/index.d.ts +2 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -2
  14. package/dist/index.js.map +1 -1
  15. package/dist/policy.js +1 -1
  16. package/dist/policy.js.map +1 -1
  17. package/package.json +23 -8
  18. package/src/constructor.ts +1 -1
  19. package/src/fuse-cli.ts +1 -1
  20. package/src/fuse.ts +1 -1
  21. package/src/host.ts +1 -1
  22. package/src/index.ts +3 -2
  23. package/src/policy.ts +1 -1
  24. package/dist/__tests__/audit-anchors.test.d.ts +0 -2
  25. package/dist/__tests__/audit-anchors.test.d.ts.map +0 -1
  26. package/dist/__tests__/audit-anchors.test.js +0 -152
  27. package/dist/__tests__/audit-anchors.test.js.map +0 -1
  28. package/dist/__tests__/audit-anomalies.test.d.ts +0 -2
  29. package/dist/__tests__/audit-anomalies.test.d.ts.map +0 -1
  30. package/dist/__tests__/audit-anomalies.test.js +0 -663
  31. package/dist/__tests__/audit-anomalies.test.js.map +0 -1
  32. package/dist/__tests__/audit-attestation.test.d.ts +0 -2
  33. package/dist/__tests__/audit-attestation.test.d.ts.map +0 -1
  34. package/dist/__tests__/audit-attestation.test.js +0 -403
  35. package/dist/__tests__/audit-attestation.test.js.map +0 -1
  36. package/dist/__tests__/audit-bench-smoke.test.d.ts +0 -2
  37. package/dist/__tests__/audit-bench-smoke.test.d.ts.map +0 -1
  38. package/dist/__tests__/audit-bench-smoke.test.js +0 -87
  39. package/dist/__tests__/audit-bench-smoke.test.js.map +0 -1
  40. package/dist/__tests__/audit-boundary.test.d.ts +0 -20
  41. package/dist/__tests__/audit-boundary.test.d.ts.map +0 -1
  42. package/dist/__tests__/audit-boundary.test.js +0 -84
  43. package/dist/__tests__/audit-boundary.test.js.map +0 -1
  44. package/dist/__tests__/audit-cli.test.d.ts +0 -2
  45. package/dist/__tests__/audit-cli.test.d.ts.map +0 -1
  46. package/dist/__tests__/audit-cli.test.js +0 -239
  47. package/dist/__tests__/audit-cli.test.js.map +0 -1
  48. package/dist/__tests__/audit-dependencies.test.d.ts +0 -2
  49. package/dist/__tests__/audit-dependencies.test.d.ts.map +0 -1
  50. package/dist/__tests__/audit-dependencies.test.js +0 -116
  51. package/dist/__tests__/audit-dependencies.test.js.map +0 -1
  52. package/dist/__tests__/audit-fixtures.d.ts +0 -265
  53. package/dist/__tests__/audit-fixtures.d.ts.map +0 -1
  54. package/dist/__tests__/audit-fixtures.js +0 -511
  55. package/dist/__tests__/audit-fixtures.js.map +0 -1
  56. package/dist/__tests__/audit-ingest.test.d.ts +0 -2
  57. package/dist/__tests__/audit-ingest.test.d.ts.map +0 -1
  58. package/dist/__tests__/audit-ingest.test.js +0 -473
  59. package/dist/__tests__/audit-ingest.test.js.map +0 -1
  60. package/dist/__tests__/audit-memory-ingest.test.d.ts +0 -12
  61. package/dist/__tests__/audit-memory-ingest.test.d.ts.map +0 -1
  62. package/dist/__tests__/audit-memory-ingest.test.js +0 -135
  63. package/dist/__tests__/audit-memory-ingest.test.js.map +0 -1
  64. package/dist/__tests__/audit-property.test.d.ts +0 -2
  65. package/dist/__tests__/audit-property.test.d.ts.map +0 -1
  66. package/dist/__tests__/audit-property.test.js +0 -771
  67. package/dist/__tests__/audit-property.test.js.map +0 -1
  68. package/dist/__tests__/audit-real-fixtures.test.d.ts +0 -2
  69. package/dist/__tests__/audit-real-fixtures.test.d.ts.map +0 -1
  70. package/dist/__tests__/audit-real-fixtures.test.js +0 -132
  71. package/dist/__tests__/audit-real-fixtures.test.js.map +0 -1
  72. package/dist/__tests__/audit-real-live.test.d.ts +0 -2
  73. package/dist/__tests__/audit-real-live.test.d.ts.map +0 -1
  74. package/dist/__tests__/audit-real-live.test.js +0 -107
  75. package/dist/__tests__/audit-real-live.test.js.map +0 -1
  76. package/dist/__tests__/audit-reconstruct.test.d.ts +0 -2
  77. package/dist/__tests__/audit-reconstruct.test.d.ts.map +0 -1
  78. package/dist/__tests__/audit-reconstruct.test.js +0 -287
  79. package/dist/__tests__/audit-reconstruct.test.js.map +0 -1
  80. package/dist/__tests__/audit-report.test.d.ts +0 -2
  81. package/dist/__tests__/audit-report.test.d.ts.map +0 -1
  82. package/dist/__tests__/audit-report.test.js +0 -186
  83. package/dist/__tests__/audit-report.test.js.map +0 -1
  84. package/dist/__tests__/audit-roundtrip.test.d.ts +0 -2
  85. package/dist/__tests__/audit-roundtrip.test.d.ts.map +0 -1
  86. package/dist/__tests__/audit-roundtrip.test.js +0 -368
  87. package/dist/__tests__/audit-roundtrip.test.js.map +0 -1
  88. package/dist/__tests__/audit-temporal.test.d.ts +0 -2
  89. package/dist/__tests__/audit-temporal.test.d.ts.map +0 -1
  90. package/dist/__tests__/audit-temporal.test.js +0 -364
  91. package/dist/__tests__/audit-temporal.test.js.map +0 -1
  92. package/dist/__tests__/audit-tiers.test.d.ts +0 -2
  93. package/dist/__tests__/audit-tiers.test.d.ts.map +0 -1
  94. package/dist/__tests__/audit-tiers.test.js +0 -282
  95. package/dist/__tests__/audit-tiers.test.js.map +0 -1
  96. package/dist/__tests__/audit-witness-real.test.d.ts +0 -19
  97. package/dist/__tests__/audit-witness-real.test.d.ts.map +0 -1
  98. package/dist/__tests__/audit-witness-real.test.js +0 -82
  99. package/dist/__tests__/audit-witness-real.test.js.map +0 -1
  100. package/dist/__tests__/audit-witness.test.d.ts +0 -2
  101. package/dist/__tests__/audit-witness.test.d.ts.map +0 -1
  102. package/dist/__tests__/audit-witness.test.js +0 -308
  103. package/dist/__tests__/audit-witness.test.js.map +0 -1
  104. package/dist/__tests__/canonical.test.d.ts +0 -2
  105. package/dist/__tests__/canonical.test.d.ts.map +0 -1
  106. package/dist/__tests__/canonical.test.js +0 -162
  107. package/dist/__tests__/canonical.test.js.map +0 -1
  108. package/dist/__tests__/chain-hash-anchor.test.d.ts +0 -22
  109. package/dist/__tests__/chain-hash-anchor.test.d.ts.map +0 -1
  110. package/dist/__tests__/chain-hash-anchor.test.js +0 -55
  111. package/dist/__tests__/chain-hash-anchor.test.js.map +0 -1
  112. package/dist/__tests__/commit-service.integration.test.d.ts +0 -2
  113. package/dist/__tests__/commit-service.integration.test.d.ts.map +0 -1
  114. package/dist/__tests__/commit-service.integration.test.js +0 -95
  115. package/dist/__tests__/commit-service.integration.test.js.map +0 -1
  116. package/dist/__tests__/constructor.test.d.ts +0 -2
  117. package/dist/__tests__/constructor.test.d.ts.map +0 -1
  118. package/dist/__tests__/constructor.test.js +0 -267
  119. package/dist/__tests__/constructor.test.js.map +0 -1
  120. package/dist/__tests__/declared-proof-fixture.d.ts +0 -66
  121. package/dist/__tests__/declared-proof-fixture.d.ts.map +0 -1
  122. package/dist/__tests__/declared-proof-fixture.js +0 -66
  123. package/dist/__tests__/declared-proof-fixture.js.map +0 -1
  124. package/dist/__tests__/fuse-placement.test.d.ts +0 -2
  125. package/dist/__tests__/fuse-placement.test.d.ts.map +0 -1
  126. package/dist/__tests__/fuse-placement.test.js +0 -31
  127. package/dist/__tests__/fuse-placement.test.js.map +0 -1
  128. package/dist/__tests__/fuse-roundtrip.test.d.ts +0 -2
  129. package/dist/__tests__/fuse-roundtrip.test.d.ts.map +0 -1
  130. package/dist/__tests__/fuse-roundtrip.test.js +0 -241
  131. package/dist/__tests__/fuse-roundtrip.test.js.map +0 -1
  132. package/dist/__tests__/fuse-sdk.test.d.ts +0 -2
  133. package/dist/__tests__/fuse-sdk.test.d.ts.map +0 -1
  134. package/dist/__tests__/fuse-sdk.test.js +0 -117
  135. package/dist/__tests__/fuse-sdk.test.js.map +0 -1
  136. package/dist/__tests__/fuse-set-sdk.test.d.ts +0 -2
  137. package/dist/__tests__/fuse-set-sdk.test.d.ts.map +0 -1
  138. package/dist/__tests__/fuse-set-sdk.test.js +0 -721
  139. package/dist/__tests__/fuse-set-sdk.test.js.map +0 -1
  140. package/dist/__tests__/fuse-set.test.d.ts +0 -2
  141. package/dist/__tests__/fuse-set.test.d.ts.map +0 -1
  142. package/dist/__tests__/fuse-set.test.js +0 -868
  143. package/dist/__tests__/fuse-set.test.js.map +0 -1
  144. package/dist/__tests__/fuse-set2.test.d.ts +0 -2
  145. package/dist/__tests__/fuse-set2.test.d.ts.map +0 -1
  146. package/dist/__tests__/fuse-set2.test.js +0 -294
  147. package/dist/__tests__/fuse-set2.test.js.map +0 -1
  148. package/dist/__tests__/fuse-vectors.test.d.ts +0 -2
  149. package/dist/__tests__/fuse-vectors.test.d.ts.map +0 -1
  150. package/dist/__tests__/fuse-vectors.test.js +0 -175
  151. package/dist/__tests__/fuse-vectors.test.js.map +0 -1
  152. package/dist/__tests__/fuse-verify.test.d.ts +0 -2
  153. package/dist/__tests__/fuse-verify.test.d.ts.map +0 -1
  154. package/dist/__tests__/fuse-verify.test.js +0 -250
  155. package/dist/__tests__/fuse-verify.test.js.map +0 -1
  156. package/dist/__tests__/hello-world.test.d.ts +0 -2
  157. package/dist/__tests__/hello-world.test.d.ts.map +0 -1
  158. package/dist/__tests__/hello-world.test.js +0 -9
  159. package/dist/__tests__/hello-world.test.js.map +0 -1
  160. package/dist/__tests__/mock-proof-fixture.d.ts +0 -15
  161. package/dist/__tests__/mock-proof-fixture.d.ts.map +0 -1
  162. package/dist/__tests__/mock-proof-fixture.js +0 -34
  163. package/dist/__tests__/mock-proof-fixture.js.map +0 -1
  164. package/dist/__tests__/policy-enforcement.test.d.ts +0 -2
  165. package/dist/__tests__/policy-enforcement.test.d.ts.map +0 -1
  166. package/dist/__tests__/policy-enforcement.test.js +0 -188
  167. package/dist/__tests__/policy-enforcement.test.js.map +0 -1
  168. package/dist/__tests__/proof-hash-regression.test.d.ts +0 -2
  169. package/dist/__tests__/proof-hash-regression.test.d.ts.map +0 -1
  170. package/dist/__tests__/proof-hash-regression.test.js +0 -95
  171. package/dist/__tests__/proof-hash-regression.test.js.map +0 -1
  172. package/dist/__tests__/proof-hash.test.d.ts +0 -2
  173. package/dist/__tests__/proof-hash.test.d.ts.map +0 -1
  174. package/dist/__tests__/proof-hash.test.js +0 -116
  175. package/dist/__tests__/proof-hash.test.js.map +0 -1
  176. package/dist/__tests__/proof-integrity.test.d.ts +0 -2
  177. package/dist/__tests__/proof-integrity.test.d.ts.map +0 -1
  178. package/dist/__tests__/proof-integrity.test.js +0 -426
  179. package/dist/__tests__/proof-integrity.test.js.map +0 -1
  180. package/dist/__tests__/realistic-proof-fixture.d.ts +0 -56
  181. package/dist/__tests__/realistic-proof-fixture.d.ts.map +0 -1
  182. package/dist/__tests__/realistic-proof-fixture.js +0 -57
  183. package/dist/__tests__/realistic-proof-fixture.js.map +0 -1
  184. package/dist/__tests__/verifier.test.d.ts +0 -2
  185. package/dist/__tests__/verifier.test.d.ts.map +0 -1
  186. package/dist/__tests__/verifier.test.js +0 -531
  187. package/dist/__tests__/verifier.test.js.map +0 -1
  188. package/dist/canonical.d.ts +0 -54
  189. package/dist/canonical.d.ts.map +0 -1
  190. package/dist/canonical.js +0 -119
  191. package/dist/canonical.js.map +0 -1
  192. package/dist/proof-hash.d.ts +0 -9
  193. package/dist/proof-hash.d.ts.map +0 -1
  194. package/dist/proof-hash.js +0 -75
  195. package/dist/proof-hash.js.map +0 -1
  196. package/dist/types.d.ts +0 -705
  197. package/dist/types.d.ts.map +0 -1
  198. package/dist/types.js +0 -3
  199. package/dist/types.js.map +0 -1
  200. package/dist/verifier.d.ts +0 -27
  201. package/dist/verifier.d.ts.map +0 -1
  202. package/dist/verifier.js +0 -844
  203. package/dist/verifier.js.map +0 -1
  204. package/src/__tests__/audit-anchors.test.ts +0 -188
  205. package/src/__tests__/audit-anomalies.test.ts +0 -815
  206. package/src/__tests__/audit-attestation.test.ts +0 -529
  207. package/src/__tests__/audit-bench-smoke.test.ts +0 -108
  208. package/src/__tests__/audit-boundary.test.ts +0 -96
  209. package/src/__tests__/audit-cli.test.ts +0 -288
  210. package/src/__tests__/audit-dependencies.test.ts +0 -141
  211. package/src/__tests__/audit-fixtures.ts +0 -736
  212. package/src/__tests__/audit-ingest.test.ts +0 -575
  213. package/src/__tests__/audit-memory-ingest.test.ts +0 -156
  214. package/src/__tests__/audit-property.test.ts +0 -892
  215. package/src/__tests__/audit-real-fixtures.test.ts +0 -153
  216. package/src/__tests__/audit-real-live.test.ts +0 -128
  217. package/src/__tests__/audit-reconstruct.test.ts +0 -353
  218. package/src/__tests__/audit-report.test.ts +0 -222
  219. package/src/__tests__/audit-roundtrip.test.ts +0 -464
  220. package/src/__tests__/audit-temporal.test.ts +0 -446
  221. package/src/__tests__/audit-tiers.test.ts +0 -343
  222. package/src/__tests__/audit-witness-real.test.ts +0 -92
  223. package/src/__tests__/audit-witness.test.ts +0 -345
  224. package/src/__tests__/canonical.test.ts +0 -253
  225. package/src/__tests__/chain-hash-anchor.test.ts +0 -67
  226. package/src/__tests__/commit-service.integration.test.ts +0 -117
  227. package/src/__tests__/constructor.test.ts +0 -340
  228. package/src/__tests__/declared-proof-fixture.ts +0 -65
  229. package/src/__tests__/fuse-placement.test.ts +0 -32
  230. package/src/__tests__/fuse-roundtrip.test.ts +0 -243
  231. package/src/__tests__/fuse-sdk.test.ts +0 -142
  232. package/src/__tests__/fuse-set-sdk.test.ts +0 -852
  233. package/src/__tests__/fuse-set.test.ts +0 -1005
  234. package/src/__tests__/fuse-set2.test.ts +0 -343
  235. package/src/__tests__/fuse-vectors.test.ts +0 -218
  236. package/src/__tests__/fuse-verify.test.ts +0 -278
  237. package/src/__tests__/hello-world.test.ts +0 -10
  238. package/src/__tests__/mock-proof-fixture.ts +0 -36
  239. package/src/__tests__/policy-enforcement.test.ts +0 -226
  240. package/src/__tests__/proof-hash-regression.test.ts +0 -107
  241. package/src/__tests__/proof-hash.test.ts +0 -129
  242. package/src/__tests__/proof-integrity.test.ts +0 -541
  243. package/src/__tests__/real-fixtures/anchor-after-112762.json +0 -47
  244. package/src/__tests__/real-fixtures/anchor-with-ethereum-112758.json +0 -47
  245. package/src/__tests__/real-fixtures/live-proof-0.json +0 -42
  246. package/src/__tests__/real-fixtures/live-proof-1.json +0 -43
  247. package/src/__tests__/real-fixtures/live-proof-2.json +0 -43
  248. package/src/__tests__/real-fixtures/successor-112760.json +0 -38
  249. package/src/__tests__/real-fixtures/witness-25525146.json +0 -6
  250. package/src/__tests__/real-fixtures/witness-25525147.json +0 -6
  251. package/src/__tests__/realistic-proof-fixture.ts +0 -57
  252. package/src/__tests__/verifier.test.ts +0 -624
@@ -1,175 +0,0 @@
1
- // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
- /**
3
- * BitGraph Fuse: fixed vectors (spec 15.2).
4
- *
5
- * The slot record hash, the commitment preimage, the commitment, the Form C
6
- * payload bytes, the trailer bytes and the container bytes are pinned, and
7
- * the enclave's own commit.slotHashB64 on real fixture proofs must equal what
8
- * this package computes from the embedded slot record.
9
- */
10
- import { describe, test } from "node:test";
11
- import * as assert from "node:assert/strict";
12
- import { readFileSync } from "node:fs";
13
- import { fileURLToPath } from "node:url";
14
- import { sha256 } from "@noble/hashes/sha256";
15
- import { FUSE_DOMAIN, TRAILER_MAGIC, canonicalSlotBody, canonicalize, computeSlotRecordHash, slotCommitmentPreimage, computeSlotCommitment, buildFusePayload, parseFusePayload, getPlacement, bytesToHex, hexToBytes, bytesToBase64, base64ToBytes, } from "@mikeargento/bitgraph-verify";
16
- const FIX = fileURLToPath(new URL("../../src/__tests__/fuse-fixtures/", import.meta.url));
17
- const bytes = (name) => new Uint8Array(readFileSync(FIX + name));
18
- const json = (name) => JSON.parse(readFileSync(FIX + name, "utf8"));
19
- const V = json("vectors.json");
20
- describe("domain separation", () => {
21
- test("the domain is the 15 profile bytes followed by one zero byte, 16 bytes total", () => {
22
- assert.equal(FUSE_DOMAIN.length, 16);
23
- assert.equal(new TextDecoder().decode(FUSE_DOMAIN.subarray(0, 15)), "bitgraph-fuse/1");
24
- assert.equal(FUSE_DOMAIN[15], 0);
25
- assert.equal(bytesToHex(FUSE_DOMAIN), V.domainHex);
26
- });
27
- test("changing the domain label changes the commitment", () => {
28
- const slot = V.synthetic.slot;
29
- const nonce = base64ToBytes(slot.nonceB64);
30
- const other = new Uint8Array([...new TextEncoder().encode("bitgraph-fuse/2"), 0, ...computeSlotRecordHash(slot), ...nonce]);
31
- assert.notEqual(bytesToHex(sha256(other)), V.synthetic.commitmentHex);
32
- });
33
- });
34
- describe("slot record hash and commitment, synthetic vector", () => {
35
- const slot = V.synthetic.slot;
36
- test("canonical slot body is the enclave's field subset, sorted, compact", () => {
37
- const body = new TextDecoder().decode(canonicalize(canonicalSlotBody(slot)));
38
- assert.equal(body, V.synthetic.canonicalSlotBody);
39
- assert.equal(body, `{"chainId":"bitgraph:main","counter":"7","epochId":"${slot.epochId}","nonceB64":"${slot.nonceB64}","publicKeyB64":"${slot.publicKeyB64}","version":"bitgraph/slot/1"}`);
40
- assert.ok(!body.includes("signatureB64"), "the signature is outside the hashed body");
41
- });
42
- test("slotRecordHash, preimage and commitment are pinned and structurally related", () => {
43
- const hash = computeSlotRecordHash(slot);
44
- assert.equal(bytesToHex(hash), V.synthetic.slotRecordHashHex);
45
- const pre = slotCommitmentPreimage(slot);
46
- assert.equal(bytesToHex(pre), V.synthetic.preimageHex);
47
- assert.equal(pre.length, 16 + 32 + 32);
48
- assert.deepEqual(pre.subarray(0, 16), FUSE_DOMAIN);
49
- assert.deepEqual(pre.subarray(16, 48), hash);
50
- assert.deepEqual(pre.subarray(48, 80), base64ToBytes(slot.nonceB64));
51
- assert.equal(bytesToHex(computeSlotCommitment(slot)), V.synthetic.commitmentHex);
52
- assert.equal(bytesToHex(sha256(pre)), V.synthetic.commitmentHex);
53
- });
54
- test("one-bit mutations of the nonce or any signed slot field change the commitment", () => {
55
- const base = bytesToHex(computeSlotCommitment(slot));
56
- const nonce = base64ToBytes(slot.nonceB64);
57
- nonce[0] = nonce[0] ^ 1;
58
- assert.notEqual(bytesToHex(computeSlotCommitment({ ...slot, nonceB64: bytesToBase64(nonce) })), base);
59
- assert.notEqual(bytesToHex(computeSlotCommitment({ ...slot, counter: "8" })), base);
60
- assert.notEqual(bytesToHex(computeSlotCommitment({ ...slot, epochId: bytesToBase64(new Uint8Array(32).fill(9)) })), base);
61
- assert.notEqual(bytesToHex(computeSlotCommitment({ ...slot, chainId: "global" })), base);
62
- const { chainId: _c, ...noChain } = slot;
63
- assert.notEqual(bytesToHex(computeSlotCommitment(noChain)), base, "a record without chainId is a different record");
64
- // The signature is not part of the hashed body, so changing it changes nothing here.
65
- assert.equal(bytesToHex(computeSlotCommitment({ ...slot, signatureB64: bytesToBase64(new Uint8Array(64).fill(7)) })), base);
66
- });
67
- test("a nonce that is not 32 bytes is refused", () => {
68
- assert.throws(() => computeSlotCommitment({ ...slot, nonceB64: bytesToBase64(new Uint8Array(16)) }), /32 bytes/);
69
- assert.throws(() => computeSlotCommitment({ ...slot, nonceB64: "not base64!" }), /32 bytes/);
70
- });
71
- });
72
- describe("real fixture proofs: the enclave agrees with this package", () => {
73
- for (const name of ["trailer", "container", "produced-origin", "produced-bare", "trailer-undeclared", "wrong-slot", "unregistered", "order-fused-during-hold"]) {
74
- test(`${name}: SHA-256 of the canonical slot body equals commit.slotHashB64`, () => {
75
- const proof = json(`${name}.proof.json`);
76
- assert.ok(proof.slotAllocation, "fixture carries its slot record");
77
- assert.equal(bytesToBase64(computeSlotRecordHash(proof.slotAllocation)), proof.commit.slotHashB64);
78
- assert.equal(proof.slotAllocation.nonceB64, proof.commit.nonceB64);
79
- });
80
- }
81
- test("the fixture vectors match the embedded slot records", () => {
82
- for (const [name, v] of [["trailer", V.trailerFixture], ["container", V.containerFixture], ["produced-origin", V.producedOriginFixture], ["produced-bare", V.producedBareFixture]]) {
83
- const proof = json(`${name}.proof.json`);
84
- assert.equal(bytesToHex(computeSlotCommitment(proof.slotAllocation)), v.commitmentHex, name);
85
- assert.equal(proof.artifact.digestB64, v.fusedDigestB64, name);
86
- }
87
- });
88
- });
89
- describe("Form C payload bytes", () => {
90
- test("pinned bytes: sorted keys, compact, lowercase hex, type last", () => {
91
- const v = V.producedOriginFixture;
92
- const commitment = hexToBytes(v.commitmentHex);
93
- const origin = base64ToBytes(V.trailerFixture.originDigestB64);
94
- const built = buildFusePayload(commitment, origin);
95
- assert.equal(new TextDecoder().decode(built), v.payload);
96
- assert.equal(v.payload, `{"origin":{"algorithm":"sha256","digest":"${bytesToHex(origin)}"},"slotCommitment":{"algorithm":"sha256","digest":"${v.commitmentHex}"},"type":"bitgraph-fuse/1"}`);
97
- assert.equal(bytesToBase64(sha256(built)), v.fusedDigestB64);
98
- const bare = buildFusePayload(hexToBytes(V.producedBareFixture.commitmentHex));
99
- assert.equal(new TextDecoder().decode(bare), V.producedBareFixture.payload);
100
- assert.ok(!V.producedBareFixture.payload.includes("origin"));
101
- });
102
- test("parse round-trips and rejects every non-canonical or malformed form", () => {
103
- const good = bytes("produced-origin.json");
104
- const parsed = parseFusePayload(good);
105
- assert.equal(bytesToHex(parsed.commitment), V.producedOriginFixture.commitmentHex);
106
- assert.equal(bytesToBase64(parsed.originDigest), V.trailerFixture.originDigestB64);
107
- const text = new TextDecoder().decode(good);
108
- const enc = (s) => new TextEncoder().encode(s);
109
- assert.equal(parseFusePayload(enc(JSON.stringify(JSON.parse(text), null, 2))), null, "whitespace");
110
- assert.equal(parseFusePayload(enc(text.replace("bitgraph-fuse/1", "bitgraph-fuse/2"))), null, "type");
111
- assert.equal(parseFusePayload(enc(text.replace(/"digest":"([0-9a-f]{8})/, (_m, h) => `"digest":"${h.toUpperCase()}`))), null, "uppercase hex");
112
- assert.equal(parseFusePayload(enc(text.replace("{\"origin\"", "{\"extra\":1,\"origin\""))), null, "extra key");
113
- assert.equal(parseFusePayload(enc(text.replace("\"type\":\"bitgraph-fuse/1\"", "\"type\":\"bitgraph-fuse/1\",\"type\":\"bitgraph-fuse/1\""))), null, "duplicate key");
114
- assert.equal(parseFusePayload(enc(text.replace("sha256", "sha512"))), null, "algorithm");
115
- assert.equal(parseFusePayload(enc("[]")), null);
116
- assert.equal(parseFusePayload(new Uint8Array([0xff, 0xfe])), null, "not UTF-8");
117
- });
118
- });
119
- describe("trailer/1 and container/1 bytes", () => {
120
- test("trailer is original || 'BGFUSE01' || 8 zero bytes || commitment", () => {
121
- const fused = bytes("fused-trailer.bin");
122
- const original = bytes("original.txt");
123
- assert.equal(fused.length, original.length + 48);
124
- assert.deepEqual(fused.subarray(0, original.length), original);
125
- assert.equal(new TextDecoder().decode(fused.subarray(original.length, original.length + 8)), TRAILER_MAGIC);
126
- assert.ok(fused.subarray(original.length + 8, original.length + 16).every((b) => b === 0));
127
- assert.equal(bytesToHex(fused.subarray(original.length + 16)), V.trailerFixture.commitmentHex);
128
- assert.equal(bytesToBase64(sha256(fused)), V.trailerFixture.fusedDigestB64);
129
- });
130
- test("container is a fixed-layout ustar: manifest, original, two zero blocks, all metadata zeroed", () => {
131
- const fused = bytes("fused-container.tar");
132
- const png = bytes("image.png");
133
- assert.equal(fused.length % 512, 0);
134
- const name = (off) => new TextDecoder().decode(fused.subarray(off, off + 100)).replace(/\0+$/, "");
135
- assert.equal(name(0), "bitgraph-fuse/manifest.json");
136
- const manifestLen = parseInt(new TextDecoder().decode(fused.subarray(124, 135)), 8);
137
- const manifest = fused.subarray(512, 512 + manifestLen);
138
- const parsed = parseFusePayload(manifest);
139
- assert.equal(bytesToHex(parsed.commitment), V.containerFixture.commitmentHex);
140
- assert.equal(bytesToBase64(parsed.originDigest), V.containerFixture.originDigestB64);
141
- const second = 512 + manifestLen + ((512 - (manifestLen % 512)) % 512);
142
- assert.equal(name(second), "bitgraph-fuse/original");
143
- assert.equal(new TextDecoder().decode(fused.subarray(second + 136, second + 147)), "00000000000", "mtime is zero");
144
- assert.deepEqual(fused.subarray(second + 512, second + 512 + png.length), png);
145
- assert.ok(fused.subarray(fused.length - 1024).every((b) => b === 0), "two zero blocks end the archive");
146
- assert.equal(bytesToBase64(sha256(fused)), V.containerFixture.fusedDigestB64);
147
- const rebuilt = getPlacement("container/1").build({ original: png, commitment: parsed.commitment });
148
- assert.deepEqual(rebuilt, fused);
149
- });
150
- test("one-bit mutation of the fused bytes changes the artifact digest", () => {
151
- for (const name of ["fused-trailer.bin", "fused-container.tar", "produced-origin.json"]) {
152
- const f = bytes(name);
153
- const d0 = bytesToBase64(sha256(f));
154
- f[0] = f[0] ^ 1;
155
- assert.notEqual(bytesToBase64(sha256(f)), d0, name);
156
- }
157
- });
158
- });
159
- describe("encoding helpers", () => {
160
- test("base64 is strict standard alphabet with canonical padding", () => {
161
- assert.deepEqual(base64ToBytes("AQID"), new Uint8Array([1, 2, 3]));
162
- assert.equal(base64ToBytes("AQI"), null, "length");
163
- assert.equal(base64ToBytes("AQI-"), null, "url-safe alphabet");
164
- assert.equal(base64ToBytes("AQ==\n"), null, "whitespace");
165
- assert.equal(base64ToBytes("AR=="), null, "non-canonical trailing bits");
166
- assert.equal(bytesToBase64(new Uint8Array(32).fill(255)), "//////////////////////////////////////////8=");
167
- assert.deepEqual(base64ToBytes("//////////////////////////////////////////8="), new Uint8Array(32).fill(255));
168
- });
169
- test("hex is lowercase only", () => {
170
- assert.deepEqual(hexToBytes("00ff"), new Uint8Array([0, 255]));
171
- assert.equal(hexToBytes("00FF"), null);
172
- assert.equal(hexToBytes("0"), null);
173
- });
174
- });
175
- //# sourceMappingURL=fuse-vectors.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fuse-vectors.test.js","sourceRoot":"","sources":["../../src/__tests__/fuse-vectors.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=fuse-verify.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fuse-verify.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/fuse-verify.test.ts"],"names":[],"mappings":""}
@@ -1,250 +0,0 @@
1
- // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
- /**
3
- * BitGraph Fuse: verifier paths (spec 15.4, 15.5, 15.8) on real fixture
4
- * proofs minted through the unmodified enclave. Every negative case runs.
5
- */
6
- import { describe, test } from "node:test";
7
- import * as assert from "node:assert/strict";
8
- import { readFileSync } from "node:fs";
9
- import { fileURLToPath } from "node:url";
10
- import { sha256 } from "@noble/hashes/sha256";
11
- import { verifyFuse, assembledAfterCommit, verifyProofIntegrity, bytesToBase64, resetEpochLinkState } from "@mikeargento/bitgraph-verify";
12
- const FIX = fileURLToPath(new URL("../../src/__tests__/fuse-fixtures/", import.meta.url));
13
- const bytes = (name) => new Uint8Array(readFileSync(FIX + name));
14
- const proofOf = (name) => JSON.parse(readFileSync(FIX + name, "utf8"));
15
- const text = (name) => readFileSync(FIX + name, "utf8");
16
- const original = bytes("original.txt");
17
- const png = bytes("image.png");
18
- const unrelated = new TextEncoder().encode("a file nobody recorded\n");
19
- async function run(proofName, file, extra = {}) {
20
- resetEpochLinkState();
21
- return verifyFuse({ proof: proofOf(proofName), bytes: file, ...extra });
22
- }
23
- describe("path 3: the file is the committed bytes", () => {
24
- test("an ordinary proof with its file is RECORDED, with the recorded statement", async () => {
25
- const r = await run("recorded.proof.json", original);
26
- assert.equal(r.category, "RECORDED");
27
- assert.equal(r.proof.valid, true);
28
- assert.equal(r.marker, null);
29
- assert.match(r.statements[0], /existed no later than commit position/);
30
- });
31
- for (const [proofName, fusedName, placement] of [
32
- ["trailer.proof.json", "fused-trailer.bin", "trailer/1"],
33
- ["container.proof.json", "fused-container.tar", "container/1"],
34
- ["produced-origin.proof.json", "produced-origin.json", "produced/1"],
35
- ["produced-bare.proof.json", "produced-bare.json", "produced/1"],
36
- ]) {
37
- test(`${placement}: fused bytes verify FUSED_DIRECT`, async () => {
38
- const r = await run(proofName, bytes(fusedName));
39
- assert.equal(r.category, "FUSED_DIRECT", r.reason ?? "");
40
- assert.equal(r.placement, placement);
41
- assert.equal(r.marker?.source, "attribution");
42
- assert.ok(r.span);
43
- assert.ok(BigInt(r.span.positions) >= 1n);
44
- assert.equal(r.span.chainId, "bitgraph:main");
45
- assert.match(r.statements.at(-1), /could not feasibly have been finalized before their signed slot allocation at position/);
46
- assert.equal(r.policy.spanExceeded, false);
47
- });
48
- }
49
- test("the origin statement names what was checked: consistency on the direct path, reconstruction on the origin path", async () => {
50
- const direct = await run("trailer.proof.json", bytes("fused-trailer.bin"));
51
- assert.equal(direct.category, "FUSED_DIRECT");
52
- assert.equal(direct.statements.length, 2);
53
- assert.match(direct.statements[0], /origin digest that matches the signed marker/);
54
- assert.match(direct.statements[0], /was not supplied and was not checked/);
55
- assert.doesNotMatch(direct.statements[0], /supplied original/, "no original was supplied on the direct path");
56
- const fromOrigin = await run("trailer.proof.json", original);
57
- assert.equal(fromOrigin.category, "FUSED_FROM_ORIGIN");
58
- assert.equal(fromOrigin.statements.length, 2);
59
- assert.match(fromOrigin.statements[0], /supplied original rebuilds the committed fused artifact byte for byte/);
60
- const bare = await run("produced-bare.proof.json", bytes("produced-bare.json"));
61
- assert.equal(bare.statements.length, 1);
62
- assert.equal(bare.originDigestB64, null);
63
- });
64
- test("a fused file committed under a different slot is INVALID_SLOT_COMMITMENT, never RECORDED", async () => {
65
- const r = await run("wrong-slot.proof.json", bytes("fused-wrong-slot.bin"));
66
- assert.equal(r.category, "INVALID_SLOT_COMMITMENT");
67
- assert.equal(r.proof.valid, true, "the underlying proof is sound; only the commitment is wrong");
68
- assert.match(r.reason, /does not match the proof's slot record/);
69
- });
70
- test("an unregistered placement id is UNDETERMINED_PLACEMENT", async () => {
71
- const r = await run("unregistered.proof.json", bytes("fused-unregistered.bin"));
72
- assert.equal(r.category, "UNDETERMINED_PLACEMENT");
73
- assert.match(r.reason, /xmp\/9/);
74
- });
75
- test("a manifest origin hint that contradicts the origin inside the bytes is INVALID_ORIGIN_ATTRIBUTION", async () => {
76
- // The signed attribution of the undeclared fixture names no origin, so the
77
- // Frame's manifest supplies the hint. Trailer bytes carry the original as
78
- // their prefix, and the hint (the PNG) contradicts what the bytes say.
79
- const frameText = JSON.stringify({
80
- type: "bitgraph-fuse/1",
81
- manifest: { placement: "trailer/1", origin: { algorithm: "sha256", digest: Buffer.from(sha256(png)).toString("hex") }, artifact: { algorithm: "sha256", digest: Buffer.from(sha256(bytes("fused-trailer-undeclared.bin"))).toString("hex") }, fusedFile: null },
82
- proof: proofOf("trailer-undeclared.proof.json"),
83
- });
84
- const r = await run("trailer-undeclared.proof.json", bytes("fused-trailer-undeclared.bin"), { frame: frameText });
85
- assert.equal(r.category, "INVALID_ORIGIN_ATTRIBUTION");
86
- assert.equal(r.marker?.source, "attribution", "the proof itself is signed fused");
87
- assert.equal(r.marker?.originSource, "manifest", "the contradicted origin came from the manifest");
88
- assert.match(r.reason, /manifest/);
89
- });
90
- test("a manifest marker that agrees with the bytes verifies FUSED_DIRECT", async () => {
91
- const r = await run("trailer-undeclared.proof.json", bytes("fused-trailer-undeclared.bin"), {
92
- frame: { type: "bitgraph-fuse/1", manifest: { placement: "trailer/1", origin: { algorithm: "sha256", digest: Buffer.from(sha256(original)).toString("hex") }, artifact: { algorithm: "sha256", digest: "00".repeat(32) }, fusedFile: null }, proof: proofOf("trailer-undeclared.proof.json") },
93
- });
94
- assert.equal(r.category, "FUSED_DIRECT");
95
- assert.equal(r.statements.length, 2);
96
- });
97
- });
98
- describe("path 4: the file is the original", () => {
99
- test("trailer/1: the original alone rebuilds and verifies FUSED_FROM_ORIGIN", async () => {
100
- const r = await run("trailer.proof.json", original);
101
- assert.equal(r.category, "FUSED_FROM_ORIGIN", r.reason ?? "");
102
- assert.equal(r.placement, "trailer/1");
103
- assert.equal(r.originDigestB64, bytesToBase64(sha256(original)));
104
- assert.equal(r.statements.length, 2);
105
- });
106
- test("container/1: the PNG alone rebuilds the archive", async () => {
107
- const r = await run("container.proof.json", png);
108
- assert.equal(r.category, "FUSED_FROM_ORIGIN", r.reason ?? "");
109
- assert.equal(r.placement, "container/1");
110
- });
111
- test("produced/1 names a source but is not rebuildable from it: RECONSTRUCTION_MISMATCH", async () => {
112
- const r = await run("produced-origin.proof.json", original);
113
- assert.equal(r.category, "RECONSTRUCTION_MISMATCH");
114
- assert.equal(r.placement, "produced/1");
115
- });
116
- test("a manifest origin hint on a signed fused proof lets the original rebuild", async () => {
117
- const r = await run("trailer-undeclared.proof.json", original, {
118
- frame: { type: "bitgraph-fuse/1", manifest: { placement: "trailer/1", origin: { algorithm: "sha256", digest: Buffer.from(sha256(original)).toString("hex") }, artifact: { algorithm: "sha256", digest: "00".repeat(32) }, fusedFile: null }, proof: proofOf("trailer-undeclared.proof.json") },
119
- });
120
- assert.equal(r.category, "FUSED_FROM_ORIGIN");
121
- assert.equal(r.placement, "trailer/1");
122
- assert.equal(r.marker?.originSource, "manifest");
123
- });
124
- test("an undeclared placement resolves through the registry in fixed order and reports the match", async () => {
125
- // A proof whose signed attribution has no title cannot be minted through the
126
- // parent (it requires one), so undeclared placement arrives only through a
127
- // Frame: strip the title here to exercise the registry scan on both paths.
128
- const p = structuredClone(proofOf("trailer-undeclared.proof.json"));
129
- // The title is signed; removing it breaks the signature, so instead present a
130
- // Frame with no placement and rely on the signed marker having one. To reach
131
- // the scan we need BOTH undeclared, which only a hypothetical name-only
132
- // attribution gives; construct that case by verifying against a Frame whose
133
- // proof is name-only and whose signature we re-establish is impossible here,
134
- // so exercise the scan through the registry helper directly instead.
135
- const frame = { type: "bitgraph-fuse/1", manifest: { origin: { algorithm: "sha256", digest: Buffer.from(sha256(original)).toString("hex") }, artifact: { algorithm: "sha256", digest: "00".repeat(32) }, fusedFile: null }, proof: p };
136
- const r = await run("trailer-undeclared.proof.json", original, { frame });
137
- // The signed title (trailer/1) still declares the placement; the scan is not reached.
138
- assert.equal(r.category, "FUSED_FROM_ORIGIN");
139
- assert.equal(r.placement, "trailer/1");
140
- });
141
- test("an unsigned manifest with a FALSE origin is RECONSTRUCTION_MISMATCH: reconstruction makes the hint self-proving", async () => {
142
- // The manifest claims the PNG is the origin of the undeclared trailer fixture. The
143
- // PNG's hash matches the hint, so path 4 runs, and rebuilding from the PNG cannot
144
- // reproduce the signed artifact digest.
145
- const r = await run("trailer-undeclared.proof.json", png, {
146
- frame: { type: "bitgraph-fuse/1", manifest: { placement: "trailer/1", origin: { algorithm: "sha256", digest: Buffer.from(sha256(png)).toString("hex") }, artifact: { algorithm: "sha256", digest: "00".repeat(32) }, fusedFile: null }, proof: proofOf("trailer-undeclared.proof.json") },
147
- });
148
- assert.equal(r.category, "RECONSTRUCTION_MISMATCH");
149
- assert.equal(r.marker?.source, "attribution", "the proof is signed fused");
150
- assert.equal(r.marker?.originSource, "manifest", "the false origin was the manifest's hint");
151
- });
152
- test("an unregistered declared placement cannot rebuild: UNDETERMINED_PLACEMENT", async () => {
153
- const r = await run("unregistered.proof.json", original);
154
- assert.equal(r.category, "UNDETERMINED_PLACEMENT");
155
- });
156
- test("the wrong-slot fixture from its original: rebuilt bytes carry the proof's own commitment, so the hash differs", async () => {
157
- const r = await run("wrong-slot.proof.json", original);
158
- assert.equal(r.category, "RECONSTRUCTION_MISMATCH");
159
- });
160
- });
161
- describe("path 5 and the underlying proof", () => {
162
- test("a file matching neither digest is NO_MATCH", async () => {
163
- for (const name of ["recorded.proof.json", "trailer.proof.json", "produced-bare.proof.json"]) {
164
- const r = await run(name, unrelated);
165
- assert.equal(r.category, "NO_MATCH", name);
166
- }
167
- // The fused bytes of one fixture against another fixture's proof: also NO_MATCH.
168
- assert.equal((await run("container.proof.json", bytes("fused-trailer.bin"))).category, "NO_MATCH");
169
- });
170
- test("tampering with the nested proof is INVALID_UNDERLYING_PROOF and never downgrades", async () => {
171
- const proof = proofOf("trailer.proof.json");
172
- const cases = [
173
- ["counter", (p) => { p.commit.counter = String(Number(p.commit.counter) + 1); }],
174
- ["attribution.message (origin)", (p) => { p.attribution.message = bytesToBase64(sha256(png)); }],
175
- ["attribution.title (placement)", (p) => { p.attribution.title = "container/1"; }],
176
- ["artifact digest", (p) => { p.artifact.digestB64 = bytesToBase64(sha256(unrelated)); }],
177
- ["slot record nonce", (p) => { p.slotAllocation.nonceB64 = bytesToBase64(new Uint8Array(32)); }],
178
- ["signature", (p) => { p.signer.signatureB64 = bytesToBase64(new Uint8Array(64)); }],
179
- ];
180
- for (const [label, mutate] of cases) {
181
- const p = structuredClone(proof);
182
- mutate(p);
183
- resetEpochLinkState();
184
- const r = await verifyFuse({ proof: p, bytes: bytes("fused-trailer.bin") });
185
- assert.equal(r.category, "INVALID_UNDERLYING_PROOF", label);
186
- assert.equal(r.proof.valid, false, label);
187
- assert.equal(r.statements.length, 0, label);
188
- }
189
- });
190
- test("tampering with the fused bytes is NO_MATCH (the digest no longer matches)", async () => {
191
- const f = bytes("fused-trailer.bin");
192
- f[3] = f[3] ^ 1;
193
- assert.equal((await run("trailer.proof.json", f)).category, "NO_MATCH");
194
- const c = bytes("fused-trailer.bin");
195
- c[c.length - 1] = c[c.length - 1] ^ 1; // a commitment byte
196
- assert.equal((await run("trailer.proof.json", c)).category, "NO_MATCH");
197
- });
198
- test("reformatting only the outer Frame changes nothing", async () => {
199
- const pretty = text("trailer.bitgraph-fuse.json");
200
- const compact = JSON.stringify(JSON.parse(pretty));
201
- const a = await run("trailer.proof.json", bytes("fused-trailer.bin"), { frame: pretty });
202
- const b = await run("trailer.proof.json", bytes("fused-trailer.bin"), { frame: compact });
203
- assert.deepEqual(a, b);
204
- assert.equal(a.category, "FUSED_DIRECT");
205
- });
206
- test("the ordinary verifier still accepts every fixture proof unchanged", async () => {
207
- for (const name of ["recorded", "trailer", "container", "produced-origin", "produced-bare", "trailer-undeclared", "wrong-slot", "unregistered"]) {
208
- resetEpochLinkState();
209
- const v = await verifyProofIntegrity({ proof: proofOf(`${name}.proof.json`) });
210
- assert.equal(v.valid, true, `${name}: ${v.reason ?? ""}`);
211
- }
212
- });
213
- test("the span policy reports separately and never changes the category", async () => {
214
- const r = await run("trailer.proof.json", bytes("fused-trailer.bin"), { maxPositions: 0 });
215
- assert.equal(r.category, "FUSED_DIRECT");
216
- assert.equal(r.policy.spanExceeded, true);
217
- assert.equal(r.policy.maxPositions, "0");
218
- const ok = await run("trailer.proof.json", bytes("fused-trailer.bin"), { maxPositions: 1_000_000 });
219
- assert.equal(ok.policy.spanExceeded, false);
220
- });
221
- test("a trust policy still applies to the underlying proof", async () => {
222
- const r = await run("trailer.proof.json", bytes("fused-trailer.bin"), { trustAnchors: { allowedMeasurements: ["00".repeat(48)] } });
223
- assert.equal(r.category, "INVALID_UNDERLYING_PROOF");
224
- assert.match(r.reason, /measurement/i);
225
- });
226
- });
227
- describe("strict ordering (spec 12.2)", () => {
228
- test("recorded A, then fused B allocated after A committed: B assembled after A", () => {
229
- const a = proofOf("recorded.proof.json");
230
- const b = proofOf("trailer.proof.json");
231
- assert.equal(assembledAfterCommit(a, b), true);
232
- });
233
- test("slot held across an ordinary commit: the strict rule does not claim B after A", () => {
234
- const a = proofOf("order-held.proof.json");
235
- const b = proofOf("order-fused-during-hold.proof.json");
236
- assert.ok(BigInt(b.commit.slotCounter) < BigInt(a.commit.counter), "fixture: B's slot precedes A's commit");
237
- assert.ok(BigInt(a.commit.counter) < BigInt(b.commit.counter), "fixture: A committed before B");
238
- assert.equal(assembledAfterCommit(a, b), false);
239
- });
240
- test("incomparable proofs answer null", () => {
241
- const a = proofOf("recorded.proof.json");
242
- const b = structuredClone(proofOf("trailer.proof.json"));
243
- b.commit.epochId = bytesToBase64(new Uint8Array(32).fill(5));
244
- assert.equal(assembledAfterCommit(a, b), null);
245
- const c = structuredClone(proofOf("trailer.proof.json"));
246
- c.signer.publicKeyB64 = bytesToBase64(new Uint8Array(32).fill(6));
247
- assert.equal(assembledAfterCommit(a, c), null);
248
- });
249
- });
250
- //# sourceMappingURL=fuse-verify.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fuse-verify.test.js","sourceRoot":"","sources":["../../src/__tests__/fuse-verify.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=hello-world.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hello-world.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hello-world.test.ts"],"names":[],"mappings":""}
@@ -1,9 +0,0 @@
1
- // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
- import { describe, test } from "node:test";
3
- import * as assert from "node:assert/strict";
4
- describe("hello world", () => {
5
- test("passes", () => {
6
- assert.strictEqual("hello world", "hello world");
7
- });
8
- });
9
- //# sourceMappingURL=hello-world.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hello-world.test.js","sourceRoot":"","sources":["../../src/__tests__/hello-world.test.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Shared mock proof fixture.
3
- *
4
- * Extracted verbatim from proof-hash.test.ts (values unchanged, byte for
5
- * byte) so other suites can import the fixture without importing a test
6
- * file (which would re-register its suites under node:test).
7
- *
8
- * Placeholder values throughout: the digest, keys, and signatures are not
9
- * real base64 crypto material. It is a canonical-hash and ingest fixture;
10
- * it fails full verification by design, always for a precise non-version
11
- * reason (the placeholder digest is not strict base64), never as a pass.
12
- */
13
- import type { BitGraphProof } from "../index.js";
14
- export declare const MOCK_PROOF: BitGraphProof;
15
- //# sourceMappingURL=mock-proof-fixture.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-proof-fixture.d.ts","sourceRoot":"","sources":["../../src/__tests__/mock-proof-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,UAAU,EAAE,aAoBxB,CAAC"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Shared mock proof fixture.
3
- *
4
- * Extracted verbatim from proof-hash.test.ts (values unchanged, byte for
5
- * byte) so other suites can import the fixture without importing a test
6
- * file (which would re-register its suites under node:test).
7
- *
8
- * Placeholder values throughout: the digest, keys, and signatures are not
9
- * real base64 crypto material. It is a canonical-hash and ingest fixture;
10
- * it fails full verification by design, always for a precise non-version
11
- * reason (the placeholder digest is not strict base64), never as a pass.
12
- */
13
- export const MOCK_PROOF = {
14
- version: "bitgraph/1",
15
- artifact: { hashAlg: "sha256", digestB64: "abc123==" },
16
- commit: {
17
- nonceB64: "nonce==",
18
- counter: "42",
19
- slotCounter: "41",
20
- epochId: "epoch==",
21
- prevB64: "prev==",
22
- },
23
- signer: {
24
- publicKeyB64: "pubkey==",
25
- signatureB64: "sig==",
26
- },
27
- environment: {
28
- enforcement: "measured-tee",
29
- measurement: "pcr0hash",
30
- attestation: { format: "aws-nitro", reportB64: "report==" },
31
- },
32
- attribution: { name: "test", message: "hello" },
33
- };
34
- //# sourceMappingURL=mock-proof-fixture.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-proof-fixture.js","sourceRoot":"","sources":["../../src/__tests__/mock-proof-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE;IACtD,MAAM,EAAE;QACN,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,QAAQ;KAClB;IACD,MAAM,EAAE;QACN,YAAY,EAAE,UAAU;QACxB,YAAY,EAAE,OAAO;KACtB;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;KAC5D;IACD,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;CAChD,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=policy-enforcement.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy-enforcement.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/policy-enforcement.test.ts"],"names":[],"mappings":""}