Skip to content

Commit 6ac76c3

Browse files
author
AJ ONeal
committed
feat: support WebCrypto
1 parent 89a3638 commit 6ac76c3

File tree

1 file changed

+44
-7
lines changed

1 file changed

+44
-7
lines changed

lib/hdkey.js

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ var HDKey = ("object" === typeof module && exports) || {};
5959
const BUFFER_BE = false;
6060
const COMPRESSED = true;
6161

62-
let crypto = require("crypto");
62+
//@ts-ignore
63+
let Crypto = window.crypto || require("crypto");
6364
let bs58check = require("bs58check");
6465

6566
let Utils = {};
@@ -88,24 +89,60 @@ var HDKey = ("object" === typeof module && exports) || {};
8889
};
8990

9091
/** @type {HDHasher} */
91-
Utils.ripemd160sum = async function (buf) {
92+
Utils.ripemd160sum = async function (bytes) {
9293
let RIPEMD160 = require("ripemd160");
93-
return new RIPEMD160().update(buf).digest();
94+
let buf = Buffer.from(bytes);
95+
let hash = new RIPEMD160().update(buf).digest();
96+
return new Uint8Array(hash);
9497
};
9598

9699
/** @type {HDHasher} */
97-
Utils.sha256sum = async function (buf) {
98-
return crypto.createHash("sha256").update(buf).digest();
100+
Utils.sha256sum = async function (bytes) {
101+
if (!Crypto.subtle) {
102+
let sha256 = Crypto.createHash("sha256").update(bytes).digest();
103+
return new Uint8Array(sha256);
104+
}
105+
let arrayBuffer = await Crypto.subtle.digest("SHA-256", bytes);
106+
let hashBytes = new Uint8Array(arrayBuffer);
107+
return hashBytes;
99108
};
100109

101110
/** @type {HDHmac} */
102111
Utils.sha512hmac = async function (entropy, data) {
103-
return crypto.createHmac("sha512", entropy).update(data).digest();
112+
if (!Crypto.subtle) {
113+
let buf = Crypto.createHmac("sha512", entropy).update(data).digest();
114+
return new Uint8Array(buf);
115+
}
116+
117+
/** @type {"raw"|"pkcs8"|"spki"} */
118+
let format = "raw";
119+
let algo = {
120+
name: "HMAC",
121+
hash: "SHA-512",
122+
};
123+
let extractable = false;
124+
/** @type {Array<KeyUsage>} */
125+
let keyUsages = ["sign"];
126+
let hmacKey = await Crypto.subtle.importKey(
127+
format,
128+
entropy,
129+
algo,
130+
extractable,
131+
keyUsages,
132+
);
133+
let sig = await Crypto.subtle.sign("HMAC", hmacKey, data);
134+
135+
return new Uint8Array(sig);
104136
};
105137

106138
/** @type {HDSecureErase} */
107139
Utils.secureErase = function (buf) {
108-
crypto.randomBytes(buf.length).copy(buf);
140+
if (!Crypto.getRandomValues) {
141+
Crypto.randomBytes(buf.length).copy(buf);
142+
return;
143+
}
144+
145+
Crypto.getRandomValues(buf);
109146
};
110147

111148
/** @type {HDUtilSign} */

0 commit comments

Comments
 (0)