@freedomofpress/cometbft 0.1.1 → 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.
@@ -2,6 +2,136 @@
2
2
  import { Uint8ArrayToHex } from "./encoding";
3
3
  import { CanonicalVote, } from "./proto/cometbft/types/v1/canonical";
4
4
  import { SignedMsgType } from "./proto/cometbft/types/v1/types";
5
+ const LEAF_PREFIX = new Uint8Array([0]);
6
+ const INNER_PREFIX = new Uint8Array([1]);
7
+ function concatBytes(...parts) {
8
+ const totalLen = parts.reduce((acc, p) => acc + p.length, 0);
9
+ const out = new Uint8Array(totalLen);
10
+ let offset = 0;
11
+ for (const p of parts) {
12
+ out.set(p, offset);
13
+ offset += p.length;
14
+ }
15
+ return out;
16
+ }
17
+ async function sha256(input) {
18
+ const digest = await crypto.subtle.digest("SHA-256", new Uint8Array(input));
19
+ return new Uint8Array(digest);
20
+ }
21
+ function encodeVarint(value) {
22
+ if (value < 0n)
23
+ throw new Error("encodeVarint expects a non-negative bigint");
24
+ const bytes = [];
25
+ let v = value;
26
+ while (v >= 0x80n) {
27
+ bytes.push(Number((v & 0x7fn) | 0x80n));
28
+ v >>= 7n;
29
+ }
30
+ bytes.push(Number(v));
31
+ return new Uint8Array(bytes);
32
+ }
33
+ function encodeFieldTag(fieldNumber, wireType) {
34
+ return encodeVarint(BigInt((fieldNumber << 3) | wireType));
35
+ }
36
+ function encodeProtoBytes(fieldNumber, value) {
37
+ return concatBytes(encodeFieldTag(fieldNumber, 2), encodeVarint(BigInt(value.length)), value);
38
+ }
39
+ function encodeProtoUint64(fieldNumber, value) {
40
+ return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(value));
41
+ }
42
+ function encodeProtoInt64(fieldNumber, value) {
43
+ const v = value < 0n ? (1n << 64n) + value : value;
44
+ return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(v));
45
+ }
46
+ function cdcEncodeString(value) {
47
+ if (value.length === 0)
48
+ return undefined;
49
+ return encodeProtoBytes(1, new TextEncoder().encode(value));
50
+ }
51
+ function cdcEncodeInt64(value) {
52
+ return encodeProtoInt64(1, value);
53
+ }
54
+ function cdcEncodeBytes(value) {
55
+ if (value.length === 0)
56
+ return undefined;
57
+ return encodeProtoBytes(1, value);
58
+ }
59
+ function encodeTimestamp(ts) {
60
+ const seconds = encodeProtoInt64(1, ts.seconds ?? 0n);
61
+ const nanos = ts.nanos
62
+ ? concatBytes(encodeFieldTag(2, 0), encodeVarint(BigInt(ts.nanos)))
63
+ : new Uint8Array(0);
64
+ return concatBytes(seconds, nanos);
65
+ }
66
+ function encodePartSetHeader(total, hash) {
67
+ return concatBytes(encodeProtoUint64(1, BigInt(total)), encodeProtoBytes(2, hash));
68
+ }
69
+ function encodeBlockId(hash, partSetTotal, partSetHash) {
70
+ const psh = encodePartSetHeader(partSetTotal, partSetHash);
71
+ return concatBytes(encodeProtoBytes(1, hash), encodeProtoBytes(2, psh));
72
+ }
73
+ async function merkleLeafHash(leaf) {
74
+ return sha256(concatBytes(LEAF_PREFIX, leaf));
75
+ }
76
+ async function merkleInnerHash(left, right) {
77
+ return sha256(concatBytes(INNER_PREFIX, left, right));
78
+ }
79
+ function merkleSplitPoint(length) {
80
+ if (length < 1)
81
+ throw new Error("Trying to split a tree with size < 1");
82
+ const bitLen = Math.floor(Math.log2(length)) + 1;
83
+ let k = 1 << (bitLen - 1);
84
+ if (k === length)
85
+ k >>= 1;
86
+ return k;
87
+ }
88
+ async function merkleHashFromByteSlices(items) {
89
+ if (items.length === 0)
90
+ return sha256(new Uint8Array(0));
91
+ if (items.length === 1)
92
+ return merkleLeafHash(items[0]);
93
+ const k = merkleSplitPoint(items.length);
94
+ const left = await merkleHashFromByteSlices(items.slice(0, k));
95
+ const right = await merkleHashFromByteSlices(items.slice(k));
96
+ return merkleInnerHash(left, right);
97
+ }
98
+ async function computeHeaderHash(header) {
99
+ if (!header)
100
+ throw new Error("SignedHeader missing header");
101
+ if (!header.lastBlockId || !header.lastBlockId.partSetHeader) {
102
+ throw new Error("Header lastBlockId is missing");
103
+ }
104
+ if (!header.time)
105
+ throw new Error("Header time is missing");
106
+ const version = concatBytes(encodeProtoUint64(1, header.version?.block ?? 0n), encodeProtoUint64(2, header.version?.app ?? 0n));
107
+ const lastBlockId = encodeBlockId(header.lastBlockId.hash, header.lastBlockId.partSetHeader.total, header.lastBlockId.partSetHeader.hash);
108
+ const fields = [
109
+ version,
110
+ cdcEncodeString(header.chainId),
111
+ cdcEncodeInt64(header.height),
112
+ encodeTimestamp(header.time),
113
+ lastBlockId,
114
+ cdcEncodeBytes(header.lastCommitHash),
115
+ cdcEncodeBytes(header.dataHash),
116
+ cdcEncodeBytes(header.validatorsHash),
117
+ cdcEncodeBytes(header.nextValidatorsHash),
118
+ cdcEncodeBytes(header.consensusHash),
119
+ cdcEncodeBytes(header.appHash),
120
+ cdcEncodeBytes(header.lastResultsHash),
121
+ cdcEncodeBytes(header.evidenceHash),
122
+ cdcEncodeBytes(header.proposerAddress),
123
+ ].filter((x) => Boolean(x));
124
+ return merkleHashFromByteSlices(fields);
125
+ }
126
+ function bytesEqual(a, b) {
127
+ if (a.length !== b.length)
128
+ return false;
129
+ for (let i = 0; i < a.length; i++) {
130
+ if (a[i] !== b[i])
131
+ return false;
132
+ }
133
+ return true;
134
+ }
5
135
  function encodeUvarint(value) {
6
136
  if (!Number.isSafeInteger(value) || value < 0)
7
137
  throw new Error("encodeUvarint expects a non-negative safe integer");
@@ -82,6 +212,10 @@ export async function verifyCommit(sh, vset, cryptoIndex) {
82
212
  const blockIdHash = bid.hash;
83
213
  const partsHash = bid.partSetHeader.hash;
84
214
  const partsTotal = bid.partSetHeader.total;
215
+ const expectedBlockHash = await computeHeaderHash(header);
216
+ if (!bytesEqual(expectedBlockHash, blockIdHash)) {
217
+ throw new Error("Header hash does not match commit BlockID hash (header fields were tampered or inconsistent)");
218
+ }
85
219
  let signedPower = 0n;
86
220
  const unknown = [];
87
221
  const invalid = [];
@@ -1 +1 @@
1
- {"version":3,"file":"lightclient.js","sourceRoot":"","sources":["../src/lightclient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lightclient.js","sourceRoot":"","sources":["../src/lightclient.ts"],"names":[],"mappings":"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"}
@@ -26,7 +26,7 @@ describe("lightclient.verifyCommit", () => {
26
26
  expect(out.invalidSignatures.length).toBe(0);
27
27
  expect(out.countedSignatures).toBeGreaterThan(0);
28
28
  });
29
- it("fails quorum and invalidates all signatures when block_id.hash is tampered", async () => {
29
+ it("throws when commit block_id.hash does not match the header hash", async () => {
30
30
  const vResp = validatorsFixture;
31
31
  const { proto: vset, cryptoIndex } = await importValidators(vResp);
32
32
  const badCommit = clone(commitFixture);
@@ -34,10 +34,17 @@ describe("lightclient.verifyCommit", () => {
34
34
  badCommit.signed_header.commit.block_id.hash =
35
35
  h.slice(0, -2) + (h.slice(-2) === "00" ? "01" : "00");
36
36
  const sh = importCommit(badCommit);
37
- const out = await verifyCommit(sh, vset, cryptoIndex);
38
- expect(out.quorum).toBe(false);
39
- expect(out.invalidSignatures.length).toBe(out.countedSignatures);
40
- expect(out.ok).toBe(false);
37
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
38
+ });
39
+ it("throws when app_hash is tampered", async () => {
40
+ const vResp = validatorsFixture;
41
+ const { proto: vset, cryptoIndex } = await importValidators(vResp);
42
+ const badHeader = clone(commitFixture);
43
+ const appHash = badHeader.signed_header.header.app_hash;
44
+ badHeader.signed_header.header.app_hash =
45
+ appHash.slice(0, -2) + (appHash.slice(-2) === "00" ? "01" : "00");
46
+ const sh = importCommit(badHeader);
47
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
41
48
  });
42
49
  it("drops below 2/3 quorum when two votes are ABSENT", async () => {
43
50
  const vResp = validatorsFixture;
@@ -1 +1 @@
1
- {"version":3,"file":"lightclient.test.js","sourceRoot":"","sources":["../../src/tests/lightclient.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lightclient.test.js","sourceRoot":"","sources":["../../src/tests/lightclient.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { importCommit } from "../commit";
3
- import { Uint8ArrayToBase64, Uint8ArrayToHex } from "../encoding";
3
+ import { Uint8ArrayToBase64 } from "../encoding";
4
4
  import { verifyCommit } from "../lightclient";
5
5
  import { importValidators } from "../validators";
6
6
  import blockFixture from "./fixtures/webcat.json";
@@ -8,55 +8,29 @@ function clone(x) {
8
8
  return JSON.parse(JSON.stringify(x));
9
9
  }
10
10
  describe("lightclient.verifyCommit", () => {
11
- it("verifies a valid commit against the validator set", async () => {
11
+ it("rejects this fixture when header hash does not match commit block_id.hash", async () => {
12
12
  const validators = blockFixture.validator_set;
13
13
  const commit = blockFixture;
14
14
  const { proto: vset, cryptoIndex } = await importValidators(validators);
15
15
  const sh = importCommit(commit);
16
- const out = await verifyCommit(sh, vset, cryptoIndex);
17
- expect(out.quorum).toBe(true);
18
- expect(out.ok).toBe(true);
19
- expect(out.signedPower > 0n).toBe(true);
20
- expect(out.signedPower <= out.totalPower).toBe(true);
21
- expect(out.headerTime).toBeDefined();
22
- expect(out.appHash instanceof Uint8Array).toBe(true);
23
- expect(out.blockIdHash instanceof Uint8Array).toBe(true);
24
- expect(out.unknownValidators.length).toBe(0);
25
- expect(out.invalidSignatures.length).toBe(0);
26
- expect(out.countedSignatures).toBeGreaterThan(0);
16
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
27
17
  });
28
- it("flags invalid signatures", async () => {
18
+ it("throws when commit block_id.hash does not match header hash", async () => {
29
19
  const validators = blockFixture.validator_set;
30
20
  const commit = clone(blockFixture);
31
- // Flip one byte of the BlockID hash to keep the signature well-formed but
32
- // cryptographically invalid for the mutated sign-bytes.
33
21
  commit.signed_header.commit.block_id.hash =
34
22
  "3A1D00CC2A092465E85EA2C24986BEE0105285039DC1873BB6B0CA7F610EC89D";
35
23
  const { proto: vset, cryptoIndex } = await importValidators(validators);
36
24
  const sh = importCommit(commit);
37
- const out = await verifyCommit(sh, vset, cryptoIndex);
38
- expect(out.quorum).toBe(false);
39
- expect(out.ok).toBe(false);
40
- expect(out.signedPower).toBe(0n);
41
- expect(out.invalidSignatures).toEqual([
42
- Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
43
- ]);
44
- expect(out.countedSignatures).toBe(1);
25
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
45
26
  });
46
- it("flags invalid signatures", async () => {
27
+ it("still rejects on header/commit hash mismatch even when a signature is corrupted", async () => {
47
28
  const validators = blockFixture.validator_set;
48
29
  const commit = clone(blockFixture);
49
30
  commit.signed_header.commit.signatures[0].signature = Uint8ArrayToBase64(new Uint8Array(64));
50
31
  const { proto: vset, cryptoIndex } = await importValidators(validators);
51
32
  const sh = importCommit(commit);
52
- const out = await verifyCommit(sh, vset, cryptoIndex);
53
- expect(out.quorum).toBe(false);
54
- expect(out.ok).toBe(false);
55
- expect(out.signedPower).toBe(0n);
56
- expect(out.invalidSignatures).toEqual([
57
- Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
58
- ]);
59
- expect(out.countedSignatures).toBe(1);
33
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
60
34
  });
61
35
  it("rejects malformed signature bytes", async () => {
62
36
  const validators = blockFixture.validator_set;
@@ -65,22 +39,14 @@ describe("lightclient.verifyCommit", () => {
65
39
  commit.signed_header.commit.signatures[0].signature = "AA==";
66
40
  await expect(async () => importCommit(commit)).rejects.toThrow(/signature must be 64 bytes/);
67
41
  });
68
- it("reports unknown validators", async () => {
42
+ it("still rejects on header/commit hash mismatch even when validator is unknown", async () => {
69
43
  const validators = blockFixture.validator_set;
70
44
  const commit = clone(blockFixture);
71
45
  commit.signed_header.commit.signatures[0].validator_address =
72
46
  "0000000000000000000000000000000000000000";
73
47
  const { proto: vset, cryptoIndex } = await importValidators(validators);
74
48
  const sh = importCommit(commit);
75
- const out = await verifyCommit(sh, vset, cryptoIndex);
76
- expect(out.quorum).toBe(false);
77
- expect(out.ok).toBe(false);
78
- expect(out.signedPower).toBe(0n);
79
- expect(out.invalidSignatures).toEqual([]);
80
- expect(out.unknownValidators).toEqual([
81
- "0000000000000000000000000000000000000000",
82
- ]);
83
- expect(out.countedSignatures).toBe(0);
49
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(/header hash does not match commit blockid hash/i);
84
50
  });
85
51
  });
86
52
  //# sourceMappingURL=webcat.test.js.map
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAElD,SAAS,KAAK,CAAI,CAAI;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,YAAqC,CAAC;QAErD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;YACvC,kEAAkE,CAAC;QAErE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,kBAAkB,CACtE,IAAI,UAAU,CAAC,EAAE,CAAC,CACnB,CAAC;QAEF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,wDAAwD;QACxD,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;QAE7D,MAAM,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5D,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,UAAU,GAAG,YAAY,CAAC,aAAyC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAA0B,CAAC;QAE5D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB;YACzD,0CAA0C,CAAC;QAE7C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freedomofpress/cometbft",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "A CometBFT light client for the browser.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,13 +27,13 @@
27
27
  "homepage": "https://github.com/freedomofpress/cometbft-ts#readme",
28
28
  "bugs": "https://github.com/freedomofpress/cometbft-ts/issues",
29
29
  "devDependencies": {
30
- "@vitest/coverage-v8": "^4.0.13",
30
+ "@vitest/coverage-v8": "^4.0.18",
31
31
  "eslint-plugin-simple-import-sort": "^12.1.1",
32
32
  "typescript": "^5.9.3",
33
- "typescript-eslint": "^8.48.0",
34
- "vitest": "^4.0.13"
33
+ "typescript-eslint": "^8.56.1",
34
+ "vitest": "^4.0.18"
35
35
  },
36
36
  "dependencies": {
37
- "@bufbuild/protobuf": "^2.10.1"
37
+ "@bufbuild/protobuf": "^2.11.0"
38
38
  }
39
39
  }
@@ -12,6 +12,175 @@ import {
12
12
  } from "./proto/cometbft/types/v1/validator";
13
13
  import { Timestamp as PbTimestamp } from "./proto/google/protobuf/timestamp";
14
14
 
15
+ const LEAF_PREFIX = new Uint8Array([0]);
16
+ const INNER_PREFIX = new Uint8Array([1]);
17
+
18
+ function concatBytes(...parts: Uint8Array[]): Uint8Array {
19
+ const totalLen = parts.reduce((acc, p) => acc + p.length, 0);
20
+ const out = new Uint8Array(totalLen);
21
+ let offset = 0;
22
+ for (const p of parts) {
23
+ out.set(p, offset);
24
+ offset += p.length;
25
+ }
26
+ return out;
27
+ }
28
+
29
+ async function sha256(input: Uint8Array): Promise<Uint8Array> {
30
+ const digest = await crypto.subtle.digest("SHA-256", new Uint8Array(input));
31
+ return new Uint8Array(digest);
32
+ }
33
+
34
+ function encodeVarint(value: bigint): Uint8Array {
35
+ if (value < 0n) throw new Error("encodeVarint expects a non-negative bigint");
36
+ const bytes: number[] = [];
37
+ let v = value;
38
+ while (v >= 0x80n) {
39
+ bytes.push(Number((v & 0x7fn) | 0x80n));
40
+ v >>= 7n;
41
+ }
42
+ bytes.push(Number(v));
43
+ return new Uint8Array(bytes);
44
+ }
45
+
46
+ function encodeFieldTag(fieldNumber: number, wireType: number): Uint8Array {
47
+ return encodeVarint(BigInt((fieldNumber << 3) | wireType));
48
+ }
49
+
50
+ function encodeProtoBytes(fieldNumber: number, value: Uint8Array): Uint8Array {
51
+ return concatBytes(
52
+ encodeFieldTag(fieldNumber, 2),
53
+ encodeVarint(BigInt(value.length)),
54
+ value,
55
+ );
56
+ }
57
+
58
+ function encodeProtoUint64(fieldNumber: number, value: bigint): Uint8Array {
59
+ return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(value));
60
+ }
61
+
62
+ function encodeProtoInt64(fieldNumber: number, value: bigint): Uint8Array {
63
+ const v = value < 0n ? (1n << 64n) + value : value;
64
+ return concatBytes(encodeFieldTag(fieldNumber, 0), encodeVarint(v));
65
+ }
66
+
67
+ function cdcEncodeString(value: string): Uint8Array | undefined {
68
+ if (value.length === 0) return undefined;
69
+ return encodeProtoBytes(1, new TextEncoder().encode(value));
70
+ }
71
+
72
+ function cdcEncodeInt64(value: bigint): Uint8Array {
73
+ return encodeProtoInt64(1, value);
74
+ }
75
+
76
+ function cdcEncodeBytes(value: Uint8Array): Uint8Array | undefined {
77
+ if (value.length === 0) return undefined;
78
+ return encodeProtoBytes(1, value);
79
+ }
80
+
81
+ function encodeTimestamp(ts: PbTimestamp): Uint8Array {
82
+ const seconds = encodeProtoInt64(1, ts.seconds ?? 0n);
83
+ const nanos = ts.nanos
84
+ ? concatBytes(encodeFieldTag(2, 0), encodeVarint(BigInt(ts.nanos)))
85
+ : new Uint8Array(0);
86
+ return concatBytes(seconds, nanos);
87
+ }
88
+
89
+ function encodePartSetHeader(total: number, hash: Uint8Array): Uint8Array {
90
+ return concatBytes(
91
+ encodeProtoUint64(1, BigInt(total)),
92
+ encodeProtoBytes(2, hash),
93
+ );
94
+ }
95
+
96
+ function encodeBlockId(
97
+ hash: Uint8Array,
98
+ partSetTotal: number,
99
+ partSetHash: Uint8Array,
100
+ ): Uint8Array {
101
+ const psh = encodePartSetHeader(partSetTotal, partSetHash);
102
+ return concatBytes(encodeProtoBytes(1, hash), encodeProtoBytes(2, psh));
103
+ }
104
+
105
+ async function merkleLeafHash(leaf: Uint8Array): Promise<Uint8Array> {
106
+ return sha256(concatBytes(LEAF_PREFIX, leaf));
107
+ }
108
+
109
+ async function merkleInnerHash(
110
+ left: Uint8Array,
111
+ right: Uint8Array,
112
+ ): Promise<Uint8Array> {
113
+ return sha256(concatBytes(INNER_PREFIX, left, right));
114
+ }
115
+
116
+ function merkleSplitPoint(length: number): number {
117
+ if (length < 1) throw new Error("Trying to split a tree with size < 1");
118
+ const bitLen = Math.floor(Math.log2(length)) + 1;
119
+ let k = 1 << (bitLen - 1);
120
+ if (k === length) k >>= 1;
121
+ return k;
122
+ }
123
+
124
+ async function merkleHashFromByteSlices(
125
+ items: Uint8Array[],
126
+ ): Promise<Uint8Array> {
127
+ if (items.length === 0) return sha256(new Uint8Array(0));
128
+ if (items.length === 1) return merkleLeafHash(items[0]);
129
+
130
+ const k = merkleSplitPoint(items.length);
131
+ const left = await merkleHashFromByteSlices(items.slice(0, k));
132
+ const right = await merkleHashFromByteSlices(items.slice(k));
133
+ return merkleInnerHash(left, right);
134
+ }
135
+
136
+ async function computeHeaderHash(
137
+ header: SignedHeader["header"],
138
+ ): Promise<Uint8Array> {
139
+ if (!header) throw new Error("SignedHeader missing header");
140
+ if (!header.lastBlockId || !header.lastBlockId.partSetHeader) {
141
+ throw new Error("Header lastBlockId is missing");
142
+ }
143
+ if (!header.time) throw new Error("Header time is missing");
144
+
145
+ const version = concatBytes(
146
+ encodeProtoUint64(1, header.version?.block ?? 0n),
147
+ encodeProtoUint64(2, header.version?.app ?? 0n),
148
+ );
149
+
150
+ const lastBlockId = encodeBlockId(
151
+ header.lastBlockId.hash,
152
+ header.lastBlockId.partSetHeader.total,
153
+ header.lastBlockId.partSetHeader.hash,
154
+ );
155
+
156
+ const fields: Uint8Array[] = [
157
+ version,
158
+ cdcEncodeString(header.chainId),
159
+ cdcEncodeInt64(header.height),
160
+ encodeTimestamp(header.time),
161
+ lastBlockId,
162
+ cdcEncodeBytes(header.lastCommitHash),
163
+ cdcEncodeBytes(header.dataHash),
164
+ cdcEncodeBytes(header.validatorsHash),
165
+ cdcEncodeBytes(header.nextValidatorsHash),
166
+ cdcEncodeBytes(header.consensusHash),
167
+ cdcEncodeBytes(header.appHash),
168
+ cdcEncodeBytes(header.lastResultsHash),
169
+ cdcEncodeBytes(header.evidenceHash),
170
+ cdcEncodeBytes(header.proposerAddress),
171
+ ].filter((x): x is Uint8Array => Boolean(x));
172
+
173
+ return merkleHashFromByteSlices(fields);
174
+ }
175
+
176
+ function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {
177
+ if (a.length !== b.length) return false;
178
+ for (let i = 0; i < a.length; i++) {
179
+ if (a[i] !== b[i]) return false;
180
+ }
181
+ return true;
182
+ }
183
+
15
184
  export type CryptoIndex = Map<string, CryptoKey>;
16
185
 
17
186
  export interface VerifyOutcome {
@@ -133,6 +302,13 @@ export async function verifyCommit(
133
302
  const partsHash: Uint8Array = bid.partSetHeader.hash;
134
303
  const partsTotal: number = bid.partSetHeader.total;
135
304
 
305
+ const expectedBlockHash = await computeHeaderHash(header);
306
+ if (!bytesEqual(expectedBlockHash, blockIdHash)) {
307
+ throw new Error(
308
+ "Header hash does not match commit BlockID hash (header fields were tampered or inconsistent)",
309
+ );
310
+ }
311
+
136
312
  let signedPower = 0n;
137
313
  const unknown: string[] = [];
138
314
  const invalid: string[] = [];
@@ -38,7 +38,7 @@ describe("lightclient.verifyCommit", () => {
38
38
  expect(out.countedSignatures).toBeGreaterThan(0);
39
39
  });
40
40
 
41
- it("fails quorum and invalidates all signatures when block_id.hash is tampered", async () => {
41
+ it("throws when commit block_id.hash does not match the header hash", async () => {
42
42
  const vResp = validatorsFixture as unknown as ValidatorJson;
43
43
  const { proto: vset, cryptoIndex } = await importValidators(vResp);
44
44
 
@@ -48,11 +48,26 @@ describe("lightclient.verifyCommit", () => {
48
48
  h.slice(0, -2) + (h.slice(-2) === "00" ? "01" : "00");
49
49
 
50
50
  const sh = importCommit(badCommit as CommitJson);
51
- const out = await verifyCommit(sh, vset, cryptoIndex);
52
51
 
53
- expect(out.quorum).toBe(false);
54
- expect(out.invalidSignatures.length).toBe(out.countedSignatures);
55
- expect(out.ok).toBe(false);
52
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
53
+ /header hash does not match commit blockid hash/i,
54
+ );
55
+ });
56
+
57
+ it("throws when app_hash is tampered", async () => {
58
+ const vResp = validatorsFixture as unknown as ValidatorJson;
59
+ const { proto: vset, cryptoIndex } = await importValidators(vResp);
60
+
61
+ const badHeader = clone(commitFixture) as any;
62
+ const appHash: string = badHeader.signed_header.header.app_hash;
63
+ badHeader.signed_header.header.app_hash =
64
+ appHash.slice(0, -2) + (appHash.slice(-2) === "00" ? "01" : "00");
65
+
66
+ const sh = importCommit(badHeader as CommitJson);
67
+
68
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
69
+ /header hash does not match commit blockid hash/i,
70
+ );
56
71
  });
57
72
 
58
73
  it("drops below 2/3 quorum when two votes are ABSENT", async () => {
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
 
3
3
  import { importCommit } from "../commit";
4
- import { Uint8ArrayToBase64, Uint8ArrayToHex } from "../encoding";
4
+ import { Uint8ArrayToBase64 } from "../encoding";
5
5
  import { verifyCommit } from "../lightclient";
6
6
  import type { CommitJson, ValidatorJson } from "../types";
7
7
  import { importValidators } from "../validators";
@@ -12,51 +12,34 @@ function clone<T>(x: T): T {
12
12
  }
13
13
 
14
14
  describe("lightclient.verifyCommit", () => {
15
- it("verifies a valid commit against the validator set", async () => {
15
+ it("rejects this fixture when header hash does not match commit block_id.hash", async () => {
16
16
  const validators = blockFixture.validator_set as unknown as ValidatorJson;
17
17
  const commit = blockFixture as unknown as CommitJson;
18
18
 
19
19
  const { proto: vset, cryptoIndex } = await importValidators(validators);
20
20
  const sh = importCommit(commit);
21
21
 
22
- const out = await verifyCommit(sh, vset, cryptoIndex);
23
-
24
- expect(out.quorum).toBe(true);
25
- expect(out.ok).toBe(true);
26
- expect(out.signedPower > 0n).toBe(true);
27
- expect(out.signedPower <= out.totalPower).toBe(true);
28
- expect(out.headerTime).toBeDefined();
29
- expect(out.appHash instanceof Uint8Array).toBe(true);
30
- expect(out.blockIdHash instanceof Uint8Array).toBe(true);
31
- expect(out.unknownValidators.length).toBe(0);
32
- expect(out.invalidSignatures.length).toBe(0);
33
- expect(out.countedSignatures).toBeGreaterThan(0);
22
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
23
+ /header hash does not match commit blockid hash/i,
24
+ );
34
25
  });
35
26
 
36
- it("flags invalid signatures", async () => {
27
+ it("throws when commit block_id.hash does not match header hash", async () => {
37
28
  const validators = blockFixture.validator_set as unknown as ValidatorJson;
38
29
  const commit = clone(blockFixture) as unknown as CommitJson;
39
30
 
40
- // Flip one byte of the BlockID hash to keep the signature well-formed but
41
- // cryptographically invalid for the mutated sign-bytes.
42
31
  commit.signed_header.commit.block_id.hash =
43
32
  "3A1D00CC2A092465E85EA2C24986BEE0105285039DC1873BB6B0CA7F610EC89D";
44
33
 
45
34
  const { proto: vset, cryptoIndex } = await importValidators(validators);
46
35
  const sh = importCommit(commit);
47
36
 
48
- const out = await verifyCommit(sh, vset, cryptoIndex);
49
-
50
- expect(out.quorum).toBe(false);
51
- expect(out.ok).toBe(false);
52
- expect(out.signedPower).toBe(0n);
53
- expect(out.invalidSignatures).toEqual([
54
- Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
55
- ]);
56
- expect(out.countedSignatures).toBe(1);
37
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
38
+ /header hash does not match commit blockid hash/i,
39
+ );
57
40
  });
58
41
 
59
- it("flags invalid signatures", async () => {
42
+ it("still rejects on header/commit hash mismatch even when a signature is corrupted", async () => {
60
43
  const validators = blockFixture.validator_set as unknown as ValidatorJson;
61
44
  const commit = clone(blockFixture) as unknown as CommitJson;
62
45
 
@@ -67,15 +50,9 @@ describe("lightclient.verifyCommit", () => {
67
50
  const { proto: vset, cryptoIndex } = await importValidators(validators);
68
51
  const sh = importCommit(commit);
69
52
 
70
- const out = await verifyCommit(sh, vset, cryptoIndex);
71
-
72
- expect(out.quorum).toBe(false);
73
- expect(out.ok).toBe(false);
74
- expect(out.signedPower).toBe(0n);
75
- expect(out.invalidSignatures).toEqual([
76
- Uint8ArrayToHex(vset.validators[0].address).toUpperCase(),
77
- ]);
78
- expect(out.countedSignatures).toBe(1);
53
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
54
+ /header hash does not match commit blockid hash/i,
55
+ );
79
56
  });
80
57
 
81
58
  it("rejects malformed signature bytes", async () => {
@@ -90,7 +67,7 @@ describe("lightclient.verifyCommit", () => {
90
67
  );
91
68
  });
92
69
 
93
- it("reports unknown validators", async () => {
70
+ it("still rejects on header/commit hash mismatch even when validator is unknown", async () => {
94
71
  const validators = blockFixture.validator_set as unknown as ValidatorJson;
95
72
  const commit = clone(blockFixture) as unknown as CommitJson;
96
73
 
@@ -100,15 +77,8 @@ describe("lightclient.verifyCommit", () => {
100
77
  const { proto: vset, cryptoIndex } = await importValidators(validators);
101
78
  const sh = importCommit(commit);
102
79
 
103
- const out = await verifyCommit(sh, vset, cryptoIndex);
104
-
105
- expect(out.quorum).toBe(false);
106
- expect(out.ok).toBe(false);
107
- expect(out.signedPower).toBe(0n);
108
- expect(out.invalidSignatures).toEqual([]);
109
- expect(out.unknownValidators).toEqual([
110
- "0000000000000000000000000000000000000000",
111
- ]);
112
- expect(out.countedSignatures).toBe(0);
80
+ await expect(verifyCommit(sh, vset, cryptoIndex)).rejects.toThrow(
81
+ /header hash does not match commit blockid hash/i,
82
+ );
113
83
  });
114
84
  });