ethereum-cryptographyy 2.1.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ethereum-cryptographyy might be problematic. Click here for more details.

Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +508 -0
  3. package/aes.d.ts +2 -0
  4. package/aes.js +98 -0
  5. package/bip39/index.d.ts +1 -0
  6. package/bip39/index.js +10 -0
  7. package/bip39/wordlists/czech.d.ts +1 -0
  8. package/bip39/wordlists/czech.js +5 -0
  9. package/bip39/wordlists/english.d.ts +1 -0
  10. package/bip39/wordlists/english.js +5 -0
  11. package/bip39/wordlists/french.d.ts +1 -0
  12. package/bip39/wordlists/french.js +5 -0
  13. package/bip39/wordlists/italian.d.ts +1 -0
  14. package/bip39/wordlists/italian.js +5 -0
  15. package/bip39/wordlists/japanese.d.ts +1 -0
  16. package/bip39/wordlists/japanese.js +5 -0
  17. package/bip39/wordlists/korean.d.ts +1 -0
  18. package/bip39/wordlists/korean.js +5 -0
  19. package/bip39/wordlists/simplified-chinese.d.ts +1 -0
  20. package/bip39/wordlists/simplified-chinese.js +5 -0
  21. package/bip39/wordlists/spanish.d.ts +1 -0
  22. package/bip39/wordlists/spanish.js +5 -0
  23. package/bip39/wordlists/traditional-chinese.d.ts +1 -0
  24. package/bip39/wordlists/traditional-chinese.js +5 -0
  25. package/blake2b.d.ts +1 -0
  26. package/blake2b.js +13 -0
  27. package/esm/aes.js +93 -0
  28. package/esm/bip39/index.js +1 -0
  29. package/esm/bip39/wordlists/czech.js +1 -0
  30. package/esm/bip39/wordlists/english.js +1 -0
  31. package/esm/bip39/wordlists/french.js +1 -0
  32. package/esm/bip39/wordlists/italian.js +1 -0
  33. package/esm/bip39/wordlists/japanese.js +1 -0
  34. package/esm/bip39/wordlists/korean.js +1 -0
  35. package/esm/bip39/wordlists/simplified-chinese.js +1 -0
  36. package/esm/bip39/wordlists/spanish.js +1 -0
  37. package/esm/bip39/wordlists/traditional-chinese.js +1 -0
  38. package/esm/blake2b.js +9 -0
  39. package/esm/hdkey.js +1 -0
  40. package/esm/index.js +2 -0
  41. package/esm/keccak.js +10 -0
  42. package/esm/package.json +3 -0
  43. package/esm/pbkdf2.js +26 -0
  44. package/esm/random.js +7 -0
  45. package/esm/ripemd160.js +3 -0
  46. package/esm/scrypt.js +12 -0
  47. package/esm/secp256k1-compat.js +254 -0
  48. package/esm/secp256k1.js +1 -0
  49. package/esm/sha256.js +3 -0
  50. package/esm/sha512.js +3 -0
  51. package/esm/utils.js +47 -0
  52. package/hdkey.d.ts +1 -0
  53. package/hdkey.js +6 -0
  54. package/index.d.ts +0 -0
  55. package/index.js +2 -0
  56. package/keccak.d.ts +11 -0
  57. package/keccak.js +13 -0
  58. package/package.json +365 -0
  59. package/pbkdf2.d.ts +2 -0
  60. package/pbkdf2.js +31 -0
  61. package/random.d.ts +2 -0
  62. package/random.js +12 -0
  63. package/ripemd160.d.ts +1 -0
  64. package/ripemd160.js +6 -0
  65. package/scrypt.d.ts +4 -0
  66. package/scrypt.js +17 -0
  67. package/secp256k1-compat.d.ts +35 -0
  68. package/secp256k1-compat.js +278 -0
  69. package/secp256k1.d.ts +1 -0
  70. package/secp256k1.js +5 -0
  71. package/sha256.d.ts +1 -0
  72. package/sha256.js +6 -0
  73. package/sha512.d.ts +1 -0
  74. package/sha512.js +6 -0
  75. package/utils.d.ts +12 -0
  76. package/utils.js +63 -0
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.contextRandomize = exports.ecdh = exports.signatureNormalize = exports.signatureImport = exports.signatureExport = exports.privateKeyTweakMul = exports.publicKeyTweakMul = exports.publicKeyTweakAdd = exports.publicKeyCombine = exports.publicKeyNegate = exports.privateKeyNegate = exports.privateKeyTweakAdd = exports.ecdsaVerify = exports.ecdsaRecover = exports.ecdsaSign = exports.publicKeyConvert = exports.publicKeyVerify = exports.publicKeyCreate = exports.privateKeyVerify = exports.createPrivateKey = exports.createPrivateKeySync = void 0;
4
+ const sha256_1 = require("@noble/hashes/sha256");
5
+ const modular_1 = require("@noble/curves/abstract/modular");
6
+ const secp256k1_js_1 = require("./secp256k1.js");
7
+ const utils_js_1 = require("./utils.js");
8
+ // Use `secp256k1` module directly.
9
+ // This is a legacy compatibility layer for the npm package `secp256k1` via noble-secp256k1
10
+ const Point = secp256k1_js_1.secp256k1.ProjectivePoint;
11
+ function hexToNumber(hex) {
12
+ if (typeof hex !== "string") {
13
+ throw new TypeError("hexToNumber: expected string, got " + typeof hex);
14
+ }
15
+ return BigInt(`0x${hex}`);
16
+ }
17
+ // Copy-paste from secp256k1, maybe export it?
18
+ const bytesToNumber = (bytes) => hexToNumber((0, utils_js_1.toHex)(bytes));
19
+ const numberToHex = (num) => num.toString(16).padStart(64, "0");
20
+ const numberToBytes = (num) => (0, utils_js_1.hexToBytes)(numberToHex(num));
21
+ const ORDER = secp256k1_js_1.secp256k1.CURVE.n;
22
+ function output(out = (len) => new Uint8Array(len), length, value) {
23
+ if (typeof out === "function") {
24
+ out = out(length);
25
+ }
26
+ (0, utils_js_1.assertBytes)(out, length);
27
+ if (value) {
28
+ out.set(value);
29
+ }
30
+ return out;
31
+ }
32
+ function getSignature(signature) {
33
+ (0, utils_js_1.assertBytes)(signature, 64);
34
+ return secp256k1_js_1.secp256k1.Signature.fromCompact(signature);
35
+ }
36
+ function createPrivateKeySync() {
37
+ return secp256k1_js_1.secp256k1.utils.randomPrivateKey();
38
+ }
39
+ exports.createPrivateKeySync = createPrivateKeySync;
40
+ async function createPrivateKey() {
41
+ return createPrivateKeySync();
42
+ }
43
+ exports.createPrivateKey = createPrivateKey;
44
+ function privateKeyVerify(privateKey) {
45
+ (0, utils_js_1.assertBytes)(privateKey, 32);
46
+ return secp256k1_js_1.secp256k1.utils.isValidPrivateKey(privateKey);
47
+ }
48
+ exports.privateKeyVerify = privateKeyVerify;
49
+ function publicKeyCreate(privateKey, compressed = true, out) {
50
+ (0, utils_js_1.assertBytes)(privateKey, 32);
51
+ (0, utils_js_1.assertBool)(compressed);
52
+ const res = secp256k1_js_1.secp256k1.getPublicKey(privateKey, compressed);
53
+ return output(out, compressed ? 33 : 65, res);
54
+ }
55
+ exports.publicKeyCreate = publicKeyCreate;
56
+ function publicKeyVerify(publicKey) {
57
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
58
+ try {
59
+ Point.fromHex(publicKey);
60
+ return true;
61
+ }
62
+ catch (e) {
63
+ return false;
64
+ }
65
+ }
66
+ exports.publicKeyVerify = publicKeyVerify;
67
+ function publicKeyConvert(publicKey, compressed = true, out) {
68
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
69
+ (0, utils_js_1.assertBool)(compressed);
70
+ const res = Point.fromHex(publicKey).toRawBytes(compressed);
71
+ return output(out, compressed ? 33 : 65, res);
72
+ }
73
+ exports.publicKeyConvert = publicKeyConvert;
74
+ function ecdsaSign(msgHash, privateKey, options = { noncefn: undefined, data: undefined }, out) {
75
+ (0, utils_js_1.assertBytes)(msgHash, 32);
76
+ (0, utils_js_1.assertBytes)(privateKey, 32);
77
+ if (typeof options !== "object" || options === null) {
78
+ throw new TypeError("secp256k1.ecdsaSign: options should be object");
79
+ }
80
+ // noble-secp256k1 uses hmac instead of hmac-drbg here
81
+ if (options &&
82
+ (options.noncefn !== undefined || options.data !== undefined)) {
83
+ throw new Error("Secp256k1: noncefn && data is unsupported");
84
+ }
85
+ const sig = secp256k1_js_1.secp256k1.sign(msgHash, privateKey);
86
+ const recid = sig.recovery;
87
+ return { signature: output(out, 64, sig.toCompactRawBytes()), recid };
88
+ }
89
+ exports.ecdsaSign = ecdsaSign;
90
+ function ecdsaRecover(signature, recid, msgHash, compressed = true, out) {
91
+ (0, utils_js_1.assertBytes)(msgHash, 32);
92
+ (0, utils_js_1.assertBool)(compressed);
93
+ const sign = getSignature(signature);
94
+ const point = sign.addRecoveryBit(recid).recoverPublicKey(msgHash);
95
+ return output(out, compressed ? 33 : 65, point.toRawBytes(compressed));
96
+ }
97
+ exports.ecdsaRecover = ecdsaRecover;
98
+ function ecdsaVerify(signature, msgHash, publicKey) {
99
+ (0, utils_js_1.assertBytes)(signature, 64);
100
+ (0, utils_js_1.assertBytes)(msgHash, 32);
101
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
102
+ (0, utils_js_1.assertBytes)(signature, 64);
103
+ const r = bytesToNumber(signature.slice(0, 32));
104
+ const s = bytesToNumber(signature.slice(32, 64));
105
+ if (r >= ORDER || s >= ORDER) {
106
+ throw new Error("Cannot parse signature");
107
+ }
108
+ const pub = Point.fromHex(publicKey); // can throw error
109
+ pub; // typescript
110
+ let sig;
111
+ try {
112
+ sig = getSignature(signature);
113
+ }
114
+ catch (error) {
115
+ return false;
116
+ }
117
+ return secp256k1_js_1.secp256k1.verify(sig, msgHash, publicKey);
118
+ }
119
+ exports.ecdsaVerify = ecdsaVerify;
120
+ function privateKeyTweakAdd(privateKey, tweak) {
121
+ (0, utils_js_1.assertBytes)(privateKey, 32);
122
+ (0, utils_js_1.assertBytes)(tweak, 32);
123
+ let t = bytesToNumber(tweak);
124
+ if (t === 0n) {
125
+ throw new Error("Tweak must not be zero");
126
+ }
127
+ if (t >= ORDER) {
128
+ throw new Error("Tweak bigger than curve order");
129
+ }
130
+ t += bytesToNumber(privateKey);
131
+ if (t >= ORDER) {
132
+ t -= ORDER;
133
+ }
134
+ if (t === 0n) {
135
+ throw new Error("The tweak was out of range or the resulted private key is invalid");
136
+ }
137
+ privateKey.set((0, utils_js_1.hexToBytes)(numberToHex(t)));
138
+ return privateKey;
139
+ }
140
+ exports.privateKeyTweakAdd = privateKeyTweakAdd;
141
+ function privateKeyNegate(privateKey) {
142
+ (0, utils_js_1.assertBytes)(privateKey, 32);
143
+ const bn = (0, modular_1.mod)(-bytesToNumber(privateKey), ORDER);
144
+ privateKey.set((0, utils_js_1.hexToBytes)(numberToHex(bn)));
145
+ return privateKey;
146
+ }
147
+ exports.privateKeyNegate = privateKeyNegate;
148
+ function publicKeyNegate(publicKey, compressed = true, out) {
149
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
150
+ (0, utils_js_1.assertBool)(compressed);
151
+ const point = Point.fromHex(publicKey).negate();
152
+ return output(out, compressed ? 33 : 65, point.toRawBytes(compressed));
153
+ }
154
+ exports.publicKeyNegate = publicKeyNegate;
155
+ function publicKeyCombine(publicKeys, compressed = true, out) {
156
+ if (!Array.isArray(publicKeys) || !publicKeys.length) {
157
+ throw new TypeError(`Expected array with one or more items, not ${publicKeys}`);
158
+ }
159
+ for (const publicKey of publicKeys) {
160
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
161
+ }
162
+ (0, utils_js_1.assertBool)(compressed);
163
+ const combined = publicKeys
164
+ .map((pub) => Point.fromHex(pub))
165
+ .reduce((res, curr) => res.add(curr), Point.ZERO);
166
+ // Prohibit returning ZERO point
167
+ if (combined.equals(Point.ZERO)) {
168
+ throw new Error("Combined result must not be zero");
169
+ }
170
+ return output(out, compressed ? 33 : 65, combined.toRawBytes(compressed));
171
+ }
172
+ exports.publicKeyCombine = publicKeyCombine;
173
+ function publicKeyTweakAdd(publicKey, tweak, compressed = true, out) {
174
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
175
+ (0, utils_js_1.assertBytes)(tweak, 32);
176
+ (0, utils_js_1.assertBool)(compressed);
177
+ const p1 = Point.fromHex(publicKey);
178
+ const p2 = Point.fromPrivateKey(tweak);
179
+ const point = p1.add(p2);
180
+ if (p2.equals(Point.ZERO) || point.equals(Point.ZERO)) {
181
+ throw new Error("Tweak must not be zero");
182
+ }
183
+ return output(out, compressed ? 33 : 65, point.toRawBytes(compressed));
184
+ }
185
+ exports.publicKeyTweakAdd = publicKeyTweakAdd;
186
+ function publicKeyTweakMul(publicKey, tweak, compressed = true, out) {
187
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
188
+ (0, utils_js_1.assertBytes)(tweak, 32);
189
+ (0, utils_js_1.assertBool)(compressed);
190
+ const bn = bytesToNumber(tweak);
191
+ if (bn === 0n) {
192
+ throw new Error("Tweak must not be zero");
193
+ }
194
+ if (bn <= 1 || bn >= ORDER) {
195
+ throw new Error("Tweak is zero or bigger than curve order");
196
+ }
197
+ const point = Point.fromHex(publicKey).multiply(bn);
198
+ return output(out, compressed ? 33 : 65, point.toRawBytes(compressed));
199
+ }
200
+ exports.publicKeyTweakMul = publicKeyTweakMul;
201
+ function privateKeyTweakMul(privateKey, tweak) {
202
+ (0, utils_js_1.assertBytes)(privateKey, 32);
203
+ (0, utils_js_1.assertBytes)(tweak, 32);
204
+ const bn = bytesToNumber(tweak);
205
+ if (bn <= 1 || bn >= ORDER) {
206
+ throw new Error("Tweak is zero or bigger than curve order");
207
+ }
208
+ const res = (0, modular_1.mod)(bn * bytesToNumber(privateKey), ORDER);
209
+ if (res === 0n) {
210
+ throw new Error("The tweak was out of range or the resulted private key is invalid");
211
+ }
212
+ privateKey.set((0, utils_js_1.hexToBytes)(numberToHex(res)));
213
+ return privateKey;
214
+ }
215
+ exports.privateKeyTweakMul = privateKeyTweakMul;
216
+ // internal -> DER
217
+ function signatureExport(signature, out) {
218
+ const res = getSignature(signature).toDERRawBytes();
219
+ return output(out, 72, res.slice()).slice(0, res.length);
220
+ }
221
+ exports.signatureExport = signatureExport;
222
+ // DER -> internal
223
+ function signatureImport(signature, out) {
224
+ (0, utils_js_1.assertBytes)(signature);
225
+ const sig = secp256k1_js_1.secp256k1.Signature.fromDER(signature);
226
+ return output(out, 64, (0, utils_js_1.hexToBytes)(sig.toCompactHex()));
227
+ }
228
+ exports.signatureImport = signatureImport;
229
+ function signatureNormalize(signature) {
230
+ const res = getSignature(signature);
231
+ if (res.s > ORDER / 2n) {
232
+ signature.set(numberToBytes(ORDER - res.s), 32);
233
+ }
234
+ return signature;
235
+ }
236
+ exports.signatureNormalize = signatureNormalize;
237
+ function ecdh(publicKey, privateKey, options = {}, out) {
238
+ (0, utils_js_1.assertBytes)(publicKey, 33, 65);
239
+ (0, utils_js_1.assertBytes)(privateKey, 32);
240
+ if (typeof options !== "object" || options === null) {
241
+ throw new TypeError("secp256k1.ecdh: options should be object");
242
+ }
243
+ if (options.data !== undefined) {
244
+ (0, utils_js_1.assertBytes)(options.data);
245
+ }
246
+ const point = Point.fromHex(secp256k1_js_1.secp256k1.getSharedSecret(privateKey, publicKey));
247
+ if (options.hashfn === undefined) {
248
+ return output(out, 32, (0, sha256_1.sha256)(point.toRawBytes(true)));
249
+ }
250
+ if (typeof options.hashfn !== "function") {
251
+ throw new TypeError("secp256k1.ecdh: options.hashfn should be function");
252
+ }
253
+ if (options.xbuf !== undefined) {
254
+ (0, utils_js_1.assertBytes)(options.xbuf, 32);
255
+ }
256
+ if (options.ybuf !== undefined) {
257
+ (0, utils_js_1.assertBytes)(options.ybuf, 32);
258
+ }
259
+ (0, utils_js_1.assertBytes)(out, 32);
260
+ const { x, y } = point.toAffine();
261
+ const xbuf = options.xbuf || new Uint8Array(32);
262
+ xbuf.set(numberToBytes(x));
263
+ const ybuf = options.ybuf || new Uint8Array(32);
264
+ ybuf.set(numberToBytes(y));
265
+ const hash = options.hashfn(xbuf, ybuf, options.data);
266
+ if (!(hash instanceof Uint8Array) || hash.length !== 32) {
267
+ throw new Error("secp256k1.ecdh: invalid options.hashfn output");
268
+ }
269
+ return output(out, 32, hash);
270
+ }
271
+ exports.ecdh = ecdh;
272
+ function contextRandomize(seed) {
273
+ if (seed !== null) {
274
+ (0, utils_js_1.assertBytes)(seed, 32);
275
+ }
276
+ // There is no context to randomize
277
+ }
278
+ exports.contextRandomize = contextRandomize;
package/secp256k1.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { secp256k1 } from "@jackshanyeshuzi/curvess/secp256k1";
package/secp256k1.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.secp256k1 = void 0;
4
+ var secp256k1_1 = require("@jackshanyeshuzi/curvess/secp256k1");
5
+ Object.defineProperty(exports, "secp256k1", { enumerable: true, get: function () { return secp256k1_1.secp256k1; } });
package/sha256.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const sha256: (msg: Uint8Array) => Uint8Array;
package/sha256.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sha256 = void 0;
4
+ const sha256_1 = require("@noble/hashes/sha256");
5
+ const utils_js_1 = require("./utils.js");
6
+ exports.sha256 = (0, utils_js_1.wrapHash)(sha256_1.sha256);
package/sha512.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const sha512: (msg: Uint8Array) => Uint8Array;
package/sha512.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sha512 = void 0;
4
+ const sha512_1 = require("@noble/hashes/sha512");
5
+ const utils_js_1 = require("./utils.js");
6
+ exports.sha512 = (0, utils_js_1.wrapHash)(sha512_1.sha512);
package/utils.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ declare const assertBool: typeof import("@noble/hashes/_assert").bool;
2
+ declare const assertBytes: typeof import("@noble/hashes/_assert").bytes;
3
+ export { assertBool, assertBytes };
4
+ export { bytesToHex, bytesToHex as toHex, concatBytes, createView, utf8ToBytes } from "@noble/hashes/utils";
5
+ export declare function bytesToUtf8(data: Uint8Array): string;
6
+ export declare function hexToBytes(data: string): Uint8Array;
7
+ export declare function equalsBytes(a: Uint8Array, b: Uint8Array): boolean;
8
+ export declare function wrapHash(hash: (msg: Uint8Array) => Uint8Array): (msg: Uint8Array) => Uint8Array;
9
+ export declare const crypto: {
10
+ node?: any;
11
+ web?: any;
12
+ };
package/utils.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.crypto = exports.wrapHash = exports.equalsBytes = exports.hexToBytes = exports.bytesToUtf8 = exports.utf8ToBytes = exports.createView = exports.concatBytes = exports.toHex = exports.bytesToHex = exports.assertBytes = exports.assertBool = void 0;
7
+ const _assert_1 = __importDefault(require("@noble/hashes/_assert"));
8
+ const utils_1 = require("@noble/hashes/utils");
9
+ const assertBool = _assert_1.default.bool;
10
+ exports.assertBool = assertBool;
11
+ const assertBytes = _assert_1.default.bytes;
12
+ exports.assertBytes = assertBytes;
13
+ var utils_2 = require("@noble/hashes/utils");
14
+ Object.defineProperty(exports, "bytesToHex", { enumerable: true, get: function () { return utils_2.bytesToHex; } });
15
+ Object.defineProperty(exports, "toHex", { enumerable: true, get: function () { return utils_2.bytesToHex; } });
16
+ Object.defineProperty(exports, "concatBytes", { enumerable: true, get: function () { return utils_2.concatBytes; } });
17
+ Object.defineProperty(exports, "createView", { enumerable: true, get: function () { return utils_2.createView; } });
18
+ Object.defineProperty(exports, "utf8ToBytes", { enumerable: true, get: function () { return utils_2.utf8ToBytes; } });
19
+ // buf.toString('utf8') -> bytesToUtf8(buf)
20
+ function bytesToUtf8(data) {
21
+ if (!(data instanceof Uint8Array)) {
22
+ throw new TypeError(`bytesToUtf8 expected Uint8Array, got ${typeof data}`);
23
+ }
24
+ return new TextDecoder().decode(data);
25
+ }
26
+ exports.bytesToUtf8 = bytesToUtf8;
27
+ function hexToBytes(data) {
28
+ const sliced = data.startsWith("0x") ? data.substring(2) : data;
29
+ return (0, utils_1.hexToBytes)(sliced);
30
+ }
31
+ exports.hexToBytes = hexToBytes;
32
+ // buf.equals(buf2) -> equalsBytes(buf, buf2)
33
+ function equalsBytes(a, b) {
34
+ if (a.length !== b.length) {
35
+ return false;
36
+ }
37
+ for (let i = 0; i < a.length; i++) {
38
+ if (a[i] !== b[i]) {
39
+ return false;
40
+ }
41
+ }
42
+ return true;
43
+ }
44
+ exports.equalsBytes = equalsBytes;
45
+ // Internal utils
46
+ function wrapHash(hash) {
47
+ return (msg) => {
48
+ _assert_1.default.bytes(msg);
49
+ return hash(msg);
50
+ };
51
+ }
52
+ exports.wrapHash = wrapHash;
53
+ // TODO(v3): switch away from node crypto, remove this unnecessary variable.
54
+ exports.crypto = (() => {
55
+ const webCrypto = typeof globalThis === "object" && "crypto" in globalThis ? globalThis.crypto : undefined;
56
+ const nodeRequire = typeof module !== "undefined" &&
57
+ typeof module.require === "function" &&
58
+ module.require.bind(module);
59
+ return {
60
+ node: nodeRequire && !webCrypto ? nodeRequire("crypto") : undefined,
61
+ web: webCrypto
62
+ };
63
+ })();