From 27d2d0a7318909184e42c13c8eefb04d8cac1d83 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Fri, 3 Feb 2023 01:35:45 -0700 Subject: [PATCH] feat: support WebCrypto --- lib/hdkey.js | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/lib/hdkey.js b/lib/hdkey.js index e03ef9d..9a8d310 100644 --- a/lib/hdkey.js +++ b/lib/hdkey.js @@ -59,7 +59,8 @@ var HDKey = ("object" === typeof module && exports) || {}; const BUFFER_BE = false; const COMPRESSED = true; - let crypto = require("crypto"); + //@ts-ignore + let Crypto = window.crypto || require("crypto"); let bs58check = require("bs58check"); let Utils = {}; @@ -88,24 +89,60 @@ var HDKey = ("object" === typeof module && exports) || {}; }; /** @type {HDHasher} */ - Utils.ripemd160sum = async function (buf) { + Utils.ripemd160sum = async function (bytes) { let RIPEMD160 = require("ripemd160"); - return new RIPEMD160().update(buf).digest(); + let buf = Buffer.from(bytes); + let hash = new RIPEMD160().update(buf).digest(); + return new Uint8Array(hash); }; /** @type {HDHasher} */ - Utils.sha256sum = async function (buf) { - return crypto.createHash("sha256").update(buf).digest(); + Utils.sha256sum = async function (bytes) { + if (!Crypto.subtle) { + let sha256 = Crypto.createHash("sha256").update(bytes).digest(); + return new Uint8Array(sha256); + } + let arrayBuffer = await Crypto.subtle.digest("SHA-256", bytes); + let hashBytes = new Uint8Array(arrayBuffer); + return hashBytes; }; /** @type {HDHmac} */ Utils.sha512hmac = async function (entropy, data) { - return crypto.createHmac("sha512", entropy).update(data).digest(); + if (!Crypto.subtle) { + let buf = Crypto.createHmac("sha512", entropy).update(data).digest(); + return new Uint8Array(buf); + } + + /** @type {"raw"|"pkcs8"|"spki"} */ + let format = "raw"; + let algo = { + name: "HMAC", + hash: "SHA-512", + }; + let extractable = false; + /** @type {Array} */ + let keyUsages = ["sign"]; + let hmacKey = await Crypto.subtle.importKey( + format, + entropy, + algo, + extractable, + keyUsages, + ); + let sig = await Crypto.subtle.sign("HMAC", hmacKey, data); + + return new Uint8Array(sig); }; /** @type {HDSecureErase} */ Utils.secureErase = function (buf) { - crypto.randomBytes(buf.length).copy(buf); + if (!Crypto.getRandomValues) { + Crypto.randomBytes(buf.length).copy(buf); + return; + } + + Crypto.getRandomValues(buf); }; /** @type {HDUtilSign} */