@cardanowall/crypto-core 0.0.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.
Files changed (81) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +192 -0
  3. package/dist/aead.cjs +44 -0
  4. package/dist/aead.cjs.map +1 -0
  5. package/dist/aead.d.cts +38 -0
  6. package/dist/aead.d.ts +38 -0
  7. package/dist/aead.js +38 -0
  8. package/dist/aead.js.map +1 -0
  9. package/dist/cbor.cjs +69 -0
  10. package/dist/cbor.cjs.map +1 -0
  11. package/dist/cbor.d.cts +17 -0
  12. package/dist/cbor.d.ts +17 -0
  13. package/dist/cbor.js +64 -0
  14. package/dist/cbor.js.map +1 -0
  15. package/dist/cose.cjs +430 -0
  16. package/dist/cose.cjs.map +1 -0
  17. package/dist/cose.d.cts +72 -0
  18. package/dist/cose.d.ts +72 -0
  19. package/dist/cose.js +398 -0
  20. package/dist/cose.js.map +1 -0
  21. package/dist/hash.cjs +165 -0
  22. package/dist/hash.cjs.map +1 -0
  23. package/dist/hash.d.cts +30 -0
  24. package/dist/hash.d.ts +30 -0
  25. package/dist/hash.js +155 -0
  26. package/dist/hash.js.map +1 -0
  27. package/dist/index.cjs +1856 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +12 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.js +1759 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/kdf.cjs +26 -0
  34. package/dist/kdf.cjs.map +1 -0
  35. package/dist/kdf.d.cts +25 -0
  36. package/dist/kdf.d.ts +25 -0
  37. package/dist/kdf.js +23 -0
  38. package/dist/kdf.js.map +1 -0
  39. package/dist/kem.cjs +86 -0
  40. package/dist/kem.cjs.map +1 -0
  41. package/dist/kem.d.cts +47 -0
  42. package/dist/kem.d.ts +47 -0
  43. package/dist/kem.js +73 -0
  44. package/dist/kem.js.map +1 -0
  45. package/dist/merkle.cjs +284 -0
  46. package/dist/merkle.cjs.map +1 -0
  47. package/dist/merkle.d.cts +24 -0
  48. package/dist/merkle.d.ts +24 -0
  49. package/dist/merkle.js +279 -0
  50. package/dist/merkle.js.map +1 -0
  51. package/dist/recipient.cjs +141 -0
  52. package/dist/recipient.cjs.map +1 -0
  53. package/dist/recipient.d.cts +16 -0
  54. package/dist/recipient.d.ts +16 -0
  55. package/dist/recipient.js +135 -0
  56. package/dist/recipient.js.map +1 -0
  57. package/dist/sealed-poe.cjs +851 -0
  58. package/dist/sealed-poe.cjs.map +1 -0
  59. package/dist/sealed-poe.d.cts +134 -0
  60. package/dist/sealed-poe.d.ts +134 -0
  61. package/dist/sealed-poe.js +838 -0
  62. package/dist/sealed-poe.js.map +1 -0
  63. package/dist/seed-derive.cjs +129 -0
  64. package/dist/seed-derive.cjs.map +1 -0
  65. package/dist/seed-derive.d.cts +28 -0
  66. package/dist/seed-derive.d.ts +28 -0
  67. package/dist/seed-derive.js +101 -0
  68. package/dist/seed-derive.js.map +1 -0
  69. package/dist/sig.cjs +77 -0
  70. package/dist/sig.cjs.map +1 -0
  71. package/dist/sig.d.cts +17 -0
  72. package/dist/sig.d.ts +17 -0
  73. package/dist/sig.js +53 -0
  74. package/dist/sig.js.map +1 -0
  75. package/dist/util.cjs +36 -0
  76. package/dist/util.cjs.map +1 -0
  77. package/dist/util.d.cts +5 -0
  78. package/dist/util.d.ts +5 -0
  79. package/dist/util.js +33 -0
  80. package/dist/util.js.map +1 -0
  81. package/package.json +122 -0
package/dist/hash.cjs ADDED
@@ -0,0 +1,165 @@
1
+ 'use strict';
2
+
3
+ var sha2_js = require('@noble/hashes/sha2.js');
4
+ var blake2_js = require('@noble/hashes/blake2.js');
5
+ var hashWasm = require('hash-wasm');
6
+
7
+ // src/hash/sha-256.ts
8
+ function sha256(input) {
9
+ return sha2_js.sha256(input);
10
+ }
11
+ function blake2b256(input) {
12
+ return blake2_js.blake2b(input, { dkLen: 32 });
13
+ }
14
+ function blake2b224(input) {
15
+ return blake2_js.blake2b(input, { dkLen: 28 });
16
+ }
17
+ function dualHash(input) {
18
+ return {
19
+ sha256: sha256(input),
20
+ blake2b256: blake2b256(input)
21
+ };
22
+ }
23
+ async function dualHashStream(source) {
24
+ const [sha, blake] = await Promise.all([hashWasm.createSHA256(), hashWasm.createBLAKE2b(256)]);
25
+ sha.init();
26
+ blake.init();
27
+ for await (const chunk of source) {
28
+ sha.update(chunk);
29
+ blake.update(chunk);
30
+ }
31
+ return {
32
+ sha256: sha.digest("binary"),
33
+ blake2b256: blake.digest("binary")
34
+ };
35
+ }
36
+
37
+ // src/util/compare-ct.ts
38
+ function compareCt(a, b) {
39
+ if (a.length !== b.length) return false;
40
+ let diff = 0;
41
+ for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];
42
+ return diff === 0;
43
+ }
44
+
45
+ // src/hash/merkle-sha2-256.ts
46
+ var MERKLE_ALG_ID = "rfc9162-sha256";
47
+ var LEAF_PREFIX = 0;
48
+ var NODE_PREFIX = 1;
49
+ var DIGEST_LENGTH = 32;
50
+ function validateLeaves(leaves, fnName) {
51
+ if (leaves.length === 0) {
52
+ throw new Error(`${fnName}: empty leaf list (n == 0 is forbidden by RFC 9162 \xA72.1.1)`);
53
+ }
54
+ for (let i = 0; i < leaves.length; i++) {
55
+ const leaf = leaves[i];
56
+ if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) {
57
+ throw new Error(
58
+ `${fnName}: leaf[${i}] must be a Uint8Array(${DIGEST_LENGTH}); got length ${leaf instanceof Uint8Array ? leaf.length : "non-Uint8Array"}`
59
+ );
60
+ }
61
+ }
62
+ }
63
+ function merkleSha2256Root(leaves) {
64
+ validateLeaves(leaves, "merkleSha2256Root");
65
+ return mthRecursive(leaves, 0, leaves.length);
66
+ }
67
+ function merkleSha2256InclusionProof(leaves, index) {
68
+ validateLeaves(leaves, "merkleSha2256InclusionProof");
69
+ if (!Number.isInteger(index) || index < 0 || index >= leaves.length) {
70
+ throw new Error(
71
+ `merkleSha2256InclusionProof: index ${index} out of range [0, ${leaves.length})`
72
+ );
73
+ }
74
+ return auditPath(leaves, index, 0, leaves.length);
75
+ }
76
+ function merkleSha2256VerifyInclusion(leaf, index, treeSize, proof, root) {
77
+ if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) return false;
78
+ if (!(root instanceof Uint8Array) || root.length !== DIGEST_LENGTH) return false;
79
+ if (!Number.isInteger(index) || !Number.isInteger(treeSize) || treeSize < 1 || index < 0 || index >= treeSize) {
80
+ return false;
81
+ }
82
+ for (let i = 0; i < proof.length; i++) {
83
+ const sibling = proof[i];
84
+ if (!(sibling instanceof Uint8Array) || sibling.length !== DIGEST_LENGTH) {
85
+ return false;
86
+ }
87
+ }
88
+ if (treeSize === 1) {
89
+ if (proof.length !== 0 || index !== 0) return false;
90
+ return compareCt(hashLeaf(leaf), root);
91
+ }
92
+ let h = hashLeaf(leaf);
93
+ let sn = index;
94
+ let fn = treeSize - 1;
95
+ for (let i = 0; i < proof.length; i++) {
96
+ if (fn === 0) return false;
97
+ const sibling = proof[i];
98
+ if ((sn & 1) === 1 || sn === fn) {
99
+ h = hashNode(sibling, h);
100
+ while ((sn & 1) === 0 && sn !== 0) {
101
+ sn >>>= 1;
102
+ fn >>>= 1;
103
+ }
104
+ } else {
105
+ h = hashNode(h, sibling);
106
+ }
107
+ sn >>>= 1;
108
+ fn >>>= 1;
109
+ }
110
+ if (fn !== 0) return false;
111
+ return compareCt(h, root);
112
+ }
113
+ function largestPow2Lt(n) {
114
+ let k = 1;
115
+ while (k * 2 < n) k *= 2;
116
+ return k;
117
+ }
118
+ function hashLeaf(d) {
119
+ const buf = new Uint8Array(1 + d.length);
120
+ buf[0] = LEAF_PREFIX;
121
+ buf.set(d, 1);
122
+ return sha2_js.sha256(buf);
123
+ }
124
+ function hashNode(left, right) {
125
+ const buf = new Uint8Array(1 + left.length + right.length);
126
+ buf[0] = NODE_PREFIX;
127
+ buf.set(left, 1);
128
+ buf.set(right, 1 + left.length);
129
+ return sha2_js.sha256(buf);
130
+ }
131
+ function mthRecursive(leaves, start, end) {
132
+ const n = end - start;
133
+ if (n === 1) {
134
+ return hashLeaf(leaves[start]);
135
+ }
136
+ const k = largestPow2Lt(n);
137
+ const left = mthRecursive(leaves, start, start + k);
138
+ const right = mthRecursive(leaves, start + k, end);
139
+ return hashNode(left, right);
140
+ }
141
+ function auditPath(leaves, i, start, end) {
142
+ const n = end - start;
143
+ if (n === 1) return [];
144
+ const k = largestPow2Lt(n);
145
+ if (i < k) {
146
+ const subPath2 = auditPath(leaves, i, start, start + k);
147
+ subPath2.push(mthRecursive(leaves, start + k, end));
148
+ return subPath2;
149
+ }
150
+ const subPath = auditPath(leaves, i - k, start + k, end);
151
+ subPath.push(mthRecursive(leaves, start, start + k));
152
+ return subPath;
153
+ }
154
+
155
+ exports.MERKLE_ALG_ID = MERKLE_ALG_ID;
156
+ exports.blake2b224 = blake2b224;
157
+ exports.blake2b256 = blake2b256;
158
+ exports.dualHash = dualHash;
159
+ exports.dualHashStream = dualHashStream;
160
+ exports.merkleSha2256InclusionProof = merkleSha2256InclusionProof;
161
+ exports.merkleSha2256Root = merkleSha2256Root;
162
+ exports.merkleSha2256VerifyInclusion = merkleSha2256VerifyInclusion;
163
+ exports.sha256 = sha256;
164
+ //# sourceMappingURL=hash.cjs.map
165
+ //# sourceMappingURL=hash.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hash/sha-256.ts","../src/hash/blake2b-256.ts","../src/hash/dual-hash.ts","../src/util/compare-ct.ts","../src/hash/merkle-sha2-256.ts"],"names":["nobleSha256","blake2b","createSHA256","createBLAKE2b","sha256","subPath"],"mappings":";;;;;;;AAEO,SAAS,OAAO,KAAA,EAA+B;AACpD,EAAA,OAAOA,eAAY,KAAK,CAAA;AAC1B;ACFO,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,OAAOC,iBAAA,CAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,IAAI,CAAA;AACrC;AAOO,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,OAAOA,iBAAA,CAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,IAAI,CAAA;AACrC;ACHO,SAAS,SAAS,KAAA,EAAmC;AAC1D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,IACpB,UAAA,EAAY,WAAW,KAAK;AAAA,GAC9B;AACF;AAEA,eAAsB,eAAe,MAAA,EAA4D;AAC/F,EAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAACC,qBAAA,EAAa,EAAGC,sBAAA,CAAc,GAAG,CAAC,CAAC,CAAA;AAC3E,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,KAAA,CAAM,IAAA,EAAK;AACX,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,GAAA,CAAI,OAAO,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,EACpB;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC3B,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,QAAQ;AAAA,GACnC;AACF;;;ACxBO,SAAS,SAAA,CAAU,GAAe,CAAA,EAAwB;AAC/D,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA;AAIX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,IAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAgB,CAAA,CAAE,CAAC,CAAA;AAClE,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;;;ACGO,IAAM,aAAA,GAAgB;AAE7B,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,aAAA,GAAgB,EAAA;AAEtB,SAAS,cAAA,CAAe,QAAmC,MAAA,EAAsB;AAC/E,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,6DAAA,CAA4D,CAAA;AAAA,EACvF;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,EAAE,IAAA,YAAgB,UAAA,CAAA,IAAe,IAAA,CAAK,WAAW,aAAA,EAAe;AAClE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,CAAC,CAAA,uBAAA,EAA0B,aAAa,CAAA,cAAA,EACzD,IAAA,YAAgB,UAAA,GAAa,IAAA,CAAK,MAAA,GAAS,gBAC7C,CAAA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,MAAA,EAA+C;AAC/E,EAAA,cAAA,CAAe,QAAQ,mBAAmB,CAAA;AAC1C,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA;AAC9C;AAEO,SAAS,2BAAA,CACd,QACA,KAAA,EACc;AACd,EAAA,cAAA,CAAe,QAAQ,6BAA6B,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,SAAA,CAAU,KAAK,KAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,IAAS,MAAA,CAAO,MAAA,EAAQ;AACnE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mCAAA,EAAsC,KAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,KAC/E;AAAA,EACF;AACA,EAAA,OAAO,SAAA,CAAU,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAG,OAAO,MAAM,CAAA;AAClD;AAcO,SAAS,4BAAA,CACd,IAAA,EACA,KAAA,EACA,QAAA,EACA,OACA,IAAA,EACS;AACT,EAAA,IAAI,EAAE,IAAA,YAAgB,UAAA,CAAA,IAAe,IAAA,CAAK,MAAA,KAAW,eAAe,OAAO,KAAA;AAC3E,EAAA,IAAI,EAAE,IAAA,YAAgB,UAAA,CAAA,IAAe,IAAA,CAAK,MAAA,KAAW,eAAe,OAAO,KAAA;AAC3E,EAAA,IACE,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,KACvB,CAAC,MAAA,CAAO,SAAA,CAAU,QAAQ,KAC1B,QAAA,GAAW,CAAA,IACX,KAAA,GAAQ,CAAA,IACR,SAAS,QAAA,EACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,IAAA,IAAI,EAAE,OAAA,YAAmB,UAAA,CAAA,IAAe,OAAA,CAAQ,WAAW,aAAA,EAAe;AACxE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,KAAU,GAAG,OAAO,KAAA;AAC9C,IAAA,OAAO,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,CAAA,GAAI,SAAS,IAAI,CAAA;AACrB,EAAA,IAAI,EAAA,GAAK,KAAA;AACT,EAAA,IAAI,KAAK,QAAA,GAAW,CAAA;AACpB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAI,EAAA,KAAO,GAAG,OAAO,KAAA;AACrB,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAO,CAAA,IAAK,EAAA,KAAO,EAAA,EAAI;AAC/B,MAAA,CAAA,GAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AACvB,MAAA,OAAA,CAAQ,EAAA,GAAK,CAAA,MAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG;AACjC,QAAA,EAAA,MAAQ,CAAA;AACR,QAAA,EAAA,MAAQ,CAAA;AAAA,MACV;AAAA,IACF,CAAA,MAAO;AACL,MAAA,CAAA,GAAI,QAAA,CAAS,GAAG,OAAO,CAAA;AAAA,IACzB;AACA,IAAA,EAAA,MAAQ,CAAA;AACR,IAAA,EAAA,MAAQ,CAAA;AAAA,EACV;AACA,EAAA,IAAI,EAAA,KAAO,GAAG,OAAO,KAAA;AACrB,EAAA,OAAO,SAAA,CAAU,GAAG,IAAI,CAAA;AAC1B;AAEA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA;AACvB,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,SAAS,CAAA,EAA2B;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,CAAA,GAAI,EAAE,MAAM,CAAA;AACvC,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,WAAA;AACT,EAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AACZ,EAAA,OAAOC,eAAO,GAAG,CAAA;AACnB;AAEA,SAAS,QAAA,CAAS,MAAkB,KAAA,EAA+B;AACjE,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,IAAI,IAAA,CAAK,MAAA,GAAS,MAAM,MAAM,CAAA;AACzD,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,WAAA;AACT,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACf,EAAA,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA;AAC9B,EAAA,OAAOA,eAAO,GAAG,CAAA;AACnB;AAEA,SAAS,YAAA,CAAa,MAAA,EAAmC,KAAA,EAAe,GAAA,EAAyB;AAC/F,EAAA,MAAM,IAAI,GAAA,GAAM,KAAA;AAChB,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,QAAA,CAAS,MAAA,CAAO,KAAK,CAAe,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,CAAA,GAAI,cAAc,CAAC,CAAA;AACzB,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,EAAQ,KAAA,GAAQ,GAAG,GAAG,CAAA;AACjD,EAAA,OAAO,QAAA,CAAS,MAAM,KAAK,CAAA;AAC7B;AAEA,SAAS,SAAA,CACP,MAAA,EACA,CAAA,EACA,KAAA,EACA,GAAA,EACc;AACd,EAAA,MAAM,IAAI,GAAA,GAAM,KAAA;AAChB,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAC;AACrB,EAAA,MAAM,CAAA,GAAI,cAAc,CAAC,CAAA;AACzB,EAAA,IAAI,IAAI,CAAA,EAAG;AACT,IAAA,MAAMC,WAAU,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAC,CAAA;AACrD,IAAAA,SAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,KAAA,GAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AACjD,IAAA,OAAOA,QAAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,MAAA,EAAQ,IAAI,CAAA,EAAG,KAAA,GAAQ,GAAG,GAAG,CAAA;AACvD,EAAA,OAAA,CAAQ,KAAK,YAAA,CAAa,MAAA,EAAQ,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AACnD,EAAA,OAAO,OAAA;AACT","file":"hash.cjs","sourcesContent":["import { sha256 as nobleSha256 } from '@noble/hashes/sha2.js';\n\nexport function sha256(input: Uint8Array): Uint8Array {\n return nobleSha256(input);\n}\n","import { blake2b } from '@noble/hashes/blake2.js';\n\nexport function blake2b256(input: Uint8Array): Uint8Array {\n return blake2b(input, { dkLen: 32 });\n}\n\n// CIP-19 stake-address derivation, used for the wallet path-2 signer binding,\n// requires the 28-byte BLAKE2b digest of the signer's Ed25519 public key.\n// The Cardano ledger encodes stake addresses as\n// `network_header_byte || Blake2b-224(stake_vk)`\n// per CIP-19, so this output length is fixed by spec.\nexport function blake2b224(input: Uint8Array): Uint8Array {\n return blake2b(input, { dkLen: 28 });\n}\n","import { createSHA256, createBLAKE2b } from 'hash-wasm';\n\nimport { sha256 } from './sha-256';\nimport { blake2b256 } from './blake2b-256';\n\nexport interface DualHashOutput {\n sha256: Uint8Array;\n blake2b256: Uint8Array;\n}\n\nexport function dualHash(input: Uint8Array): DualHashOutput {\n return {\n sha256: sha256(input),\n blake2b256: blake2b256(input),\n };\n}\n\nexport async function dualHashStream(source: AsyncIterable<Uint8Array>): Promise<DualHashOutput> {\n const [sha, blake] = await Promise.all([createSHA256(), createBLAKE2b(256)]);\n sha.init();\n blake.init();\n for await (const chunk of source) {\n sha.update(chunk);\n blake.update(chunk);\n }\n return {\n sha256: sha.digest('binary') as Uint8Array,\n blake2b256: blake.digest('binary') as Uint8Array,\n };\n}\n","// Isomorphic constant-time byte-equality. crypto-core is browser-safe by\n// design, so we cannot import `node:crypto.timingSafeEqual` — webpack rejects\n// the `node:` scheme in the browser bundle. A pure-JS XOR loop is constant-time\n// for equal-length inputs; length mismatch is a deliberate early-return (the\n// API surface itself leaks length, same as node's timingSafeEqual which throws).\nexport function compareCt(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n // Lengths are equal and `i` stays in-bounds, so both indexes are always\n // defined — no nullish guard is needed (and one would read as a guard for\n // an impossible case).\n for (let i = 0; i < a.length; i++) diff |= (a[i] as number) ^ (b[i] as number);\n return diff === 0;\n}\n","// RFC 9162 §2.1.1 binary Merkle tree under SHA-256.\n// This implements the algorithm tier identified on the wire as the\n// `rfc9162-sha256` OPT-INFO; the record's `merkle[]` field carries the proof.\n//\n// Construction (RFC 9162 §2.1.1):\n// - Single leaf: MTH({d_0}) = SHA-256(0x00 || d_0)\n// - Internal node: MTH(L) = SHA-256(0x01 || MTH(L[0:k]) || MTH(L[k:n]))\n// where k = largest power of 2 strictly less than n.\n// - Empty trees (n == 0) are FORBIDDEN.\n// - The 0x00 leaf / 0x01 internal prefixes prevent the CVE-2012-2459\n// leaf-vs-internal collision family.\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { compareCt } from '../util/compare-ct';\n\nexport const MERKLE_ALG_ID = 'rfc9162-sha256' as const;\n\nconst LEAF_PREFIX = 0x00;\nconst NODE_PREFIX = 0x01;\nconst DIGEST_LENGTH = 32;\n\nfunction validateLeaves(leaves: ReadonlyArray<Uint8Array>, fnName: string): void {\n if (leaves.length === 0) {\n throw new Error(`${fnName}: empty leaf list (n == 0 is forbidden by RFC 9162 §2.1.1)`);\n }\n for (let i = 0; i < leaves.length; i++) {\n const leaf = leaves[i];\n if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) {\n throw new Error(\n `${fnName}: leaf[${i}] must be a Uint8Array(${DIGEST_LENGTH}); got length ${\n leaf instanceof Uint8Array ? leaf.length : 'non-Uint8Array'\n }`,\n );\n }\n }\n}\n\nexport function merkleSha2256Root(leaves: ReadonlyArray<Uint8Array>): Uint8Array {\n validateLeaves(leaves, 'merkleSha2256Root');\n return mthRecursive(leaves, 0, leaves.length);\n}\n\nexport function merkleSha2256InclusionProof(\n leaves: ReadonlyArray<Uint8Array>,\n index: number,\n): Uint8Array[] {\n validateLeaves(leaves, 'merkleSha2256InclusionProof');\n if (!Number.isInteger(index) || index < 0 || index >= leaves.length) {\n throw new Error(\n `merkleSha2256InclusionProof: index ${index} out of range [0, ${leaves.length})`,\n );\n }\n return auditPath(leaves, index, 0, leaves.length);\n}\n\n/**\n * Verify an inclusion proof per RFC 9162 §2.1.3.2 (iterative form).\n *\n * `proof` is ordered leaf-to-root: `proof[0]` is the sibling at the leaf\n * level, `proof[m-1]` is the top-level sibling. The fold uses the\n * `sn`/`fn` tracking from RFC 9162: `sn` is the leaf index within the\n * current subtree, `fn` is (subtree_size - 1). At each step, `sn` odd\n * OR `sn == fn` means the current node is a right child (sibling on\n * the left); otherwise it is a left child (sibling on the right).\n * Both shift right by one each iteration. This handles non-power-of-2\n * sizes including the \"promote a lone right subtree\" cases.\n */\nexport function merkleSha2256VerifyInclusion(\n leaf: Uint8Array,\n index: number,\n treeSize: number,\n proof: ReadonlyArray<Uint8Array>,\n root: Uint8Array,\n): boolean {\n if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) return false;\n if (!(root instanceof Uint8Array) || root.length !== DIGEST_LENGTH) return false;\n if (\n !Number.isInteger(index) ||\n !Number.isInteger(treeSize) ||\n treeSize < 1 ||\n index < 0 ||\n index >= treeSize\n ) {\n return false;\n }\n for (let i = 0; i < proof.length; i++) {\n const sibling = proof[i];\n if (!(sibling instanceof Uint8Array) || sibling.length !== DIGEST_LENGTH) {\n return false;\n }\n }\n\n if (treeSize === 1) {\n if (proof.length !== 0 || index !== 0) return false;\n return compareCt(hashLeaf(leaf), root);\n }\n\n let h = hashLeaf(leaf);\n let sn = index;\n let fn = treeSize - 1;\n for (let i = 0; i < proof.length; i++) {\n if (fn === 0) return false;\n const sibling = proof[i] as Uint8Array;\n if ((sn & 1) === 1 || sn === fn) {\n h = hashNode(sibling, h);\n while ((sn & 1) === 0 && sn !== 0) {\n sn >>>= 1;\n fn >>>= 1;\n }\n } else {\n h = hashNode(h, sibling);\n }\n sn >>>= 1;\n fn >>>= 1;\n }\n if (fn !== 0) return false;\n return compareCt(h, root);\n}\n\nfunction largestPow2Lt(n: number): number {\n let k = 1;\n while (k * 2 < n) k *= 2;\n return k;\n}\n\nfunction hashLeaf(d: Uint8Array): Uint8Array {\n const buf = new Uint8Array(1 + d.length);\n buf[0] = LEAF_PREFIX;\n buf.set(d, 1);\n return sha256(buf);\n}\n\nfunction hashNode(left: Uint8Array, right: Uint8Array): Uint8Array {\n const buf = new Uint8Array(1 + left.length + right.length);\n buf[0] = NODE_PREFIX;\n buf.set(left, 1);\n buf.set(right, 1 + left.length);\n return sha256(buf);\n}\n\nfunction mthRecursive(leaves: ReadonlyArray<Uint8Array>, start: number, end: number): Uint8Array {\n const n = end - start;\n if (n === 1) {\n return hashLeaf(leaves[start] as Uint8Array);\n }\n const k = largestPow2Lt(n);\n const left = mthRecursive(leaves, start, start + k);\n const right = mthRecursive(leaves, start + k, end);\n return hashNode(left, right);\n}\n\nfunction auditPath(\n leaves: ReadonlyArray<Uint8Array>,\n i: number,\n start: number,\n end: number,\n): Uint8Array[] {\n const n = end - start;\n if (n === 1) return [];\n const k = largestPow2Lt(n);\n if (i < k) {\n const subPath = auditPath(leaves, i, start, start + k);\n subPath.push(mthRecursive(leaves, start + k, end));\n return subPath;\n }\n const subPath = auditPath(leaves, i - k, start + k, end);\n subPath.push(mthRecursive(leaves, start, start + k));\n return subPath;\n}\n"]}
@@ -0,0 +1,30 @@
1
+ declare function sha256(input: Uint8Array): Uint8Array;
2
+
3
+ declare function blake2b256(input: Uint8Array): Uint8Array;
4
+ declare function blake2b224(input: Uint8Array): Uint8Array;
5
+
6
+ interface DualHashOutput {
7
+ sha256: Uint8Array;
8
+ blake2b256: Uint8Array;
9
+ }
10
+ declare function dualHash(input: Uint8Array): DualHashOutput;
11
+ declare function dualHashStream(source: AsyncIterable<Uint8Array>): Promise<DualHashOutput>;
12
+
13
+ declare const MERKLE_ALG_ID: "rfc9162-sha256";
14
+ declare function merkleSha2256Root(leaves: ReadonlyArray<Uint8Array>): Uint8Array;
15
+ declare function merkleSha2256InclusionProof(leaves: ReadonlyArray<Uint8Array>, index: number): Uint8Array[];
16
+ /**
17
+ * Verify an inclusion proof per RFC 9162 §2.1.3.2 (iterative form).
18
+ *
19
+ * `proof` is ordered leaf-to-root: `proof[0]` is the sibling at the leaf
20
+ * level, `proof[m-1]` is the top-level sibling. The fold uses the
21
+ * `sn`/`fn` tracking from RFC 9162: `sn` is the leaf index within the
22
+ * current subtree, `fn` is (subtree_size - 1). At each step, `sn` odd
23
+ * OR `sn == fn` means the current node is a right child (sibling on
24
+ * the left); otherwise it is a left child (sibling on the right).
25
+ * Both shift right by one each iteration. This handles non-power-of-2
26
+ * sizes including the "promote a lone right subtree" cases.
27
+ */
28
+ declare function merkleSha2256VerifyInclusion(leaf: Uint8Array, index: number, treeSize: number, proof: ReadonlyArray<Uint8Array>, root: Uint8Array): boolean;
29
+
30
+ export { type DualHashOutput, MERKLE_ALG_ID, blake2b224, blake2b256, dualHash, dualHashStream, merkleSha2256InclusionProof, merkleSha2256Root, merkleSha2256VerifyInclusion, sha256 };
package/dist/hash.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ declare function sha256(input: Uint8Array): Uint8Array;
2
+
3
+ declare function blake2b256(input: Uint8Array): Uint8Array;
4
+ declare function blake2b224(input: Uint8Array): Uint8Array;
5
+
6
+ interface DualHashOutput {
7
+ sha256: Uint8Array;
8
+ blake2b256: Uint8Array;
9
+ }
10
+ declare function dualHash(input: Uint8Array): DualHashOutput;
11
+ declare function dualHashStream(source: AsyncIterable<Uint8Array>): Promise<DualHashOutput>;
12
+
13
+ declare const MERKLE_ALG_ID: "rfc9162-sha256";
14
+ declare function merkleSha2256Root(leaves: ReadonlyArray<Uint8Array>): Uint8Array;
15
+ declare function merkleSha2256InclusionProof(leaves: ReadonlyArray<Uint8Array>, index: number): Uint8Array[];
16
+ /**
17
+ * Verify an inclusion proof per RFC 9162 §2.1.3.2 (iterative form).
18
+ *
19
+ * `proof` is ordered leaf-to-root: `proof[0]` is the sibling at the leaf
20
+ * level, `proof[m-1]` is the top-level sibling. The fold uses the
21
+ * `sn`/`fn` tracking from RFC 9162: `sn` is the leaf index within the
22
+ * current subtree, `fn` is (subtree_size - 1). At each step, `sn` odd
23
+ * OR `sn == fn` means the current node is a right child (sibling on
24
+ * the left); otherwise it is a left child (sibling on the right).
25
+ * Both shift right by one each iteration. This handles non-power-of-2
26
+ * sizes including the "promote a lone right subtree" cases.
27
+ */
28
+ declare function merkleSha2256VerifyInclusion(leaf: Uint8Array, index: number, treeSize: number, proof: ReadonlyArray<Uint8Array>, root: Uint8Array): boolean;
29
+
30
+ export { type DualHashOutput, MERKLE_ALG_ID, blake2b224, blake2b256, dualHash, dualHashStream, merkleSha2256InclusionProof, merkleSha2256Root, merkleSha2256VerifyInclusion, sha256 };
package/dist/hash.js ADDED
@@ -0,0 +1,155 @@
1
+ import { sha256 as sha256$1 } from '@noble/hashes/sha2.js';
2
+ import { blake2b } from '@noble/hashes/blake2.js';
3
+ import { createSHA256, createBLAKE2b } from 'hash-wasm';
4
+
5
+ // src/hash/sha-256.ts
6
+ function sha256(input) {
7
+ return sha256$1(input);
8
+ }
9
+ function blake2b256(input) {
10
+ return blake2b(input, { dkLen: 32 });
11
+ }
12
+ function blake2b224(input) {
13
+ return blake2b(input, { dkLen: 28 });
14
+ }
15
+ function dualHash(input) {
16
+ return {
17
+ sha256: sha256(input),
18
+ blake2b256: blake2b256(input)
19
+ };
20
+ }
21
+ async function dualHashStream(source) {
22
+ const [sha, blake] = await Promise.all([createSHA256(), createBLAKE2b(256)]);
23
+ sha.init();
24
+ blake.init();
25
+ for await (const chunk of source) {
26
+ sha.update(chunk);
27
+ blake.update(chunk);
28
+ }
29
+ return {
30
+ sha256: sha.digest("binary"),
31
+ blake2b256: blake.digest("binary")
32
+ };
33
+ }
34
+
35
+ // src/util/compare-ct.ts
36
+ function compareCt(a, b) {
37
+ if (a.length !== b.length) return false;
38
+ let diff = 0;
39
+ for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];
40
+ return diff === 0;
41
+ }
42
+
43
+ // src/hash/merkle-sha2-256.ts
44
+ var MERKLE_ALG_ID = "rfc9162-sha256";
45
+ var LEAF_PREFIX = 0;
46
+ var NODE_PREFIX = 1;
47
+ var DIGEST_LENGTH = 32;
48
+ function validateLeaves(leaves, fnName) {
49
+ if (leaves.length === 0) {
50
+ throw new Error(`${fnName}: empty leaf list (n == 0 is forbidden by RFC 9162 \xA72.1.1)`);
51
+ }
52
+ for (let i = 0; i < leaves.length; i++) {
53
+ const leaf = leaves[i];
54
+ if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) {
55
+ throw new Error(
56
+ `${fnName}: leaf[${i}] must be a Uint8Array(${DIGEST_LENGTH}); got length ${leaf instanceof Uint8Array ? leaf.length : "non-Uint8Array"}`
57
+ );
58
+ }
59
+ }
60
+ }
61
+ function merkleSha2256Root(leaves) {
62
+ validateLeaves(leaves, "merkleSha2256Root");
63
+ return mthRecursive(leaves, 0, leaves.length);
64
+ }
65
+ function merkleSha2256InclusionProof(leaves, index) {
66
+ validateLeaves(leaves, "merkleSha2256InclusionProof");
67
+ if (!Number.isInteger(index) || index < 0 || index >= leaves.length) {
68
+ throw new Error(
69
+ `merkleSha2256InclusionProof: index ${index} out of range [0, ${leaves.length})`
70
+ );
71
+ }
72
+ return auditPath(leaves, index, 0, leaves.length);
73
+ }
74
+ function merkleSha2256VerifyInclusion(leaf, index, treeSize, proof, root) {
75
+ if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) return false;
76
+ if (!(root instanceof Uint8Array) || root.length !== DIGEST_LENGTH) return false;
77
+ if (!Number.isInteger(index) || !Number.isInteger(treeSize) || treeSize < 1 || index < 0 || index >= treeSize) {
78
+ return false;
79
+ }
80
+ for (let i = 0; i < proof.length; i++) {
81
+ const sibling = proof[i];
82
+ if (!(sibling instanceof Uint8Array) || sibling.length !== DIGEST_LENGTH) {
83
+ return false;
84
+ }
85
+ }
86
+ if (treeSize === 1) {
87
+ if (proof.length !== 0 || index !== 0) return false;
88
+ return compareCt(hashLeaf(leaf), root);
89
+ }
90
+ let h = hashLeaf(leaf);
91
+ let sn = index;
92
+ let fn = treeSize - 1;
93
+ for (let i = 0; i < proof.length; i++) {
94
+ if (fn === 0) return false;
95
+ const sibling = proof[i];
96
+ if ((sn & 1) === 1 || sn === fn) {
97
+ h = hashNode(sibling, h);
98
+ while ((sn & 1) === 0 && sn !== 0) {
99
+ sn >>>= 1;
100
+ fn >>>= 1;
101
+ }
102
+ } else {
103
+ h = hashNode(h, sibling);
104
+ }
105
+ sn >>>= 1;
106
+ fn >>>= 1;
107
+ }
108
+ if (fn !== 0) return false;
109
+ return compareCt(h, root);
110
+ }
111
+ function largestPow2Lt(n) {
112
+ let k = 1;
113
+ while (k * 2 < n) k *= 2;
114
+ return k;
115
+ }
116
+ function hashLeaf(d) {
117
+ const buf = new Uint8Array(1 + d.length);
118
+ buf[0] = LEAF_PREFIX;
119
+ buf.set(d, 1);
120
+ return sha256$1(buf);
121
+ }
122
+ function hashNode(left, right) {
123
+ const buf = new Uint8Array(1 + left.length + right.length);
124
+ buf[0] = NODE_PREFIX;
125
+ buf.set(left, 1);
126
+ buf.set(right, 1 + left.length);
127
+ return sha256$1(buf);
128
+ }
129
+ function mthRecursive(leaves, start, end) {
130
+ const n = end - start;
131
+ if (n === 1) {
132
+ return hashLeaf(leaves[start]);
133
+ }
134
+ const k = largestPow2Lt(n);
135
+ const left = mthRecursive(leaves, start, start + k);
136
+ const right = mthRecursive(leaves, start + k, end);
137
+ return hashNode(left, right);
138
+ }
139
+ function auditPath(leaves, i, start, end) {
140
+ const n = end - start;
141
+ if (n === 1) return [];
142
+ const k = largestPow2Lt(n);
143
+ if (i < k) {
144
+ const subPath2 = auditPath(leaves, i, start, start + k);
145
+ subPath2.push(mthRecursive(leaves, start + k, end));
146
+ return subPath2;
147
+ }
148
+ const subPath = auditPath(leaves, i - k, start + k, end);
149
+ subPath.push(mthRecursive(leaves, start, start + k));
150
+ return subPath;
151
+ }
152
+
153
+ export { MERKLE_ALG_ID, blake2b224, blake2b256, dualHash, dualHashStream, merkleSha2256InclusionProof, merkleSha2256Root, merkleSha2256VerifyInclusion, sha256 };
154
+ //# sourceMappingURL=hash.js.map
155
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hash/sha-256.ts","../src/hash/blake2b-256.ts","../src/hash/dual-hash.ts","../src/util/compare-ct.ts","../src/hash/merkle-sha2-256.ts"],"names":["nobleSha256","sha256","subPath"],"mappings":"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","file":"hash.js","sourcesContent":["import { sha256 as nobleSha256 } from '@noble/hashes/sha2.js';\n\nexport function sha256(input: Uint8Array): Uint8Array {\n return nobleSha256(input);\n}\n","import { blake2b } from '@noble/hashes/blake2.js';\n\nexport function blake2b256(input: Uint8Array): Uint8Array {\n return blake2b(input, { dkLen: 32 });\n}\n\n// CIP-19 stake-address derivation, used for the wallet path-2 signer binding,\n// requires the 28-byte BLAKE2b digest of the signer's Ed25519 public key.\n// The Cardano ledger encodes stake addresses as\n// `network_header_byte || Blake2b-224(stake_vk)`\n// per CIP-19, so this output length is fixed by spec.\nexport function blake2b224(input: Uint8Array): Uint8Array {\n return blake2b(input, { dkLen: 28 });\n}\n","import { createSHA256, createBLAKE2b } from 'hash-wasm';\n\nimport { sha256 } from './sha-256';\nimport { blake2b256 } from './blake2b-256';\n\nexport interface DualHashOutput {\n sha256: Uint8Array;\n blake2b256: Uint8Array;\n}\n\nexport function dualHash(input: Uint8Array): DualHashOutput {\n return {\n sha256: sha256(input),\n blake2b256: blake2b256(input),\n };\n}\n\nexport async function dualHashStream(source: AsyncIterable<Uint8Array>): Promise<DualHashOutput> {\n const [sha, blake] = await Promise.all([createSHA256(), createBLAKE2b(256)]);\n sha.init();\n blake.init();\n for await (const chunk of source) {\n sha.update(chunk);\n blake.update(chunk);\n }\n return {\n sha256: sha.digest('binary') as Uint8Array,\n blake2b256: blake.digest('binary') as Uint8Array,\n };\n}\n","// Isomorphic constant-time byte-equality. crypto-core is browser-safe by\n// design, so we cannot import `node:crypto.timingSafeEqual` — webpack rejects\n// the `node:` scheme in the browser bundle. A pure-JS XOR loop is constant-time\n// for equal-length inputs; length mismatch is a deliberate early-return (the\n// API surface itself leaks length, same as node's timingSafeEqual which throws).\nexport function compareCt(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n // Lengths are equal and `i` stays in-bounds, so both indexes are always\n // defined — no nullish guard is needed (and one would read as a guard for\n // an impossible case).\n for (let i = 0; i < a.length; i++) diff |= (a[i] as number) ^ (b[i] as number);\n return diff === 0;\n}\n","// RFC 9162 §2.1.1 binary Merkle tree under SHA-256.\n// This implements the algorithm tier identified on the wire as the\n// `rfc9162-sha256` OPT-INFO; the record's `merkle[]` field carries the proof.\n//\n// Construction (RFC 9162 §2.1.1):\n// - Single leaf: MTH({d_0}) = SHA-256(0x00 || d_0)\n// - Internal node: MTH(L) = SHA-256(0x01 || MTH(L[0:k]) || MTH(L[k:n]))\n// where k = largest power of 2 strictly less than n.\n// - Empty trees (n == 0) are FORBIDDEN.\n// - The 0x00 leaf / 0x01 internal prefixes prevent the CVE-2012-2459\n// leaf-vs-internal collision family.\n\nimport { sha256 } from '@noble/hashes/sha2.js';\n\nimport { compareCt } from '../util/compare-ct';\n\nexport const MERKLE_ALG_ID = 'rfc9162-sha256' as const;\n\nconst LEAF_PREFIX = 0x00;\nconst NODE_PREFIX = 0x01;\nconst DIGEST_LENGTH = 32;\n\nfunction validateLeaves(leaves: ReadonlyArray<Uint8Array>, fnName: string): void {\n if (leaves.length === 0) {\n throw new Error(`${fnName}: empty leaf list (n == 0 is forbidden by RFC 9162 §2.1.1)`);\n }\n for (let i = 0; i < leaves.length; i++) {\n const leaf = leaves[i];\n if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) {\n throw new Error(\n `${fnName}: leaf[${i}] must be a Uint8Array(${DIGEST_LENGTH}); got length ${\n leaf instanceof Uint8Array ? leaf.length : 'non-Uint8Array'\n }`,\n );\n }\n }\n}\n\nexport function merkleSha2256Root(leaves: ReadonlyArray<Uint8Array>): Uint8Array {\n validateLeaves(leaves, 'merkleSha2256Root');\n return mthRecursive(leaves, 0, leaves.length);\n}\n\nexport function merkleSha2256InclusionProof(\n leaves: ReadonlyArray<Uint8Array>,\n index: number,\n): Uint8Array[] {\n validateLeaves(leaves, 'merkleSha2256InclusionProof');\n if (!Number.isInteger(index) || index < 0 || index >= leaves.length) {\n throw new Error(\n `merkleSha2256InclusionProof: index ${index} out of range [0, ${leaves.length})`,\n );\n }\n return auditPath(leaves, index, 0, leaves.length);\n}\n\n/**\n * Verify an inclusion proof per RFC 9162 §2.1.3.2 (iterative form).\n *\n * `proof` is ordered leaf-to-root: `proof[0]` is the sibling at the leaf\n * level, `proof[m-1]` is the top-level sibling. The fold uses the\n * `sn`/`fn` tracking from RFC 9162: `sn` is the leaf index within the\n * current subtree, `fn` is (subtree_size - 1). At each step, `sn` odd\n * OR `sn == fn` means the current node is a right child (sibling on\n * the left); otherwise it is a left child (sibling on the right).\n * Both shift right by one each iteration. This handles non-power-of-2\n * sizes including the \"promote a lone right subtree\" cases.\n */\nexport function merkleSha2256VerifyInclusion(\n leaf: Uint8Array,\n index: number,\n treeSize: number,\n proof: ReadonlyArray<Uint8Array>,\n root: Uint8Array,\n): boolean {\n if (!(leaf instanceof Uint8Array) || leaf.length !== DIGEST_LENGTH) return false;\n if (!(root instanceof Uint8Array) || root.length !== DIGEST_LENGTH) return false;\n if (\n !Number.isInteger(index) ||\n !Number.isInteger(treeSize) ||\n treeSize < 1 ||\n index < 0 ||\n index >= treeSize\n ) {\n return false;\n }\n for (let i = 0; i < proof.length; i++) {\n const sibling = proof[i];\n if (!(sibling instanceof Uint8Array) || sibling.length !== DIGEST_LENGTH) {\n return false;\n }\n }\n\n if (treeSize === 1) {\n if (proof.length !== 0 || index !== 0) return false;\n return compareCt(hashLeaf(leaf), root);\n }\n\n let h = hashLeaf(leaf);\n let sn = index;\n let fn = treeSize - 1;\n for (let i = 0; i < proof.length; i++) {\n if (fn === 0) return false;\n const sibling = proof[i] as Uint8Array;\n if ((sn & 1) === 1 || sn === fn) {\n h = hashNode(sibling, h);\n while ((sn & 1) === 0 && sn !== 0) {\n sn >>>= 1;\n fn >>>= 1;\n }\n } else {\n h = hashNode(h, sibling);\n }\n sn >>>= 1;\n fn >>>= 1;\n }\n if (fn !== 0) return false;\n return compareCt(h, root);\n}\n\nfunction largestPow2Lt(n: number): number {\n let k = 1;\n while (k * 2 < n) k *= 2;\n return k;\n}\n\nfunction hashLeaf(d: Uint8Array): Uint8Array {\n const buf = new Uint8Array(1 + d.length);\n buf[0] = LEAF_PREFIX;\n buf.set(d, 1);\n return sha256(buf);\n}\n\nfunction hashNode(left: Uint8Array, right: Uint8Array): Uint8Array {\n const buf = new Uint8Array(1 + left.length + right.length);\n buf[0] = NODE_PREFIX;\n buf.set(left, 1);\n buf.set(right, 1 + left.length);\n return sha256(buf);\n}\n\nfunction mthRecursive(leaves: ReadonlyArray<Uint8Array>, start: number, end: number): Uint8Array {\n const n = end - start;\n if (n === 1) {\n return hashLeaf(leaves[start] as Uint8Array);\n }\n const k = largestPow2Lt(n);\n const left = mthRecursive(leaves, start, start + k);\n const right = mthRecursive(leaves, start + k, end);\n return hashNode(left, right);\n}\n\nfunction auditPath(\n leaves: ReadonlyArray<Uint8Array>,\n i: number,\n start: number,\n end: number,\n): Uint8Array[] {\n const n = end - start;\n if (n === 1) return [];\n const k = largestPow2Lt(n);\n if (i < k) {\n const subPath = auditPath(leaves, i, start, start + k);\n subPath.push(mthRecursive(leaves, start + k, end));\n return subPath;\n }\n const subPath = auditPath(leaves, i - k, start + k, end);\n subPath.push(mthRecursive(leaves, start, start + k));\n return subPath;\n}\n"]}