@freedomofpress/ics23 0.1.0 → 0.1.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.
@@ -1,24 +1,16 @@
1
1
  import leavesData from "../../testdata/webcat/leaves.json";
2
2
  import { describe, expect, it } from "vitest";
3
- import { calculateExistenceRoot, verifyExistence } from "../proofs";
3
+ import { calculateExistenceRoot } from "../proofs";
4
4
  import { verifyWebcatProof, webcatSpec } from "../webcat";
5
5
  import { CommitmentProof } from "../proto/cosmos/ics23/v1/proofs";
6
6
  import { fromHex, toHex } from "./testhelpers";
7
7
  describe("verifyWebcatProof", () => {
8
- it("verifies the provided leaf and canonical linkage", async () => {
9
- const [elementBytes, canonicalBytes] = leavesData.proof.merkle_proof.proof_bytes;
10
- const elementProof = CommitmentProof.decode(fromHex(elementBytes));
8
+ it("verifies canonical linkage and reconstruction", async () => {
9
+ const canonicalBytes = leavesData.proof.merkle_proof.proof_bytes[1];
11
10
  const canonicalProof = CommitmentProof.decode(fromHex(canonicalBytes));
12
- const elementRoot = await calculateExistenceRoot(elementProof.exist);
13
11
  const canonicalRoot = await calculateExistenceRoot(canonicalProof.exist);
14
- const elementKey = new TextEncoder().encode(leavesData.proof.merkle_proof.representative_key.replace(/^canonical\//, ""));
15
- const elementValue = fromHex(leavesData.leaves[1][1]);
16
- expect(elementProof.exist?.key).toEqual(elementKey);
17
- await expect(verifyExistence(elementProof.exist, webcatSpec, fromHex(leavesData.proof.canonical_root_hash), elementKey, elementValue)).resolves.not.toThrow();
18
- await expect(verifyExistence(canonicalProof.exist, webcatSpec, fromHex(leavesData.proof.app_hash), new TextEncoder().encode("canonical"), fromHex(leavesData.proof.canonical_root_hash))).resolves.not.toThrow();
19
- expect(toHex(elementRoot)).toBe(leavesData.proof.canonical_root_hash);
20
12
  expect(toHex(canonicalRoot)).toBe(leavesData.proof.app_hash);
21
- await expect(verifyWebcatProof(leavesData)).resolves.toBe(true);
13
+ await expect(verifyWebcatProof(leavesData)).resolves.toEqual(leavesData.leaves);
22
14
  });
23
15
  it("fails when app hash linkage is modified", async () => {
24
16
  const tampered = {
@@ -30,6 +22,13 @@ describe("verifyWebcatProof", () => {
30
22
  };
31
23
  await expect(verifyWebcatProof(tampered)).resolves.toBe(false);
32
24
  });
25
+ it("fails when canonical root cannot be reconstructed", async () => {
26
+ const tamperedLeaves = {
27
+ ...leavesData,
28
+ leaves: leavesData.leaves.map((leaf, index) => index === 0 ? [leaf[0], "00" + leaf[1].slice(2)] : leaf),
29
+ };
30
+ await expect(verifyWebcatProof(tamperedLeaves)).resolves.toBe(false);
31
+ });
33
32
  it("exposes the webcat spec for manual validation", async () => {
34
33
  const proofBytes = leavesData.proof.merkle_proof.proof_bytes[0];
35
34
  const proof = CommitmentProof.decode(fromHex(proofBytes));
@@ -37,7 +36,7 @@ describe("verifyWebcatProof", () => {
37
36
  ...leavesData,
38
37
  proof: leavesData.proof,
39
38
  });
40
- expect(validation).toBe(true);
39
+ expect(validation).toEqual(leavesData.leaves);
41
40
  expect(webcatSpec.leafSpec?.prefix?.length).toBe(13);
42
41
  expect(proof.exist?.leaf?.prefix).toEqual(webcatSpec.leafSpec?.prefix);
43
42
  });
@@ -1 +1 @@
1
- {"version":3,"file":"webcat.test.js","sourceRoot":"","sources":["../../src/tests/webcat.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webcat.test.js","sourceRoot":"","sources":["../../src/tests/webcat.test.ts"],"names":[],"mappings":"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"}
package/dist/webcat.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import { ProofSpec } from "./proto/cosmos/ics23/v1/proofs";
2
+ export type WebcatLeaf = readonly [string, string];
2
3
  export interface WebcatLeavesFile {
3
4
  readonly block_height: number;
4
- readonly leaves: readonly (readonly [string, string] | readonly string[])[];
5
+ readonly leaves: readonly (WebcatLeaf | readonly string[])[];
5
6
  readonly proof: {
6
7
  readonly app_hash: string;
7
8
  readonly canonical_root_hash: string;
8
9
  readonly merkle_proof: {
9
10
  readonly proof_bytes: readonly string[];
10
- readonly representative_key: string;
11
11
  };
12
12
  };
13
13
  }
14
14
  export declare const webcatSpec: ProofSpec;
15
- export declare function verifyWebcatProof(data: WebcatLeavesFile): Promise<boolean>;
15
+ export declare function verifyWebcatProof(data: WebcatLeavesFile): Promise<readonly WebcatLeaf[] | false>;
package/dist/webcat.js CHANGED
@@ -1,5 +1,7 @@
1
+ import { doHash } from "./ops";
1
2
  import { verifyExistence } from "./proofs";
2
3
  import { CommitmentProof, HashOp, LengthOp, } from "./proto/cosmos/ics23/v1/proofs";
4
+ import { bytesEqual } from "./specs";
3
5
  function fromHex(hexstring) {
4
6
  if (hexstring.length % 2 !== 0) {
5
7
  throw new Error("hex string length must be a multiple of 2");
@@ -16,7 +18,8 @@ function fromHex(hexstring) {
16
18
  }
17
19
  const utf8Encoder = new TextEncoder();
18
20
  const leafPrefix = utf8Encoder.encode("JMT::LeafNode");
19
- const innerPrefix = utf8Encoder.encode("JMT::InternalNode");
21
+ const innerPrefix = utf8Encoder.encode("JMT::IntrnalNode");
22
+ const placeholderMarker = "SPARSE_MERKLE_PLACEHOLDER_HASH__";
20
23
  export const webcatSpec = {
21
24
  leafSpec: {
22
25
  hash: HashOp.SHA256,
@@ -29,7 +32,7 @@ export const webcatSpec = {
29
32
  hash: HashOp.SHA256,
30
33
  childOrder: [0, 1],
31
34
  childSize: 32,
32
- minPrefixLength: innerPrefix.length - 1,
35
+ minPrefixLength: innerPrefix.length,
33
36
  maxPrefixLength: innerPrefix.length,
34
37
  emptyChild: new Uint8Array(),
35
38
  },
@@ -40,35 +43,101 @@ export const webcatSpec = {
40
43
  function decodeProof(hex) {
41
44
  return CommitmentProof.decode(fromHex(hex));
42
45
  }
43
- function collectLeafValue(data, representativeKey) {
44
- const match = data.leaves.find(([key]) => key === representativeKey);
45
- if (!match) {
46
- throw new Error("Representative key is missing from leaf set");
47
- }
48
- return fromHex(match[1]);
46
+ async function hashUtf8(message) {
47
+ return doHash(HashOp.SHA256, utf8Encoder.encode(message));
48
+ }
49
+ async function placeholderHash() {
50
+ return hashUtf8(placeholderMarker);
49
51
  }
50
- function stripCanonicalPrefix(key) {
52
+ function canonicalizeKey(key) {
51
53
  return key.replace(/^canonical\//, "");
52
54
  }
55
+ function normalizeLeaf(leaf) {
56
+ if (leaf.length < 2) {
57
+ throw new Error("Leaf entry must contain a key and value");
58
+ }
59
+ return [leaf[0], leaf[1]];
60
+ }
61
+ async function leafHash(key, valueHex) {
62
+ const hashedKey = await doHash(HashOp.SHA256, utf8Encoder.encode(canonicalizeKey(key)));
63
+ const hashedValue = await doHash(HashOp.SHA256, fromHex(valueHex));
64
+ const preimage = new Uint8Array([
65
+ ...leafPrefix,
66
+ ...hashedKey,
67
+ ...hashedValue,
68
+ ]);
69
+ return doHash(HashOp.SHA256, preimage);
70
+ }
71
+ async function combineChildren(left, right) {
72
+ const preimage = new Uint8Array([...innerPrefix, ...left, ...right]);
73
+ return doHash(HashOp.SHA256, preimage);
74
+ }
75
+ function bitIsSet(hash, depth) {
76
+ const byteIndex = Math.floor(depth / 8);
77
+ const bitIndex = 7 - (depth % 8);
78
+ const byte = hash[byteIndex] ?? 0;
79
+ return ((byte >> bitIndex) & 1) === 1;
80
+ }
81
+ async function prepareLeaves(leaves) {
82
+ const prepared = [];
83
+ for (const [key, valueHex] of leaves) {
84
+ const keyHash = await doHash(HashOp.SHA256, utf8Encoder.encode(canonicalizeKey(key)));
85
+ const nodeHash = await leafHash(key, valueHex);
86
+ prepared.push({ keyHash, nodeHash });
87
+ }
88
+ return prepared;
89
+ }
90
+ async function buildJmtRoot(placeholder, leaves, depth = 0) {
91
+ if (leaves.length === 0) {
92
+ return placeholder;
93
+ }
94
+ if (leaves.length === 1 || depth >= 256) {
95
+ return leaves[0].nodeHash;
96
+ }
97
+ const left = [];
98
+ const right = [];
99
+ for (const leaf of leaves) {
100
+ (bitIsSet(leaf.keyHash, depth) ? right : left).push(leaf);
101
+ }
102
+ const leftHash = left.length
103
+ ? await buildJmtRoot(placeholder, left, depth + 1)
104
+ : placeholder;
105
+ const rightHash = right.length
106
+ ? await buildJmtRoot(placeholder, right, depth + 1)
107
+ : placeholder;
108
+ return combineChildren(leftHash, rightHash);
109
+ }
110
+ async function reconstructCanonicalRoot(leaves) {
111
+ const placeholder = await placeholderHash();
112
+ if (leaves.length === 0) {
113
+ return placeholder;
114
+ }
115
+ const prepared = await prepareLeaves(leaves.map(normalizeLeaf));
116
+ return buildJmtRoot(placeholder, prepared);
117
+ }
118
+ async function verifyCanonicalRootLink(appHashHex, canonicalRootHex, proofBytes) {
119
+ if (proofBytes.length === 0) {
120
+ return false;
121
+ }
122
+ const canonicalProof = decodeProof(proofBytes[proofBytes.length - 1]);
123
+ if (!canonicalProof.exist) {
124
+ return false;
125
+ }
126
+ await verifyExistence(canonicalProof.exist, webcatSpec, fromHex(appHashHex), utf8Encoder.encode("canonical"), fromHex(canonicalRootHex));
127
+ return true;
128
+ }
53
129
  export async function verifyWebcatProof(data) {
54
130
  try {
55
- const { proof_bytes: proofBytes, representative_key } = data.proof.merkle_proof;
56
- if (proofBytes.length < 2) {
131
+ const normalizedLeaves = data.leaves.map(normalizeLeaf);
132
+ const reconstructedRoot = await reconstructCanonicalRoot(normalizedLeaves);
133
+ if (!bytesEqual(reconstructedRoot, fromHex(data.proof.canonical_root_hash))) {
57
134
  return false;
58
135
  }
59
- const elementProof = decodeProof(proofBytes[0]);
60
- const canonicalProof = decodeProof(proofBytes[1]);
61
- const canonicalRoot = fromHex(data.proof.canonical_root_hash);
62
- const appHash = fromHex(data.proof.app_hash);
63
- const elementKey = utf8Encoder.encode(stripCanonicalPrefix(representative_key));
64
- const elementValue = collectLeafValue(data, representative_key);
65
- if (!elementProof.exist || !canonicalProof.exist) {
136
+ const canonicalLinkValid = await verifyCanonicalRootLink(data.proof.app_hash, data.proof.canonical_root_hash, data.proof.merkle_proof.proof_bytes);
137
+ if (!canonicalLinkValid) {
66
138
  return false;
67
139
  }
68
- await verifyExistence(elementProof.exist, webcatSpec, canonicalRoot, elementKey, elementValue);
69
- const canonicalKey = utf8Encoder.encode("canonical");
70
- await verifyExistence(canonicalProof.exist, webcatSpec, appHash, canonicalKey, canonicalRoot);
71
- return true;
140
+ return normalizedLeaves;
72
141
  }
73
142
  catch {
74
143
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"webcat.js","sourceRoot":"","sources":["../src/webcat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webcat.js","sourceRoot":"","sources":["../src/webcat.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freedomofpress/ics23",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Merkle proof verification library (ICS23)",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
package/dist/.gitkeep DELETED
File without changes