@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.
- package/README.md +21 -21
- package/dist/fuse-cli.js +2 -2
- package/dist/fuse-cli.js.map +1 -1
- package/dist/fuse.d.ts +15 -1
- package/dist/fuse.d.ts.map +1 -1
- package/dist/fuse.js +29 -12
- package/dist/fuse.js.map +1 -1
- package/package.json +12 -8
- package/src/fuse-cli.ts +2 -2
- package/src/fuse.ts +46 -13
- package/dist/__tests__/audit-anchors.test.d.ts +0 -2
- package/dist/__tests__/audit-anchors.test.d.ts.map +0 -1
- package/dist/__tests__/audit-anchors.test.js +0 -152
- package/dist/__tests__/audit-anchors.test.js.map +0 -1
- package/dist/__tests__/audit-anomalies.test.d.ts +0 -2
- package/dist/__tests__/audit-anomalies.test.d.ts.map +0 -1
- package/dist/__tests__/audit-anomalies.test.js +0 -663
- package/dist/__tests__/audit-anomalies.test.js.map +0 -1
- package/dist/__tests__/audit-attestation.test.d.ts +0 -2
- package/dist/__tests__/audit-attestation.test.d.ts.map +0 -1
- package/dist/__tests__/audit-attestation.test.js +0 -403
- package/dist/__tests__/audit-attestation.test.js.map +0 -1
- package/dist/__tests__/audit-bench-smoke.test.d.ts +0 -2
- package/dist/__tests__/audit-bench-smoke.test.d.ts.map +0 -1
- package/dist/__tests__/audit-bench-smoke.test.js +0 -87
- package/dist/__tests__/audit-bench-smoke.test.js.map +0 -1
- package/dist/__tests__/audit-boundary.test.d.ts +0 -20
- package/dist/__tests__/audit-boundary.test.d.ts.map +0 -1
- package/dist/__tests__/audit-boundary.test.js +0 -84
- package/dist/__tests__/audit-boundary.test.js.map +0 -1
- package/dist/__tests__/audit-cli.test.d.ts +0 -2
- package/dist/__tests__/audit-cli.test.d.ts.map +0 -1
- package/dist/__tests__/audit-cli.test.js +0 -239
- package/dist/__tests__/audit-cli.test.js.map +0 -1
- package/dist/__tests__/audit-dependencies.test.d.ts +0 -2
- package/dist/__tests__/audit-dependencies.test.d.ts.map +0 -1
- package/dist/__tests__/audit-dependencies.test.js +0 -116
- package/dist/__tests__/audit-dependencies.test.js.map +0 -1
- package/dist/__tests__/audit-fixtures.d.ts +0 -265
- package/dist/__tests__/audit-fixtures.d.ts.map +0 -1
- package/dist/__tests__/audit-fixtures.js +0 -511
- package/dist/__tests__/audit-fixtures.js.map +0 -1
- package/dist/__tests__/audit-ingest.test.d.ts +0 -2
- package/dist/__tests__/audit-ingest.test.d.ts.map +0 -1
- package/dist/__tests__/audit-ingest.test.js +0 -473
- package/dist/__tests__/audit-ingest.test.js.map +0 -1
- package/dist/__tests__/audit-memory-ingest.test.d.ts +0 -12
- package/dist/__tests__/audit-memory-ingest.test.d.ts.map +0 -1
- package/dist/__tests__/audit-memory-ingest.test.js +0 -135
- package/dist/__tests__/audit-memory-ingest.test.js.map +0 -1
- package/dist/__tests__/audit-property.test.d.ts +0 -2
- package/dist/__tests__/audit-property.test.d.ts.map +0 -1
- package/dist/__tests__/audit-property.test.js +0 -771
- package/dist/__tests__/audit-property.test.js.map +0 -1
- package/dist/__tests__/audit-real-fixtures.test.d.ts +0 -2
- package/dist/__tests__/audit-real-fixtures.test.d.ts.map +0 -1
- package/dist/__tests__/audit-real-fixtures.test.js +0 -132
- package/dist/__tests__/audit-real-fixtures.test.js.map +0 -1
- package/dist/__tests__/audit-real-live.test.d.ts +0 -2
- package/dist/__tests__/audit-real-live.test.d.ts.map +0 -1
- package/dist/__tests__/audit-real-live.test.js +0 -107
- package/dist/__tests__/audit-real-live.test.js.map +0 -1
- package/dist/__tests__/audit-reconstruct.test.d.ts +0 -2
- package/dist/__tests__/audit-reconstruct.test.d.ts.map +0 -1
- package/dist/__tests__/audit-reconstruct.test.js +0 -287
- package/dist/__tests__/audit-reconstruct.test.js.map +0 -1
- package/dist/__tests__/audit-report.test.d.ts +0 -2
- package/dist/__tests__/audit-report.test.d.ts.map +0 -1
- package/dist/__tests__/audit-report.test.js +0 -186
- package/dist/__tests__/audit-report.test.js.map +0 -1
- package/dist/__tests__/audit-roundtrip.test.d.ts +0 -2
- package/dist/__tests__/audit-roundtrip.test.d.ts.map +0 -1
- package/dist/__tests__/audit-roundtrip.test.js +0 -368
- package/dist/__tests__/audit-roundtrip.test.js.map +0 -1
- package/dist/__tests__/audit-temporal.test.d.ts +0 -2
- package/dist/__tests__/audit-temporal.test.d.ts.map +0 -1
- package/dist/__tests__/audit-temporal.test.js +0 -364
- package/dist/__tests__/audit-temporal.test.js.map +0 -1
- package/dist/__tests__/audit-tiers.test.d.ts +0 -2
- package/dist/__tests__/audit-tiers.test.d.ts.map +0 -1
- package/dist/__tests__/audit-tiers.test.js +0 -282
- package/dist/__tests__/audit-tiers.test.js.map +0 -1
- package/dist/__tests__/audit-witness-real.test.d.ts +0 -19
- package/dist/__tests__/audit-witness-real.test.d.ts.map +0 -1
- package/dist/__tests__/audit-witness-real.test.js +0 -82
- package/dist/__tests__/audit-witness-real.test.js.map +0 -1
- package/dist/__tests__/audit-witness.test.d.ts +0 -2
- package/dist/__tests__/audit-witness.test.d.ts.map +0 -1
- package/dist/__tests__/audit-witness.test.js +0 -308
- package/dist/__tests__/audit-witness.test.js.map +0 -1
- package/dist/__tests__/canonical.test.d.ts +0 -2
- package/dist/__tests__/canonical.test.d.ts.map +0 -1
- package/dist/__tests__/canonical.test.js +0 -162
- package/dist/__tests__/canonical.test.js.map +0 -1
- package/dist/__tests__/chain-hash-anchor.test.d.ts +0 -22
- package/dist/__tests__/chain-hash-anchor.test.d.ts.map +0 -1
- package/dist/__tests__/chain-hash-anchor.test.js +0 -55
- package/dist/__tests__/chain-hash-anchor.test.js.map +0 -1
- package/dist/__tests__/commit-service.integration.test.d.ts +0 -2
- package/dist/__tests__/commit-service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/commit-service.integration.test.js +0 -95
- package/dist/__tests__/commit-service.integration.test.js.map +0 -1
- package/dist/__tests__/constructor.test.d.ts +0 -2
- package/dist/__tests__/constructor.test.d.ts.map +0 -1
- package/dist/__tests__/constructor.test.js +0 -267
- package/dist/__tests__/constructor.test.js.map +0 -1
- package/dist/__tests__/declared-proof-fixture.d.ts +0 -66
- package/dist/__tests__/declared-proof-fixture.d.ts.map +0 -1
- package/dist/__tests__/declared-proof-fixture.js +0 -66
- package/dist/__tests__/declared-proof-fixture.js.map +0 -1
- package/dist/__tests__/fuse-inline.test.d.ts +0 -2
- package/dist/__tests__/fuse-inline.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-inline.test.js +0 -181
- package/dist/__tests__/fuse-inline.test.js.map +0 -1
- package/dist/__tests__/fuse-placement.test.d.ts +0 -2
- package/dist/__tests__/fuse-placement.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-placement.test.js +0 -31
- package/dist/__tests__/fuse-placement.test.js.map +0 -1
- package/dist/__tests__/fuse-roundtrip.test.d.ts +0 -2
- package/dist/__tests__/fuse-roundtrip.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-roundtrip.test.js +0 -241
- package/dist/__tests__/fuse-roundtrip.test.js.map +0 -1
- package/dist/__tests__/fuse-sdk.test.d.ts +0 -2
- package/dist/__tests__/fuse-sdk.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-sdk.test.js +0 -117
- package/dist/__tests__/fuse-sdk.test.js.map +0 -1
- package/dist/__tests__/fuse-set-sdk.test.d.ts +0 -2
- package/dist/__tests__/fuse-set-sdk.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-set-sdk.test.js +0 -721
- package/dist/__tests__/fuse-set-sdk.test.js.map +0 -1
- package/dist/__tests__/fuse-set.test.d.ts +0 -2
- package/dist/__tests__/fuse-set.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-set.test.js +0 -889
- package/dist/__tests__/fuse-set.test.js.map +0 -1
- package/dist/__tests__/fuse-set2.test.d.ts +0 -2
- package/dist/__tests__/fuse-set2.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-set2.test.js +0 -294
- package/dist/__tests__/fuse-set2.test.js.map +0 -1
- package/dist/__tests__/fuse-vectors.test.d.ts +0 -2
- package/dist/__tests__/fuse-vectors.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-vectors.test.js +0 -175
- package/dist/__tests__/fuse-vectors.test.js.map +0 -1
- package/dist/__tests__/fuse-verify.test.d.ts +0 -2
- package/dist/__tests__/fuse-verify.test.d.ts.map +0 -1
- package/dist/__tests__/fuse-verify.test.js +0 -250
- package/dist/__tests__/fuse-verify.test.js.map +0 -1
- package/dist/__tests__/hello-world.test.d.ts +0 -2
- package/dist/__tests__/hello-world.test.d.ts.map +0 -1
- package/dist/__tests__/hello-world.test.js +0 -9
- package/dist/__tests__/hello-world.test.js.map +0 -1
- package/dist/__tests__/mock-proof-fixture.d.ts +0 -15
- package/dist/__tests__/mock-proof-fixture.d.ts.map +0 -1
- package/dist/__tests__/mock-proof-fixture.js +0 -34
- package/dist/__tests__/mock-proof-fixture.js.map +0 -1
- package/dist/__tests__/policy-enforcement.test.d.ts +0 -2
- package/dist/__tests__/policy-enforcement.test.d.ts.map +0 -1
- package/dist/__tests__/policy-enforcement.test.js +0 -188
- package/dist/__tests__/policy-enforcement.test.js.map +0 -1
- package/dist/__tests__/proof-hash-regression.test.d.ts +0 -2
- package/dist/__tests__/proof-hash-regression.test.d.ts.map +0 -1
- package/dist/__tests__/proof-hash-regression.test.js +0 -95
- package/dist/__tests__/proof-hash-regression.test.js.map +0 -1
- package/dist/__tests__/proof-hash.test.d.ts +0 -2
- package/dist/__tests__/proof-hash.test.d.ts.map +0 -1
- package/dist/__tests__/proof-hash.test.js +0 -116
- package/dist/__tests__/proof-hash.test.js.map +0 -1
- package/dist/__tests__/proof-integrity.test.d.ts +0 -2
- package/dist/__tests__/proof-integrity.test.d.ts.map +0 -1
- package/dist/__tests__/proof-integrity.test.js +0 -454
- package/dist/__tests__/proof-integrity.test.js.map +0 -1
- package/dist/__tests__/realistic-proof-fixture.d.ts +0 -56
- package/dist/__tests__/realistic-proof-fixture.d.ts.map +0 -1
- package/dist/__tests__/realistic-proof-fixture.js +0 -57
- package/dist/__tests__/realistic-proof-fixture.js.map +0 -1
- package/dist/__tests__/run.test.d.ts +0 -2
- package/dist/__tests__/run.test.d.ts.map +0 -1
- package/dist/__tests__/run.test.js +0 -178
- package/dist/__tests__/run.test.js.map +0 -1
- package/dist/__tests__/verifier.test.d.ts +0 -2
- package/dist/__tests__/verifier.test.d.ts.map +0 -1
- package/dist/__tests__/verifier.test.js +0 -531
- package/dist/__tests__/verifier.test.js.map +0 -1
- package/dist/canonical.d.ts +0 -54
- package/dist/canonical.d.ts.map +0 -1
- package/dist/canonical.js +0 -119
- package/dist/canonical.js.map +0 -1
- package/dist/proof-hash.d.ts +0 -9
- package/dist/proof-hash.d.ts.map +0 -1
- package/dist/proof-hash.js +0 -75
- package/dist/proof-hash.js.map +0 -1
- package/dist/types.d.ts +0 -705
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/verifier.d.ts +0 -27
- package/dist/verifier.d.ts.map +0 -1
- package/dist/verifier.js +0 -844
- package/dist/verifier.js.map +0 -1
- package/src/__tests__/audit-anchors.test.ts +0 -188
- package/src/__tests__/audit-anomalies.test.ts +0 -815
- package/src/__tests__/audit-attestation.test.ts +0 -529
- package/src/__tests__/audit-bench-smoke.test.ts +0 -108
- package/src/__tests__/audit-boundary.test.ts +0 -96
- package/src/__tests__/audit-cli.test.ts +0 -288
- package/src/__tests__/audit-dependencies.test.ts +0 -141
- package/src/__tests__/audit-fixtures.ts +0 -736
- package/src/__tests__/audit-ingest.test.ts +0 -575
- package/src/__tests__/audit-memory-ingest.test.ts +0 -156
- package/src/__tests__/audit-property.test.ts +0 -892
- package/src/__tests__/audit-real-fixtures.test.ts +0 -153
- package/src/__tests__/audit-real-live.test.ts +0 -128
- package/src/__tests__/audit-reconstruct.test.ts +0 -353
- package/src/__tests__/audit-report.test.ts +0 -222
- package/src/__tests__/audit-roundtrip.test.ts +0 -464
- package/src/__tests__/audit-temporal.test.ts +0 -446
- package/src/__tests__/audit-tiers.test.ts +0 -343
- package/src/__tests__/audit-witness-real.test.ts +0 -92
- package/src/__tests__/audit-witness.test.ts +0 -345
- package/src/__tests__/canonical.test.ts +0 -253
- package/src/__tests__/chain-hash-anchor.test.ts +0 -67
- package/src/__tests__/commit-service.integration.test.ts +0 -117
- package/src/__tests__/constructor.test.ts +0 -340
- package/src/__tests__/declared-proof-fixture.ts +0 -65
- package/src/__tests__/fuse-inline.test.ts +0 -211
- package/src/__tests__/fuse-placement.test.ts +0 -32
- package/src/__tests__/fuse-roundtrip.test.ts +0 -243
- package/src/__tests__/fuse-sdk.test.ts +0 -142
- package/src/__tests__/fuse-set-sdk.test.ts +0 -852
- package/src/__tests__/fuse-set.test.ts +0 -1027
- package/src/__tests__/fuse-set2.test.ts +0 -343
- package/src/__tests__/fuse-vectors.test.ts +0 -218
- package/src/__tests__/fuse-verify.test.ts +0 -278
- package/src/__tests__/hello-world.test.ts +0 -10
- package/src/__tests__/mock-proof-fixture.ts +0 -36
- package/src/__tests__/policy-enforcement.test.ts +0 -226
- package/src/__tests__/proof-hash-regression.test.ts +0 -107
- package/src/__tests__/proof-hash.test.ts +0 -129
- package/src/__tests__/proof-integrity.test.ts +0 -576
- package/src/__tests__/real-fixtures/anchor-after-112762.json +0 -47
- package/src/__tests__/real-fixtures/anchor-with-ethereum-112758.json +0 -47
- package/src/__tests__/real-fixtures/live-proof-0.json +0 -42
- package/src/__tests__/real-fixtures/live-proof-1.json +0 -43
- package/src/__tests__/real-fixtures/live-proof-2.json +0 -43
- package/src/__tests__/real-fixtures/successor-112760.json +0 -38
- package/src/__tests__/real-fixtures/witness-25525146.json +0 -6
- package/src/__tests__/real-fixtures/witness-25525147.json +0 -6
- package/src/__tests__/realistic-proof-fixture.ts +0 -57
- package/src/__tests__/verifier.test.ts +0 -624
|
@@ -1,531 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Argento Computing Inc. All rights reserved. See LICENSE.
|
|
2
|
-
import { describe, test, before } from "node:test";
|
|
3
|
-
import * as assert from "node:assert/strict";
|
|
4
|
-
import { getPublicKeyAsync, signAsync } from "@noble/ed25519";
|
|
5
|
-
import { Constructor } from "../constructor.js";
|
|
6
|
-
import { verify, resetEpochLinkState } from "../index.js";
|
|
7
|
-
import { verifyProofIntegrity } from "@mikeargento/bitgraph-verify";
|
|
8
|
-
import { DECLARED_12010 } from "./declared-proof-fixture.js";
|
|
9
|
-
async function makeFixture(opts) {
|
|
10
|
-
const privateKey = crypto.getRandomValues(new Uint8Array(32));
|
|
11
|
-
const publicKeyBytes = await getPublicKeyAsync(privateKey);
|
|
12
|
-
const publicKeyB64 = Buffer.from(publicKeyBytes).toString("base64");
|
|
13
|
-
const measurement = opts?.measurement ?? "test-measurement-deadbeef";
|
|
14
|
-
let counter = 0;
|
|
15
|
-
const host = opts?.withCounter
|
|
16
|
-
? {
|
|
17
|
-
enforcementTier: "stub",
|
|
18
|
-
getMeasurement: async () => measurement,
|
|
19
|
-
getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
|
|
20
|
-
sign: async (data) => signAsync(data, privateKey),
|
|
21
|
-
getPublicKey: async () => publicKeyBytes,
|
|
22
|
-
nextCounter: async () => String(++counter),
|
|
23
|
-
}
|
|
24
|
-
: opts?.withTime !== undefined
|
|
25
|
-
? {
|
|
26
|
-
enforcementTier: "stub",
|
|
27
|
-
getMeasurement: async () => measurement,
|
|
28
|
-
getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
|
|
29
|
-
sign: async (data) => signAsync(data, privateKey),
|
|
30
|
-
getPublicKey: async () => publicKeyBytes,
|
|
31
|
-
secureTime: async () => opts.withTime,
|
|
32
|
-
}
|
|
33
|
-
: {
|
|
34
|
-
enforcementTier: "stub",
|
|
35
|
-
getMeasurement: async () => measurement,
|
|
36
|
-
getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
|
|
37
|
-
sign: async (data) => signAsync(data, privateKey),
|
|
38
|
-
getPublicKey: async () => publicKeyBytes,
|
|
39
|
-
};
|
|
40
|
-
const ctor = await Constructor.initialize(opts?.epochId !== undefined
|
|
41
|
-
? { host, epochId: opts.epochId }
|
|
42
|
-
: { host });
|
|
43
|
-
const bytes = new TextEncoder().encode("bitgraph-test-payload-42");
|
|
44
|
-
const proof = await ctor.commit({ bytes });
|
|
45
|
-
return { proof, bytes, publicKeyB64, measurement, privateKey };
|
|
46
|
-
}
|
|
47
|
-
/** Deep-clone a proof so mutations don't affect the original. */
|
|
48
|
-
function clone(proof) {
|
|
49
|
-
return JSON.parse(JSON.stringify(proof));
|
|
50
|
-
}
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
// Module-level fixture (no optional capabilities)
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
let fx;
|
|
55
|
-
before(async () => {
|
|
56
|
-
fx = await makeFixture();
|
|
57
|
-
});
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
// Happy path
|
|
60
|
-
// ---------------------------------------------------------------------------
|
|
61
|
-
describe("verify — valid proof", () => {
|
|
62
|
-
test("returns { valid: true } for a freshly created proof", async () => {
|
|
63
|
-
const result = await verify({ proof: fx.proof, bytes: fx.bytes });
|
|
64
|
-
assert.deepEqual(result, { valid: true });
|
|
65
|
-
});
|
|
66
|
-
test("verify is idempotent (same result on second call)", async () => {
|
|
67
|
-
const r1 = await verify({ proof: fx.proof, bytes: fx.bytes });
|
|
68
|
-
const r2 = await verify({ proof: fx.proof, bytes: fx.bytes });
|
|
69
|
-
assert.deepEqual(r1, { valid: true });
|
|
70
|
-
assert.deepEqual(r2, { valid: true });
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
// ---------------------------------------------------------------------------
|
|
74
|
-
// Artifact check (step 2)
|
|
75
|
-
// ---------------------------------------------------------------------------
|
|
76
|
-
describe("verify — artifact mismatch", () => {
|
|
77
|
-
test("fails when wrong bytes are provided", async () => {
|
|
78
|
-
const result = await verify({
|
|
79
|
-
proof: fx.proof,
|
|
80
|
-
bytes: new Uint8Array([99, 98, 97]),
|
|
81
|
-
});
|
|
82
|
-
assert.equal(result.valid, false);
|
|
83
|
-
assert.match(result.reason ?? "", /digest mismatch/);
|
|
84
|
-
});
|
|
85
|
-
test("fails with empty bytes when proof covers non-empty content", async () => {
|
|
86
|
-
const result = await verify({
|
|
87
|
-
proof: fx.proof,
|
|
88
|
-
bytes: new Uint8Array(0),
|
|
89
|
-
});
|
|
90
|
-
assert.equal(result.valid, false);
|
|
91
|
-
assert.match(result.reason ?? "", /digest mismatch/);
|
|
92
|
-
});
|
|
93
|
-
test("succeeds when proof covers empty bytes and empty bytes are provided", async () => {
|
|
94
|
-
const pk = crypto.getRandomValues(new Uint8Array(32));
|
|
95
|
-
const pkBytes = await getPublicKeyAsync(pk);
|
|
96
|
-
const host = {
|
|
97
|
-
enforcementTier: "stub",
|
|
98
|
-
getMeasurement: async () => "meas",
|
|
99
|
-
getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
|
|
100
|
-
sign: async (data) => signAsync(data, pk),
|
|
101
|
-
getPublicKey: async () => pkBytes,
|
|
102
|
-
};
|
|
103
|
-
const ctor = await Constructor.initialize({ host });
|
|
104
|
-
const emptyBytes = new Uint8Array(0);
|
|
105
|
-
const proof = await ctor.commit({ bytes: emptyBytes });
|
|
106
|
-
const result = await verify({ proof, bytes: emptyBytes });
|
|
107
|
-
assert.deepEqual(result, { valid: true });
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
// ---------------------------------------------------------------------------
|
|
111
|
-
// Signature verification (step 4)
|
|
112
|
-
// ---------------------------------------------------------------------------
|
|
113
|
-
describe("verify — signature tampering", () => {
|
|
114
|
-
test("fails when signatureB64 is replaced with all-zeros", async () => {
|
|
115
|
-
const tampered = clone(fx.proof);
|
|
116
|
-
tampered.signer.signatureB64 = Buffer.alloc(64).toString("base64");
|
|
117
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
118
|
-
assert.equal(result.valid, false);
|
|
119
|
-
assert.match(result.reason ?? "", /signature/);
|
|
120
|
-
});
|
|
121
|
-
test("fails when publicKeyB64 is replaced with a different key", async () => {
|
|
122
|
-
const otherKey = crypto.getRandomValues(new Uint8Array(32));
|
|
123
|
-
const otherPublic = await getPublicKeyAsync(otherKey);
|
|
124
|
-
const tampered = clone(fx.proof);
|
|
125
|
-
tampered.signer.publicKeyB64 = Buffer.from(otherPublic).toString("base64");
|
|
126
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
127
|
-
assert.equal(result.valid, false);
|
|
128
|
-
assert.match(result.reason ?? "", /signature/);
|
|
129
|
-
});
|
|
130
|
-
test("fails when artifact.digestB64 is tampered", async () => {
|
|
131
|
-
const tampered = clone(fx.proof);
|
|
132
|
-
tampered.artifact.digestB64 = Buffer.alloc(32, 0xff).toString("base64");
|
|
133
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
134
|
-
assert.equal(result.valid, false);
|
|
135
|
-
// Either artifact mismatch OR signature failure (both are valid)
|
|
136
|
-
assert.ok((result.reason ?? "").includes("digest mismatch") ||
|
|
137
|
-
(result.reason ?? "").includes("signature"));
|
|
138
|
-
});
|
|
139
|
-
test("fails when measurement is tampered (signed field)", async () => {
|
|
140
|
-
const tampered = clone(fx.proof);
|
|
141
|
-
tampered.environment.measurement = "evil-measurement";
|
|
142
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
143
|
-
assert.equal(result.valid, false);
|
|
144
|
-
assert.match(result.reason ?? "", /signature/);
|
|
145
|
-
});
|
|
146
|
-
test("fails when nonce is tampered (signed field)", async () => {
|
|
147
|
-
const tampered = clone(fx.proof);
|
|
148
|
-
tampered.commit.nonceB64 = Buffer.alloc(16, 0xab).toString("base64");
|
|
149
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
150
|
-
assert.equal(result.valid, false);
|
|
151
|
-
assert.match(result.reason ?? "", /signature/);
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
// ---------------------------------------------------------------------------
|
|
155
|
-
// Structural validation (step 1)
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
describe("verify — structural validation", () => {
|
|
158
|
-
test("fails for non-object proof", async () => {
|
|
159
|
-
const result = await verify({
|
|
160
|
-
proof: "not-a-proof",
|
|
161
|
-
bytes: fx.bytes,
|
|
162
|
-
});
|
|
163
|
-
assert.equal(result.valid, false);
|
|
164
|
-
assert.match(result.reason ?? "", /object/);
|
|
165
|
-
});
|
|
166
|
-
test("fails for null proof", async () => {
|
|
167
|
-
const result = await verify({
|
|
168
|
-
proof: null,
|
|
169
|
-
bytes: fx.bytes,
|
|
170
|
-
});
|
|
171
|
-
assert.equal(result.valid, false);
|
|
172
|
-
});
|
|
173
|
-
test("fails for wrong version", async () => {
|
|
174
|
-
const tampered = clone(fx.proof);
|
|
175
|
-
tampered["version"] = "bitgraph/2";
|
|
176
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
177
|
-
assert.equal(result.valid, false);
|
|
178
|
-
assert.match(result.reason ?? "", /version/);
|
|
179
|
-
});
|
|
180
|
-
test("fails when artifact is missing", async () => {
|
|
181
|
-
const tampered = clone(fx.proof);
|
|
182
|
-
delete tampered["artifact"];
|
|
183
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
184
|
-
assert.equal(result.valid, false);
|
|
185
|
-
assert.match(result.reason ?? "", /artifact/);
|
|
186
|
-
});
|
|
187
|
-
test("fails when commit is missing", async () => {
|
|
188
|
-
const tampered = clone(fx.proof);
|
|
189
|
-
delete tampered["commit"];
|
|
190
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
191
|
-
assert.equal(result.valid, false);
|
|
192
|
-
assert.match(result.reason ?? "", /commit/);
|
|
193
|
-
});
|
|
194
|
-
test("fails when signer is missing", async () => {
|
|
195
|
-
const tampered = clone(fx.proof);
|
|
196
|
-
delete tampered["signer"];
|
|
197
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
198
|
-
assert.equal(result.valid, false);
|
|
199
|
-
assert.match(result.reason ?? "", /signer/);
|
|
200
|
-
});
|
|
201
|
-
test("fails when environment is missing", async () => {
|
|
202
|
-
const tampered = clone(fx.proof);
|
|
203
|
-
delete tampered["environment"];
|
|
204
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
205
|
-
assert.equal(result.valid, false);
|
|
206
|
-
assert.match(result.reason ?? "", /environment/);
|
|
207
|
-
});
|
|
208
|
-
test("fails for invalid enforcement tier", async () => {
|
|
209
|
-
const tampered = clone(fx.proof);
|
|
210
|
-
tampered.environment.enforcement = "invalid-tier";
|
|
211
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
212
|
-
assert.equal(result.valid, false);
|
|
213
|
-
assert.match(result.reason ?? "", /enforcement/);
|
|
214
|
-
});
|
|
215
|
-
test("fails when publicKeyB64 is wrong length (too short)", async () => {
|
|
216
|
-
const tampered = clone(fx.proof);
|
|
217
|
-
tampered.signer.publicKeyB64 = Buffer.alloc(16).toString("base64");
|
|
218
|
-
const result = await verify({ proof: tampered, bytes: fx.bytes });
|
|
219
|
-
assert.equal(result.valid, false);
|
|
220
|
-
assert.match(result.reason ?? "", /32/);
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
// ---------------------------------------------------------------------------
|
|
224
|
-
// Policy checks (step 5)
|
|
225
|
-
// ---------------------------------------------------------------------------
|
|
226
|
-
describe("verify — policy: requireEnforcement", () => {
|
|
227
|
-
test("passes when enforcement matches required tier", async () => {
|
|
228
|
-
const result = await verify({
|
|
229
|
-
proof: fx.proof,
|
|
230
|
-
bytes: fx.bytes,
|
|
231
|
-
trustAnchors: { requireEnforcement: "stub" },
|
|
232
|
-
});
|
|
233
|
-
assert.deepEqual(result, { valid: true });
|
|
234
|
-
});
|
|
235
|
-
test("fails when enforcement does not match required tier", async () => {
|
|
236
|
-
const result = await verify({
|
|
237
|
-
proof: fx.proof,
|
|
238
|
-
bytes: fx.bytes,
|
|
239
|
-
trustAnchors: { requireEnforcement: "measured-tee" },
|
|
240
|
-
});
|
|
241
|
-
assert.equal(result.valid, false);
|
|
242
|
-
assert.match(result.reason ?? "", /enforcement/);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
describe("verify — policy: allowedMeasurements", () => {
|
|
246
|
-
test("passes when measurement is in the allowlist", async () => {
|
|
247
|
-
const result = await verify({
|
|
248
|
-
proof: fx.proof,
|
|
249
|
-
bytes: fx.bytes,
|
|
250
|
-
trustAnchors: { allowedMeasurements: [fx.measurement] },
|
|
251
|
-
});
|
|
252
|
-
assert.deepEqual(result, { valid: true });
|
|
253
|
-
});
|
|
254
|
-
test("passes when measurement is one of several in the allowlist", async () => {
|
|
255
|
-
const result = await verify({
|
|
256
|
-
proof: fx.proof,
|
|
257
|
-
bytes: fx.bytes,
|
|
258
|
-
trustAnchors: {
|
|
259
|
-
allowedMeasurements: ["other-meas-1", fx.measurement, "other-meas-2"],
|
|
260
|
-
},
|
|
261
|
-
});
|
|
262
|
-
assert.deepEqual(result, { valid: true });
|
|
263
|
-
});
|
|
264
|
-
test("fails when measurement is not in the allowlist", async () => {
|
|
265
|
-
const result = await verify({
|
|
266
|
-
proof: fx.proof,
|
|
267
|
-
bytes: fx.bytes,
|
|
268
|
-
trustAnchors: { allowedMeasurements: ["expected-meas", "another-meas"] },
|
|
269
|
-
});
|
|
270
|
-
assert.equal(result.valid, false);
|
|
271
|
-
assert.match(result.reason ?? "", /measurement/);
|
|
272
|
-
});
|
|
273
|
-
test("passes with empty allowedMeasurements (no constraint)", async () => {
|
|
274
|
-
const result = await verify({
|
|
275
|
-
proof: fx.proof,
|
|
276
|
-
bytes: fx.bytes,
|
|
277
|
-
trustAnchors: { allowedMeasurements: [] },
|
|
278
|
-
});
|
|
279
|
-
assert.deepEqual(result, { valid: true });
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
|
-
describe("verify — policy: allowedPublicKeys", () => {
|
|
283
|
-
test("passes when public key is in the allowlist", async () => {
|
|
284
|
-
const result = await verify({
|
|
285
|
-
proof: fx.proof,
|
|
286
|
-
bytes: fx.bytes,
|
|
287
|
-
trustAnchors: { allowedPublicKeys: [fx.publicKeyB64] },
|
|
288
|
-
});
|
|
289
|
-
assert.deepEqual(result, { valid: true });
|
|
290
|
-
});
|
|
291
|
-
test("fails when public key is not in the allowlist", async () => {
|
|
292
|
-
const otherKey = crypto.getRandomValues(new Uint8Array(32));
|
|
293
|
-
const otherPublic = Buffer.from(await getPublicKeyAsync(otherKey)).toString("base64");
|
|
294
|
-
const result = await verify({
|
|
295
|
-
proof: fx.proof,
|
|
296
|
-
bytes: fx.bytes,
|
|
297
|
-
trustAnchors: { allowedPublicKeys: [otherPublic] },
|
|
298
|
-
});
|
|
299
|
-
assert.equal(result.valid, false);
|
|
300
|
-
assert.match(result.reason ?? "", /public key/i);
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
describe("verify — policy: requireAttestation", () => {
|
|
304
|
-
test("fails when attestation required but proof has none", async () => {
|
|
305
|
-
const result = await verify({
|
|
306
|
-
proof: fx.proof,
|
|
307
|
-
bytes: fx.bytes,
|
|
308
|
-
trustAnchors: { requireAttestation: true },
|
|
309
|
-
});
|
|
310
|
-
assert.equal(result.valid, false);
|
|
311
|
-
assert.match(result.reason ?? "", /attestation/);
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
describe("verify — policy: counter checks", () => {
|
|
315
|
-
let counterFx;
|
|
316
|
-
before(async () => {
|
|
317
|
-
counterFx = await makeFixture({ withCounter: true });
|
|
318
|
-
});
|
|
319
|
-
test("valid proof with counter passes minCounter check", async () => {
|
|
320
|
-
const result = await verify({
|
|
321
|
-
proof: counterFx.proof,
|
|
322
|
-
bytes: counterFx.bytes,
|
|
323
|
-
trustAnchors: { minCounter: "1" },
|
|
324
|
-
});
|
|
325
|
-
assert.deepEqual(result, { valid: true });
|
|
326
|
-
});
|
|
327
|
-
test("fails when counter is below minCounter", async () => {
|
|
328
|
-
const result = await verify({
|
|
329
|
-
proof: counterFx.proof,
|
|
330
|
-
bytes: counterFx.bytes,
|
|
331
|
-
trustAnchors: { minCounter: "999" },
|
|
332
|
-
});
|
|
333
|
-
assert.equal(result.valid, false);
|
|
334
|
-
assert.match(result.reason ?? "", /counter/);
|
|
335
|
-
});
|
|
336
|
-
test("passes when counter is at exactly maxCounter", async () => {
|
|
337
|
-
// counter is set because hostWithCounter provides nextCounter
|
|
338
|
-
const counter = counterFx.proof.commit.counter;
|
|
339
|
-
const result = await verify({
|
|
340
|
-
proof: counterFx.proof,
|
|
341
|
-
bytes: counterFx.bytes,
|
|
342
|
-
trustAnchors: { maxCounter: counter },
|
|
343
|
-
});
|
|
344
|
-
assert.deepEqual(result, { valid: true });
|
|
345
|
-
});
|
|
346
|
-
test("fails when counter exceeds maxCounter", async () => {
|
|
347
|
-
const result = await verify({
|
|
348
|
-
proof: counterFx.proof,
|
|
349
|
-
bytes: counterFx.bytes,
|
|
350
|
-
trustAnchors: { maxCounter: "0" },
|
|
351
|
-
});
|
|
352
|
-
assert.equal(result.valid, false);
|
|
353
|
-
assert.match(result.reason ?? "", /counter/);
|
|
354
|
-
});
|
|
355
|
-
test("fails when minCounter policy requires counter but proof has none", async () => {
|
|
356
|
-
// fx.proof has no counter (base host has no nextCounter)
|
|
357
|
-
const result = await verify({
|
|
358
|
-
proof: fx.proof,
|
|
359
|
-
bytes: fx.bytes,
|
|
360
|
-
trustAnchors: { minCounter: "0" },
|
|
361
|
-
});
|
|
362
|
-
assert.equal(result.valid, false);
|
|
363
|
-
assert.match(result.reason ?? "", /counter/);
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
describe("verify — policy: time checks", () => {
|
|
367
|
-
const fixedTime = 1_700_000_000_000;
|
|
368
|
-
let timeFx;
|
|
369
|
-
before(async () => {
|
|
370
|
-
timeFx = await makeFixture({ withTime: fixedTime });
|
|
371
|
-
});
|
|
372
|
-
test("passes when commit time is within minTime/maxTime window", async () => {
|
|
373
|
-
const result = await verify({
|
|
374
|
-
proof: timeFx.proof,
|
|
375
|
-
bytes: timeFx.bytes,
|
|
376
|
-
trustAnchors: {
|
|
377
|
-
minTime: fixedTime - 1000,
|
|
378
|
-
maxTime: fixedTime + 1000,
|
|
379
|
-
},
|
|
380
|
-
});
|
|
381
|
-
assert.deepEqual(result, { valid: true });
|
|
382
|
-
});
|
|
383
|
-
test("fails when commit time is before minTime", async () => {
|
|
384
|
-
const result = await verify({
|
|
385
|
-
proof: timeFx.proof,
|
|
386
|
-
bytes: timeFx.bytes,
|
|
387
|
-
trustAnchors: { minTime: fixedTime + 1 },
|
|
388
|
-
});
|
|
389
|
-
assert.equal(result.valid, false);
|
|
390
|
-
assert.match(result.reason ?? "", /time/);
|
|
391
|
-
});
|
|
392
|
-
test("fails when commit time is after maxTime", async () => {
|
|
393
|
-
const result = await verify({
|
|
394
|
-
proof: timeFx.proof,
|
|
395
|
-
bytes: timeFx.bytes,
|
|
396
|
-
trustAnchors: { maxTime: fixedTime - 1 },
|
|
397
|
-
});
|
|
398
|
-
assert.equal(result.valid, false);
|
|
399
|
-
assert.match(result.reason ?? "", /time/);
|
|
400
|
-
});
|
|
401
|
-
test("fails when time policy requires time but proof has none", async () => {
|
|
402
|
-
// fx.proof has no time (base host has no secureTime)
|
|
403
|
-
const result = await verify({
|
|
404
|
-
proof: fx.proof,
|
|
405
|
-
bytes: fx.bytes,
|
|
406
|
-
trustAnchors: { minTime: 0 },
|
|
407
|
-
});
|
|
408
|
-
assert.equal(result.valid, false);
|
|
409
|
-
assert.match(result.reason ?? "", /time/);
|
|
410
|
-
});
|
|
411
|
-
});
|
|
412
|
-
describe("verify — policy: requireEpochId", () => {
|
|
413
|
-
test("fails when epochId is required but proof has none", async () => {
|
|
414
|
-
// fx.proof was created without epochId
|
|
415
|
-
const result = await verify({
|
|
416
|
-
proof: fx.proof,
|
|
417
|
-
bytes: fx.bytes,
|
|
418
|
-
trustAnchors: { requireEpochId: true },
|
|
419
|
-
});
|
|
420
|
-
assert.equal(result.valid, false);
|
|
421
|
-
assert.match(result.reason ?? "", /epochId/i);
|
|
422
|
-
});
|
|
423
|
-
test("passes when epochId is required and proof has it", async () => {
|
|
424
|
-
const epochFx = await makeFixture({ epochId: "epoch-test-xyz" });
|
|
425
|
-
const result = await verify({
|
|
426
|
-
proof: epochFx.proof,
|
|
427
|
-
bytes: epochFx.bytes,
|
|
428
|
-
trustAnchors: { requireEpochId: true },
|
|
429
|
-
});
|
|
430
|
-
assert.deepEqual(result, { valid: true });
|
|
431
|
-
});
|
|
432
|
-
});
|
|
433
|
-
describe("verify — policy: requireActor", () => {
|
|
434
|
-
test("fails when actor is required but proof has none", async () => {
|
|
435
|
-
const result = await verify({
|
|
436
|
-
proof: fx.proof,
|
|
437
|
-
bytes: fx.bytes,
|
|
438
|
-
trustAnchors: { requireActor: true },
|
|
439
|
-
});
|
|
440
|
-
assert.equal(result.valid, false);
|
|
441
|
-
assert.match(result.reason ?? "", /actor|agency/i);
|
|
442
|
-
});
|
|
443
|
-
});
|
|
444
|
-
// ---------------------------------------------------------------------------
|
|
445
|
-
// Agency: WebAuthn origin and RP binding
|
|
446
|
-
// ---------------------------------------------------------------------------
|
|
447
|
-
/* The real first declaration (#12,010) as it is, then the same proof with its
|
|
448
|
-
client data altered. The origin check runs BEFORE the signature check, so a
|
|
449
|
-
changed origin is reported as the origin problem it is, rather than as the
|
|
450
|
-
signature failure it also causes; and a changed origin whose host still
|
|
451
|
-
agrees with the rpIdHash passes the origin check and is then caught by the
|
|
452
|
-
signature, which is the order a reader would want the reasons in. */
|
|
453
|
-
function withClientData(proof, patch) {
|
|
454
|
-
const p = JSON.parse(JSON.stringify(proof));
|
|
455
|
-
const auth = p.agency.authorization;
|
|
456
|
-
const cd = JSON.parse(auth.clientDataJSON);
|
|
457
|
-
patch(cd);
|
|
458
|
-
auth.clientDataJSON = JSON.stringify(cd);
|
|
459
|
-
return p;
|
|
460
|
-
}
|
|
461
|
-
describe("verify — agency: WebAuthn origin and rpIdHash", () => {
|
|
462
|
-
test("the real declared proof verifies (origin https://bitgraph.ing, rpIdHash = SHA-256(bitgraph.ing))", async () => {
|
|
463
|
-
resetEpochLinkState();
|
|
464
|
-
const result = await verifyProofIntegrity({ proof: DECLARED_12010 });
|
|
465
|
-
assert.equal(result.valid, true, result.valid ? "" : result.reason);
|
|
466
|
-
});
|
|
467
|
-
test("an origin whose host disagrees with the authenticator's rpIdHash is refused as such", async () => {
|
|
468
|
-
resetEpochLinkState();
|
|
469
|
-
const tampered = withClientData(DECLARED_12010, (cd) => { cd.origin = "https://evil.example"; });
|
|
470
|
-
const result = await verifyProofIntegrity({ proof: tampered });
|
|
471
|
-
assert.equal(result.valid, false);
|
|
472
|
-
assert.match(result.reason ?? "", /rpIdHash does not match the origin/);
|
|
473
|
-
});
|
|
474
|
-
test("a missing origin is refused", async () => {
|
|
475
|
-
resetEpochLinkState();
|
|
476
|
-
const tampered = withClientData(DECLARED_12010, (cd) => { delete cd.origin; });
|
|
477
|
-
const result = await verifyProofIntegrity({ proof: tampered });
|
|
478
|
-
assert.equal(result.valid, false);
|
|
479
|
-
assert.match(result.reason ?? "", /missing origin/);
|
|
480
|
-
});
|
|
481
|
-
test("a subdomain of the RP ID passes the origin check (and is then caught by the signature)", async () => {
|
|
482
|
-
resetEpochLinkState();
|
|
483
|
-
const tampered = withClientData(DECLARED_12010, (cd) => { cd.origin = "https://app.bitgraph.ing"; });
|
|
484
|
-
const result = await verifyProofIntegrity({ proof: tampered });
|
|
485
|
-
assert.equal(result.valid, false);
|
|
486
|
-
assert.doesNotMatch(result.reason ?? "", /origin|rpIdHash/);
|
|
487
|
-
assert.match(result.reason ?? "", /signature/i);
|
|
488
|
-
});
|
|
489
|
-
test("policy allowedOrigins accepts the production origin", async () => {
|
|
490
|
-
resetEpochLinkState();
|
|
491
|
-
const result = await verifyProofIntegrity({
|
|
492
|
-
proof: DECLARED_12010,
|
|
493
|
-
trustAnchors: { allowedOrigins: ["https://bitgraph.ing"] },
|
|
494
|
-
});
|
|
495
|
-
assert.equal(result.valid, true, result.valid ? "" : result.reason);
|
|
496
|
-
});
|
|
497
|
-
test("policy allowedOrigins refuses any other origin", async () => {
|
|
498
|
-
resetEpochLinkState();
|
|
499
|
-
const result = await verifyProofIntegrity({
|
|
500
|
-
proof: DECLARED_12010,
|
|
501
|
-
trustAnchors: { allowedOrigins: ["https://other.example"] },
|
|
502
|
-
});
|
|
503
|
-
assert.equal(result.valid, false);
|
|
504
|
-
assert.match(result.reason ?? "", /origin .* is not in the allowed set/);
|
|
505
|
-
});
|
|
506
|
-
test("policy allowedOrigins refuses a proof with no agency", async () => {
|
|
507
|
-
const result = await verify({
|
|
508
|
-
proof: fx.proof,
|
|
509
|
-
bytes: fx.bytes,
|
|
510
|
-
trustAnchors: { allowedOrigins: ["https://bitgraph.ing"] },
|
|
511
|
-
});
|
|
512
|
-
assert.equal(result.valid, false);
|
|
513
|
-
assert.match(result.reason ?? "", /no agency/);
|
|
514
|
-
});
|
|
515
|
-
});
|
|
516
|
-
// ---------------------------------------------------------------------------
|
|
517
|
-
// resetEpochLinkState
|
|
518
|
-
// ---------------------------------------------------------------------------
|
|
519
|
-
describe("resetEpochLinkState", () => {
|
|
520
|
-
test("is a function that can be called without error", () => {
|
|
521
|
-
assert.doesNotThrow(() => resetEpochLinkState());
|
|
522
|
-
});
|
|
523
|
-
test("can be called multiple times", () => {
|
|
524
|
-
assert.doesNotThrow(() => {
|
|
525
|
-
resetEpochLinkState();
|
|
526
|
-
resetEpochLinkState();
|
|
527
|
-
resetEpochLinkState();
|
|
528
|
-
});
|
|
529
|
-
});
|
|
530
|
-
});
|
|
531
|
-
//# sourceMappingURL=verifier.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.test.js","sourceRoot":"","sources":["../../src/__tests__/verifier.test.ts"],"names":[],"mappings":"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"}
|
package/dist/canonical.d.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bitgraph-core canonical serialization
|
|
3
|
-
*
|
|
4
|
-
* Produces a deterministic, UTF-8 encoded JSON byte sequence from an
|
|
5
|
-
* arbitrary JavaScript value. The output is used as the signing input
|
|
6
|
-
* for BitGraphProof signatures and must be reproduced identically by any
|
|
7
|
-
* verifier regardless of platform or runtime.
|
|
8
|
-
*
|
|
9
|
-
* Algorithm:
|
|
10
|
-
* 1. Recursively sort object keys lexicographically (Unicode code-point order)
|
|
11
|
-
* 2. Serialize with JSON.stringify (no whitespace)
|
|
12
|
-
* 3. Encode the resulting string as UTF-8
|
|
13
|
-
*
|
|
14
|
-
* Constraints satisfied:
|
|
15
|
-
* - Deterministic key ordering
|
|
16
|
-
* - No whitespace variance
|
|
17
|
-
* - Stable numeric formatting (JSON.stringify uses shortest representation)
|
|
18
|
-
* - UTF-8 output (TextEncoder default)
|
|
19
|
-
* - Rejects undefined, functions, and symbols, which have no JSON repr
|
|
20
|
-
*
|
|
21
|
-
* Limitations:
|
|
22
|
-
* - BigInt is not serializable via JSON.stringify; callers must convert
|
|
23
|
-
* to string before passing (consistent with the `counter` field type).
|
|
24
|
-
* - NaN and Infinity serialize as `null` in JSON; callers must validate
|
|
25
|
-
* numeric fields upstream.
|
|
26
|
-
* - Object prototype chains are not walked; only own enumerable keys.
|
|
27
|
-
*
|
|
28
|
-
* This module has zero dependencies on other bitgraph-core modules so that it
|
|
29
|
-
* can be used standalone for testing and external verification tooling.
|
|
30
|
-
*/
|
|
31
|
-
/**
|
|
32
|
-
* Serialize `obj` to canonical JSON and return UTF-8 encoded bytes.
|
|
33
|
-
*
|
|
34
|
-
* Throws if `obj` contains values that cannot survive a JSON round-trip
|
|
35
|
-
* without information loss (undefined top-level, functions, symbols, BigInt).
|
|
36
|
-
*/
|
|
37
|
-
export declare function canonicalize(obj: unknown): Uint8Array;
|
|
38
|
-
/**
|
|
39
|
-
* Serialize `obj` to a canonical JSON string.
|
|
40
|
-
* Exposed for debugging and test assertions.
|
|
41
|
-
*/
|
|
42
|
-
export declare function canonicalizeToString(obj: unknown): string;
|
|
43
|
-
/**
|
|
44
|
-
* Compare two Uint8Arrays in constant time.
|
|
45
|
-
*
|
|
46
|
-
* Returns true iff `a` and `b` have the same length and identical contents.
|
|
47
|
-
* Resistance against timing side-channels is important when comparing
|
|
48
|
-
* digests and signatures in the verifier.
|
|
49
|
-
*
|
|
50
|
-
* Note: JavaScript runtimes may still optimize this; a native binding would
|
|
51
|
-
* provide stronger guarantees. For v0.1 this is a reasonable best-effort.
|
|
52
|
-
*/
|
|
53
|
-
export declare function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
54
|
-
//# sourceMappingURL=canonical.d.ts.map
|
package/dist/canonical.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAMH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAGrD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEzD;AA2DD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAUvE"}
|