@mikeargento/bitgraph 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +49 -40
  2. package/dist/__tests__/audit-anchors.test.d.ts +2 -0
  3. package/dist/__tests__/audit-anchors.test.d.ts.map +1 -0
  4. package/dist/__tests__/audit-anchors.test.js +152 -0
  5. package/dist/__tests__/audit-anchors.test.js.map +1 -0
  6. package/dist/__tests__/audit-anomalies.test.d.ts +2 -0
  7. package/dist/__tests__/audit-anomalies.test.d.ts.map +1 -0
  8. package/dist/__tests__/audit-anomalies.test.js +663 -0
  9. package/dist/__tests__/audit-anomalies.test.js.map +1 -0
  10. package/dist/__tests__/audit-attestation.test.d.ts +2 -0
  11. package/dist/__tests__/audit-attestation.test.d.ts.map +1 -0
  12. package/dist/__tests__/audit-attestation.test.js +403 -0
  13. package/dist/__tests__/audit-attestation.test.js.map +1 -0
  14. package/dist/__tests__/audit-bench-smoke.test.d.ts +2 -0
  15. package/dist/__tests__/audit-bench-smoke.test.d.ts.map +1 -0
  16. package/dist/__tests__/audit-bench-smoke.test.js +87 -0
  17. package/dist/__tests__/audit-bench-smoke.test.js.map +1 -0
  18. package/dist/__tests__/audit-boundary.test.d.ts +20 -0
  19. package/dist/__tests__/audit-boundary.test.d.ts.map +1 -0
  20. package/dist/__tests__/audit-boundary.test.js +84 -0
  21. package/dist/__tests__/audit-boundary.test.js.map +1 -0
  22. package/dist/__tests__/audit-cli.test.d.ts +2 -0
  23. package/dist/__tests__/audit-cli.test.d.ts.map +1 -0
  24. package/dist/__tests__/audit-cli.test.js +239 -0
  25. package/dist/__tests__/audit-cli.test.js.map +1 -0
  26. package/dist/__tests__/audit-dependencies.test.d.ts +2 -0
  27. package/dist/__tests__/audit-dependencies.test.d.ts.map +1 -0
  28. package/dist/__tests__/audit-dependencies.test.js +116 -0
  29. package/dist/__tests__/audit-dependencies.test.js.map +1 -0
  30. package/dist/__tests__/audit-fixtures.d.ts +265 -0
  31. package/dist/__tests__/audit-fixtures.d.ts.map +1 -0
  32. package/dist/__tests__/audit-fixtures.js +511 -0
  33. package/dist/__tests__/audit-fixtures.js.map +1 -0
  34. package/dist/__tests__/audit-ingest.test.d.ts +2 -0
  35. package/dist/__tests__/audit-ingest.test.d.ts.map +1 -0
  36. package/dist/__tests__/audit-ingest.test.js +473 -0
  37. package/dist/__tests__/audit-ingest.test.js.map +1 -0
  38. package/dist/__tests__/audit-memory-ingest.test.d.ts +12 -0
  39. package/dist/__tests__/audit-memory-ingest.test.d.ts.map +1 -0
  40. package/dist/__tests__/audit-memory-ingest.test.js +120 -0
  41. package/dist/__tests__/audit-memory-ingest.test.js.map +1 -0
  42. package/dist/__tests__/audit-property.test.d.ts +2 -0
  43. package/dist/__tests__/audit-property.test.d.ts.map +1 -0
  44. package/dist/__tests__/audit-property.test.js +771 -0
  45. package/dist/__tests__/audit-property.test.js.map +1 -0
  46. package/dist/__tests__/audit-real-fixtures.test.d.ts +2 -0
  47. package/dist/__tests__/audit-real-fixtures.test.d.ts.map +1 -0
  48. package/dist/__tests__/audit-real-fixtures.test.js +132 -0
  49. package/dist/__tests__/audit-real-fixtures.test.js.map +1 -0
  50. package/dist/__tests__/audit-real-live.test.d.ts +2 -0
  51. package/dist/__tests__/audit-real-live.test.d.ts.map +1 -0
  52. package/dist/__tests__/audit-real-live.test.js +107 -0
  53. package/dist/__tests__/audit-real-live.test.js.map +1 -0
  54. package/dist/__tests__/audit-reconstruct.test.d.ts +2 -0
  55. package/dist/__tests__/audit-reconstruct.test.d.ts.map +1 -0
  56. package/dist/__tests__/audit-reconstruct.test.js +287 -0
  57. package/dist/__tests__/audit-reconstruct.test.js.map +1 -0
  58. package/dist/__tests__/audit-report.test.d.ts +2 -0
  59. package/dist/__tests__/audit-report.test.d.ts.map +1 -0
  60. package/dist/__tests__/audit-report.test.js +186 -0
  61. package/dist/__tests__/audit-report.test.js.map +1 -0
  62. package/dist/__tests__/audit-roundtrip.test.d.ts +2 -0
  63. package/dist/__tests__/audit-roundtrip.test.d.ts.map +1 -0
  64. package/dist/__tests__/audit-roundtrip.test.js +368 -0
  65. package/dist/__tests__/audit-roundtrip.test.js.map +1 -0
  66. package/dist/__tests__/audit-temporal.test.d.ts +2 -0
  67. package/dist/__tests__/audit-temporal.test.d.ts.map +1 -0
  68. package/dist/__tests__/audit-temporal.test.js +364 -0
  69. package/dist/__tests__/audit-temporal.test.js.map +1 -0
  70. package/dist/__tests__/audit-tiers.test.d.ts +2 -0
  71. package/dist/__tests__/audit-tiers.test.d.ts.map +1 -0
  72. package/dist/__tests__/audit-tiers.test.js +282 -0
  73. package/dist/__tests__/audit-tiers.test.js.map +1 -0
  74. package/dist/__tests__/audit-witness-real.test.d.ts +19 -0
  75. package/dist/__tests__/audit-witness-real.test.d.ts.map +1 -0
  76. package/dist/__tests__/audit-witness-real.test.js +82 -0
  77. package/dist/__tests__/audit-witness-real.test.js.map +1 -0
  78. package/dist/__tests__/audit-witness.test.d.ts +2 -0
  79. package/dist/__tests__/audit-witness.test.d.ts.map +1 -0
  80. package/dist/__tests__/audit-witness.test.js +308 -0
  81. package/dist/__tests__/audit-witness.test.js.map +1 -0
  82. package/dist/__tests__/chain-hash-anchor.test.d.ts +22 -0
  83. package/dist/__tests__/chain-hash-anchor.test.d.ts.map +1 -0
  84. package/dist/__tests__/chain-hash-anchor.test.js +55 -0
  85. package/dist/__tests__/chain-hash-anchor.test.js.map +1 -0
  86. package/dist/__tests__/declared-proof-fixture.d.ts +66 -0
  87. package/dist/__tests__/declared-proof-fixture.d.ts.map +1 -0
  88. package/dist/__tests__/declared-proof-fixture.js +66 -0
  89. package/dist/__tests__/declared-proof-fixture.js.map +1 -0
  90. package/dist/__tests__/mock-proof-fixture.d.ts +15 -0
  91. package/dist/__tests__/mock-proof-fixture.d.ts.map +1 -0
  92. package/dist/__tests__/mock-proof-fixture.js +34 -0
  93. package/dist/__tests__/mock-proof-fixture.js.map +1 -0
  94. package/dist/__tests__/proof-hash-regression.test.js +4 -43
  95. package/dist/__tests__/proof-hash-regression.test.js.map +1 -1
  96. package/dist/__tests__/proof-hash.test.js +3 -21
  97. package/dist/__tests__/proof-hash.test.js.map +1 -1
  98. package/dist/__tests__/proof-integrity.test.d.ts +2 -0
  99. package/dist/__tests__/proof-integrity.test.d.ts.map +1 -0
  100. package/dist/__tests__/proof-integrity.test.js +426 -0
  101. package/dist/__tests__/proof-integrity.test.js.map +1 -0
  102. package/dist/__tests__/realistic-proof-fixture.d.ts +56 -0
  103. package/dist/__tests__/realistic-proof-fixture.d.ts.map +1 -0
  104. package/dist/__tests__/realistic-proof-fixture.js +57 -0
  105. package/dist/__tests__/realistic-proof-fixture.js.map +1 -0
  106. package/dist/__tests__/verifier.test.js +74 -0
  107. package/dist/__tests__/verifier.test.js.map +1 -1
  108. package/package.json +10 -5
  109. package/src/__tests__/audit-anchors.test.ts +188 -0
  110. package/src/__tests__/audit-anomalies.test.ts +815 -0
  111. package/src/__tests__/audit-attestation.test.ts +529 -0
  112. package/src/__tests__/audit-bench-smoke.test.ts +108 -0
  113. package/src/__tests__/audit-boundary.test.ts +96 -0
  114. package/src/__tests__/audit-cli.test.ts +288 -0
  115. package/src/__tests__/audit-dependencies.test.ts +141 -0
  116. package/src/__tests__/audit-fixtures.ts +736 -0
  117. package/src/__tests__/audit-ingest.test.ts +575 -0
  118. package/src/__tests__/audit-memory-ingest.test.ts +140 -0
  119. package/src/__tests__/audit-property.test.ts +892 -0
  120. package/src/__tests__/audit-real-fixtures.test.ts +153 -0
  121. package/src/__tests__/audit-real-live.test.ts +128 -0
  122. package/src/__tests__/audit-reconstruct.test.ts +353 -0
  123. package/src/__tests__/audit-report.test.ts +222 -0
  124. package/src/__tests__/audit-roundtrip.test.ts +464 -0
  125. package/src/__tests__/audit-temporal.test.ts +446 -0
  126. package/src/__tests__/audit-tiers.test.ts +343 -0
  127. package/src/__tests__/audit-witness-real.test.ts +92 -0
  128. package/src/__tests__/audit-witness.test.ts +345 -0
  129. package/src/__tests__/chain-hash-anchor.test.ts +67 -0
  130. package/src/__tests__/declared-proof-fixture.ts +65 -0
  131. package/src/__tests__/mock-proof-fixture.ts +36 -0
  132. package/src/__tests__/proof-hash-regression.test.ts +4 -44
  133. package/src/__tests__/proof-hash.test.ts +3 -22
  134. package/src/__tests__/proof-integrity.test.ts +541 -0
  135. package/src/__tests__/real-fixtures/anchor-after-112762.json +47 -0
  136. package/src/__tests__/real-fixtures/anchor-with-ethereum-112758.json +47 -0
  137. package/src/__tests__/real-fixtures/live-proof-0.json +42 -0
  138. package/src/__tests__/real-fixtures/live-proof-1.json +43 -0
  139. package/src/__tests__/real-fixtures/live-proof-2.json +43 -0
  140. package/src/__tests__/real-fixtures/successor-112760.json +38 -0
  141. package/src/__tests__/real-fixtures/witness-25525146.json +6 -0
  142. package/src/__tests__/real-fixtures/witness-25525147.json +6 -0
  143. package/src/__tests__/realistic-proof-fixture.ts +57 -0
  144. package/src/__tests__/verifier.test.ts +83 -0
@@ -0,0 +1,511 @@
1
+ // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
+ /**
3
+ * Shared fixture helpers for the bitgraph-audit test suites.
4
+ *
5
+ * Proofs that must be verifier-valid are built either through the root
6
+ * Constructor (real commit path) or by manually signing the exact
7
+ * canonical SignedBody layout with real Ed25519 keys, the same approach
8
+ * as src/__tests__/proof-integrity.test.ts. Verifier semantics are never
9
+ * bypassed.
10
+ *
11
+ * Also provides a minimal in-memory tar writer (ustar, PAX path records,
12
+ * GNU long-name entries) so container tests never shell out.
13
+ */
14
+ import { mkdir, mkdtemp, writeFile } from "node:fs/promises";
15
+ import { tmpdir } from "node:os";
16
+ import { dirname, join } from "node:path";
17
+ import { getPublicKeyAsync, signAsync } from "@noble/ed25519";
18
+ import { sha256 } from "@noble/hashes/sha256";
19
+ import { keccak_256 } from "@noble/hashes/sha3";
20
+ import { canonicalize, computeProofHash, computeChainHash } from "@mikeargento/bitgraph-verify";
21
+ import { Constructor } from "../constructor.js";
22
+ // ---------------------------------------------------------------------------
23
+ // Encoding helpers
24
+ // ---------------------------------------------------------------------------
25
+ export function b64(bytes) {
26
+ return Buffer.from(bytes).toString("base64");
27
+ }
28
+ export function utf8(text) {
29
+ return new TextEncoder().encode(text);
30
+ }
31
+ const defaultRandom = (n) => crypto.getRandomValues(new Uint8Array(n));
32
+ export async function makeKey(random) {
33
+ const privateKey = (random ?? defaultRandom)(32);
34
+ const publicKeyB64 = b64(await getPublicKeyAsync(privateKey));
35
+ return { privateKey, publicKeyB64 };
36
+ }
37
+ /**
38
+ * Manually build and sign a proof over the exact canonical SignedBody the
39
+ * verifier reconstructs. The commit object may carry extra fields (for
40
+ * example the live enclave's undeclared chainId); because it is part of
41
+ * the signed body, the signature covers them.
42
+ *
43
+ * Optional extras follow the canonical SignedBody rules: attribution is
44
+ * included in the signed body when provided; attestationFormat is
45
+ * included when an attestation is provided (the reportB64 itself stays
46
+ * OUTSIDE the signed body, exactly like the enclave output, so the
47
+ * report can be attached or swapped after signing without changing the
48
+ * canonical hash).
49
+ */
50
+ export async function signBody(key, artifact, commit, measurement, extras) {
51
+ const signedBody = {
52
+ version: "bitgraph/1",
53
+ artifact,
54
+ commit,
55
+ publicKeyB64: key.publicKeyB64,
56
+ enforcement: "stub",
57
+ measurement,
58
+ };
59
+ if (extras?.attribution !== undefined)
60
+ signedBody["attribution"] = extras.attribution;
61
+ if (extras?.attestation !== undefined)
62
+ signedBody["attestationFormat"] = extras.attestation.format;
63
+ const signatureB64 = b64(await signAsync(canonicalize(signedBody), key.privateKey));
64
+ const proof = {
65
+ version: "bitgraph/1",
66
+ artifact,
67
+ commit,
68
+ signer: { publicKeyB64: key.publicKeyB64, signatureB64 },
69
+ environment: {
70
+ enforcement: "stub",
71
+ measurement,
72
+ ...(extras?.attestation !== undefined
73
+ ? { attestation: { format: extras.attestation.format, reportB64: extras.attestation.reportB64 } }
74
+ : {}),
75
+ },
76
+ };
77
+ if (extras?.attribution !== undefined) {
78
+ proof["attribution"] = extras.attribution;
79
+ }
80
+ return proof;
81
+ }
82
+ /**
83
+ * Build a proof through the root Constructor (the real commit path).
84
+ * Default fixtures are chainless: no counter, no epochId.
85
+ */
86
+ export async function makeConstructorProof(opts) {
87
+ const privateKey = crypto.getRandomValues(new Uint8Array(32));
88
+ const publicKeyBytes = await getPublicKeyAsync(privateKey);
89
+ const measurement = "test-measurement-audit";
90
+ let counter = 0;
91
+ const base = {
92
+ enforcementTier: "stub",
93
+ getMeasurement: async () => measurement,
94
+ getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
95
+ sign: async (data) => signAsync(data, privateKey),
96
+ getPublicKey: async () => publicKeyBytes,
97
+ };
98
+ const host = opts?.withCounter
99
+ ? { ...base, nextCounter: async () => String(++counter) }
100
+ : base;
101
+ const ctor = await Constructor.initialize(opts?.epochId !== undefined ? { host, epochId: opts.epochId } : { host });
102
+ const bytes = utf8(opts?.payload ?? "bitgraph-audit-test-payload");
103
+ const proof = await ctor.commit({ bytes });
104
+ return { proof, bytes };
105
+ }
106
+ /**
107
+ * Build a verifier-valid proof carrying a chainId inside the signed
108
+ * commit body, matching what the live enclave injects for non-default
109
+ * chains.
110
+ */
111
+ export async function makeChainIdProof(opts) {
112
+ const key = await makeKey();
113
+ const bytes = utf8(opts?.payload ?? "bitgraph-audit-chainid-payload");
114
+ const commit = {
115
+ nonceB64: b64(crypto.getRandomValues(new Uint8Array(16))),
116
+ ...(opts?.counter !== undefined ? { counter: opts.counter } : {}),
117
+ ...(opts?.epochId !== undefined ? { epochId: opts.epochId } : {}),
118
+ };
119
+ commit["chainId"] = opts?.chainId ?? "bitgraph:main";
120
+ const proof = await signBody(key, { hashAlg: "sha256", digestB64: b64(sha256(bytes)) }, commit, "test-measurement-chainid");
121
+ return { proof, bytes };
122
+ }
123
+ /**
124
+ * Build a verifier-valid epoch-genesis proof carrying an epochLink that
125
+ * consumes the given predecessor into the given successor epoch.
126
+ *
127
+ * By default the predecessor key is a fresh random key; pass
128
+ * prevPublicKeyB64 to reference the actual signer of an observed
129
+ * predecessor. Optional counter, slotCounter, prevB64, and chainId land
130
+ * in the signed commit body, matching real enclave output shapes.
131
+ */
132
+ export async function makeEpochLinkProof(opts) {
133
+ const random = opts.random ?? defaultRandom;
134
+ const key = opts.key ?? (await makeKey(random));
135
+ const prevPublicKeyB64 = opts.prevPublicKeyB64 ?? (await makeKey(random)).publicKeyB64;
136
+ const bytes = utf8(opts.payload ?? `bitgraph-audit-epochlink-${opts.toEpochId}`);
137
+ const commit = {
138
+ nonceB64: b64(random(16)),
139
+ ...(opts.counter !== undefined ? { counter: opts.counter } : {}),
140
+ ...(opts.slotCounter !== undefined ? { slotCounter: opts.slotCounter } : {}),
141
+ ...(opts.prevB64 !== undefined ? { prevB64: opts.prevB64 } : {}),
142
+ epochId: opts.toEpochId,
143
+ epochLink: {
144
+ prevEpochId: opts.prevEpochId,
145
+ prevPublicKeyB64,
146
+ prevCounter: opts.prevCounter,
147
+ prevProofHashB64: opts.prevProofHashB64,
148
+ toEpochId: opts.toEpochId,
149
+ toPublicKeyB64: key.publicKeyB64,
150
+ },
151
+ };
152
+ if (opts.chainId !== undefined) {
153
+ commit["chainId"] = opts.chainId;
154
+ }
155
+ const proof = await signBody(key, { hashAlg: "sha256", digestB64: b64(sha256(bytes)) }, commit, opts.measurement ?? "test-measurement-epochlink");
156
+ return { proof, bytes, proofHash: computeProofHash(proof), chainHash: computeChainHash(proof), key };
157
+ }
158
+ /**
159
+ * Build a linked chain of verifier-valid proofs under one signer key,
160
+ * epoch, and chain, with explicit counter positions per proof. Each
161
+ * non-first proof carries prevB64 equal to the canonical proof hash of
162
+ * its predecessor; the first proof omits prevB64 entirely (genesis per
163
+ * G1) unless prevB64OfFirst continues the chain from an existing proof.
164
+ * Pass pairs like real enclave output (slot 1/commit 2, slot 3/
165
+ * commit 4, ...) or leave positions out for counterless link chains.
166
+ */
167
+ export async function makeCounterChain(opts) {
168
+ const random = opts.random ?? defaultRandom;
169
+ const key = opts.key ?? (await makeKey(random));
170
+ const measurement = opts.measurement ?? "test-measurement-chain";
171
+ const proofs = [];
172
+ for (let i = 0; i < opts.pairs.length; i++) {
173
+ const pair = opts.pairs[i];
174
+ const bytes = utf8(`${opts.payloadPrefix ?? opts.epochId}-payload-${i}`);
175
+ const prevB64 = i > 0 ? proofs[i - 1].chainHash : opts.prevB64OfFirst;
176
+ const commit = {
177
+ nonceB64: b64(random(16)),
178
+ ...(pair.commit !== undefined ? { counter: pair.commit } : {}),
179
+ ...(pair.slot !== undefined ? { slotCounter: pair.slot } : {}),
180
+ ...(prevB64 !== undefined ? { prevB64 } : {}),
181
+ epochId: opts.epochId,
182
+ };
183
+ if (opts.chainId !== undefined) {
184
+ commit["chainId"] = opts.chainId;
185
+ }
186
+ const proof = await signBody(key, { hashAlg: "sha256", digestB64: b64(sha256(bytes)) }, commit, measurement);
187
+ proofs.push({ proof, bytes, proofHash: computeProofHash(proof), chainHash: computeChainHash(proof) });
188
+ }
189
+ return { key, proofs };
190
+ }
191
+ /**
192
+ * The standard healthy enclave counter sequence: slot 1/commit 2,
193
+ * slot 3/commit 4, ... for `length` proofs.
194
+ */
195
+ export function healthyPairs(length) {
196
+ const pairs = [];
197
+ for (let i = 0; i < length; i++) {
198
+ pairs.push({ slot: String(2 * i + 1), commit: String(2 * i + 2) });
199
+ }
200
+ return pairs;
201
+ }
202
+ // ---------------------------------------------------------------------------
203
+ // Ethereum anchor fixtures (matching packages/hosted/src/bitcoin-anchor.ts)
204
+ // ---------------------------------------------------------------------------
205
+ /**
206
+ * Build a verifier-valid Ethereum anchor proof: signed attribution
207
+ * name "Ethereum Anchor", message = the block hash string, title = the
208
+ * Etherscan block URL, artifact digest = SHA-256 over the block-hash
209
+ * STRING (exactly like bitcoin-anchor.ts lines 188-189). Unsigned
210
+ * metadata is attached after signing when provided.
211
+ */
212
+ export async function makeAnchorProof(opts) {
213
+ const random = opts.random ?? defaultRandom;
214
+ const key = opts.key ?? (await makeKey(random));
215
+ const commit = {
216
+ nonceB64: b64(random(16)),
217
+ ...(opts.counter !== undefined ? { counter: opts.counter } : {}),
218
+ ...(opts.slotCounter !== undefined ? { slotCounter: opts.slotCounter } : {}),
219
+ ...(opts.prevB64 !== undefined ? { prevB64: opts.prevB64 } : {}),
220
+ ...(opts.epochId !== undefined ? { epochId: opts.epochId } : {}),
221
+ };
222
+ if (opts.chainId !== undefined) {
223
+ commit["chainId"] = opts.chainId;
224
+ }
225
+ const attribution = {
226
+ name: opts.attributionName ?? "Ethereum Anchor",
227
+ message: opts.blockHash,
228
+ };
229
+ if (opts.noTitle !== true) {
230
+ attribution.title = opts.title ?? `https://etherscan.io/block/${opts.blockNumber ?? 0}`;
231
+ }
232
+ const proof = await signBody(key, {
233
+ hashAlg: "sha256",
234
+ digestB64: opts.digestB64 ?? b64(sha256(utf8(opts.blockHash))),
235
+ }, commit, opts.measurement ?? "test-measurement-anchor", { attribution });
236
+ if (opts.metadata !== undefined) {
237
+ proof["metadata"] = opts.metadata;
238
+ }
239
+ return { proof, proofHash: computeProofHash(proof), chainHash: computeChainHash(proof), key };
240
+ }
241
+ export function encodeRlp(item) {
242
+ if (item instanceof Uint8Array) {
243
+ if (item.length === 1 && item[0] < 0x80)
244
+ return item;
245
+ return concatBytes([encodeRlpLength(item.length, 0x80), item]);
246
+ }
247
+ const payload = concatBytes(item.map(encodeRlp));
248
+ return concatBytes([encodeRlpLength(payload.length, 0xc0), payload]);
249
+ }
250
+ function encodeRlpLength(length, offset) {
251
+ if (length <= 55)
252
+ return new Uint8Array([offset + length]);
253
+ const bytes = [];
254
+ let v = length;
255
+ while (v > 0) {
256
+ bytes.unshift(v & 0xff);
257
+ v = Math.floor(v / 256);
258
+ }
259
+ return new Uint8Array([offset + 55 + bytes.length, ...bytes]);
260
+ }
261
+ /** Minimal big-endian bytes of a non-negative integer; empty for zero (Ethereum header integer encoding). */
262
+ export function beBytes(value) {
263
+ let v = BigInt(value);
264
+ const bytes = [];
265
+ while (v > 0n) {
266
+ bytes.unshift(Number(v & 0xffn));
267
+ v >>= 8n;
268
+ }
269
+ return new Uint8Array(bytes);
270
+ }
271
+ /**
272
+ * Build a synthetic 20-item RLP block header with the number at index 8
273
+ * and the timestamp at index 11 (the stable Ethereum header positions).
274
+ * Other items are deterministic filler byte strings.
275
+ */
276
+ export function makeEthereumHeader(opts) {
277
+ const count = opts.itemCount ?? 20;
278
+ const items = [];
279
+ for (let i = 0; i < count; i++) {
280
+ if (i === 8)
281
+ items.push(beBytes(opts.blockNumber));
282
+ else if (i === 11)
283
+ items.push(beBytes(opts.timestamp));
284
+ else
285
+ items.push(new Uint8Array(32).fill(i + 1));
286
+ }
287
+ const headerBytes = encodeRlp(items);
288
+ return {
289
+ headerBytes,
290
+ headerRlpHex: `0x${Buffer.from(headerBytes).toString("hex")}`,
291
+ };
292
+ }
293
+ /** JSON string of a bitgraph-anchor-witness/1 file. */
294
+ export function witnessJson(opts) {
295
+ const witness = { version: "bitgraph-anchor-witness/1" };
296
+ if (!(opts.omit ?? []).includes("headerRlpHex"))
297
+ witness["headerRlpHex"] = opts.headerRlpHex;
298
+ if (!(opts.omit ?? []).includes("blockNumber"))
299
+ witness["blockNumber"] = opts.blockNumber;
300
+ if (!(opts.omit ?? []).includes("blockHash"))
301
+ witness["blockHash"] = opts.blockHash;
302
+ if (opts.network !== undefined)
303
+ witness["network"] = opts.network;
304
+ return JSON.stringify(witness);
305
+ }
306
+ // ---------------------------------------------------------------------------
307
+ // Bundle-on-disk helpers
308
+ // ---------------------------------------------------------------------------
309
+ export async function makeTempDir(prefix) {
310
+ return mkdtemp(join(tmpdir(), prefix));
311
+ }
312
+ /**
313
+ * Write a bundle directory from a path -> content map. Paths use "/"
314
+ * separators; parent directories are created as needed.
315
+ */
316
+ export async function writeBundleDir(root, files) {
317
+ for (const [relPath, content] of Object.entries(files)) {
318
+ const abs = join(root, ...relPath.split("/"));
319
+ await mkdir(dirname(abs), { recursive: true });
320
+ await writeFile(abs, typeof content === "string" ? utf8(content) : content);
321
+ }
322
+ }
323
+ /** Build a complete tar archive in memory (ustar, PAX, GNU long-name). */
324
+ export function makeTar(entries) {
325
+ const parts = [];
326
+ for (const entry of entries) {
327
+ const content = typeof entry.content === "string" ? utf8(entry.content) : entry.content;
328
+ if (entry.paxPath !== undefined) {
329
+ const record = paxRecord("path", entry.paxPath);
330
+ const declaredSize = entry.paxHeaderDeclaredSize ?? record.length;
331
+ parts.push(tarHeaderBlock("PaxHeaders.0/entry", declaredSize, "x"), padTo512(record));
332
+ }
333
+ if (entry.gnuLongName !== undefined) {
334
+ const nameBytes = utf8(`${entry.gnuLongName}\0`);
335
+ parts.push(tarHeaderBlock("././@LongLink", nameBytes.length, "L"), padTo512(nameBytes));
336
+ }
337
+ parts.push(tarHeaderBlock(entry.name, content.length, entry.typeflag ?? "0"), padTo512(content));
338
+ }
339
+ parts.push(new Uint8Array(512), new Uint8Array(512));
340
+ return concatBytes(parts);
341
+ }
342
+ function tarHeaderBlock(name, size, typeflag) {
343
+ const block = new Uint8Array(512);
344
+ const ascii = (text, offset, length) => {
345
+ const bytes = utf8(text);
346
+ block.set(bytes.subarray(0, Math.min(bytes.length, length)), offset);
347
+ };
348
+ ascii(name, 0, 100);
349
+ block.set(octalField(0o644, 8), 100); // mode
350
+ block.set(octalField(0, 8), 108); // uid
351
+ block.set(octalField(0, 8), 116); // gid
352
+ block.set(octalField(size, 12), 124); // size
353
+ block.set(octalField(0, 12), 136); // mtime
354
+ for (let i = 148; i < 156; i++)
355
+ block[i] = 0x20; // checksum spaces
356
+ block[156] = typeflag.charCodeAt(0);
357
+ ascii("ustar", 257, 6); // magic, NUL-terminated by the zero block
358
+ ascii("00", 263, 2); // version
359
+ let sum = 0;
360
+ for (let i = 0; i < 512; i++)
361
+ sum += block[i];
362
+ ascii(sum.toString(8).padStart(6, "0"), 148, 6);
363
+ block[154] = 0;
364
+ block[155] = 0x20;
365
+ return block;
366
+ }
367
+ function octalField(value, length) {
368
+ const out = new Uint8Array(length);
369
+ const text = value.toString(8).padStart(length - 1, "0");
370
+ for (let i = 0; i < text.length; i++)
371
+ out[i] = text.charCodeAt(i);
372
+ out[length - 1] = 0;
373
+ return out;
374
+ }
375
+ /** PAX record: "<len> <key>=<value>\n" where len counts the whole record. */
376
+ function paxRecord(key, value) {
377
+ const baseBytes = utf8(` ${key}=${value}\n`);
378
+ let length = baseBytes.length + 1;
379
+ while (String(length).length + baseBytes.length !== length) {
380
+ length = String(length).length + baseBytes.length;
381
+ }
382
+ return concatBytes([utf8(String(length)), baseBytes]);
383
+ }
384
+ function padTo512(content) {
385
+ const padding = (512 - (content.length % 512)) % 512;
386
+ if (padding === 0)
387
+ return content;
388
+ const out = new Uint8Array(content.length + padding);
389
+ out.set(content, 0);
390
+ return out;
391
+ }
392
+ function concatBytes(parts) {
393
+ const total = parts.reduce((sum, part) => sum + part.length, 0);
394
+ const out = new Uint8Array(total);
395
+ let offset = 0;
396
+ for (const part of parts) {
397
+ out.set(part, offset);
398
+ offset += part.length;
399
+ }
400
+ return out;
401
+ }
402
+ // ---------------------------------------------------------------------------
403
+ // Serialization helpers
404
+ // ---------------------------------------------------------------------------
405
+ /** Compact JSON serialization of a proof, the usual on-disk form. */
406
+ export function proofJson(proof) {
407
+ return JSON.stringify(proof);
408
+ }
409
+ /** Stored form: the proof with a trailing proofHash field, as the ledger serves it. */
410
+ export function storedProofJson(proof, proofHash) {
411
+ return JSON.stringify({ ...proof, proofHash });
412
+ }
413
+ /**
414
+ * Build the standard mixed bundle in a temp directory, per the Phase 4d
415
+ * brief: a healthy signed chain (4 proofs, slot/commit pairs 1..8) with
416
+ * one proof missing (index 1, producing an unexplained-position gap and
417
+ * a chain break), a predecessor-reuse fork off the chain tail, an occ/1
418
+ * unsupported-version reject, one artifact-present proof (chain genesis)
419
+ * and artifact-absent proofs (everything else), an Ethereum anchor in
420
+ * its own epoch with a valid offline witness, plus one exact-duplicate
421
+ * copy and one semantic-duplicate (stored-form) copy of the genesis.
422
+ */
423
+ export async function makeStandardAuditBundle() {
424
+ const dir = await makeTempDir("bitgraph-audit-standard-");
425
+ const epochId = "epoch-standard-main";
426
+ const anchorEpochId = "epoch-standard-anchor";
427
+ const chainId = "bitgraph:main";
428
+ const measurement = "test-measurement-chain";
429
+ const chain = await makeCounterChain({
430
+ epochId,
431
+ pairs: healthyPairs(4),
432
+ chainId,
433
+ measurement,
434
+ payloadPrefix: "standard-bundle",
435
+ });
436
+ const tail = chain.proofs[3];
437
+ const forkChild = async (slot, commit, payload) => {
438
+ const bytes = utf8(payload);
439
+ const commitBody = {
440
+ nonceB64: b64(crypto.getRandomValues(new Uint8Array(16))),
441
+ counter: commit,
442
+ slotCounter: slot,
443
+ prevB64: tail.chainHash,
444
+ epochId,
445
+ };
446
+ commitBody["chainId"] = chainId;
447
+ const proof = await signBody(chain.key, { hashAlg: "sha256", digestB64: b64(sha256(bytes)) }, commitBody, measurement);
448
+ return { proof, proofHash: computeProofHash(proof), chainHash: computeChainHash(proof) };
449
+ };
450
+ const forkA = await forkChild("9", "10", "standard-bundle-fork-a");
451
+ const forkB = await forkChild("11", "12", "standard-bundle-fork-b");
452
+ const blockNumber = 123456;
453
+ const blockTimestamp = 1_700_000_000;
454
+ const { headerBytes, headerRlpHex } = makeEthereumHeader({ blockNumber, timestamp: blockTimestamp });
455
+ const blockHash = `0x${Buffer.from(keccak_256(headerBytes)).toString("hex")}`;
456
+ const anchor = await makeAnchorProof({
457
+ blockHash,
458
+ blockNumber,
459
+ epochId: anchorEpochId,
460
+ counter: "2",
461
+ slotCounter: "1",
462
+ });
463
+ const unsupportedPath = "legacy/old.json";
464
+ const occProof = JSON.stringify({
465
+ version: "occ/1",
466
+ artifact: { hashAlg: "sha256", digestB64: "b2NjLWxlZ2FjeQ==" },
467
+ commit: { nonceB64: "b2NjLW5vbmNl" },
468
+ signer: { publicKeyB64: "b2NjLWtleQ==", signatureB64: "b2NjLXNpZw==" },
469
+ });
470
+ const genesis = chain.proofs[0];
471
+ await writeBundleDir(dir, {
472
+ "proofs/chain-0.json": proofJson(genesis.proof),
473
+ "proofs/chain-0-copy.json": proofJson(genesis.proof),
474
+ "proofs/chain-0-stored.json": storedProofJson(genesis.proof, genesis.proofHash),
475
+ // chain-1 (slot 3 / commit 4) is deliberately absent: the gap.
476
+ "proofs/chain-2.json": proofJson(chain.proofs[2].proof),
477
+ "proofs/chain-3.json": proofJson(tail.proof),
478
+ "proofs/fork-a.json": proofJson(forkA.proof),
479
+ "proofs/fork-b.json": proofJson(forkB.proof),
480
+ "proofs/anchor.json": proofJson(anchor.proof),
481
+ "witnesses/block.json": witnessJson({ headerRlpHex, blockNumber, blockHash }),
482
+ "artifacts/payload-0.bin": genesis.bytes,
483
+ [unsupportedPath]: occProof,
484
+ });
485
+ return {
486
+ dir,
487
+ epochId,
488
+ anchorEpochId,
489
+ chainId,
490
+ chainProofHashes: chain.proofs.map((p) => p.proofHash),
491
+ droppedProofHash: chain.proofs[1].proofHash,
492
+ forkAProofHash: forkA.proofHash,
493
+ forkBProofHash: forkB.proofHash,
494
+ anchorProofHash: anchor.proofHash,
495
+ blockNumber,
496
+ blockTimestamp,
497
+ unsupportedPath,
498
+ expected: {
499
+ observed: 6,
500
+ proofFiles: 8,
501
+ exactDuplicates: 1,
502
+ semanticDuplicates: 1,
503
+ unsupportedVersion: 1,
504
+ verified: 1,
505
+ failed: 0,
506
+ artifactUnavailable: 5,
507
+ chainless: 0,
508
+ },
509
+ };
510
+ }
511
+ //# sourceMappingURL=audit-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-fixtures.js","sourceRoot":"","sources":["../../src/__tests__/audit-fixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=audit-ingest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-ingest.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audit-ingest.test.ts"],"names":[],"mappings":""}