diff options
Diffstat (limited to 'src/node-fallbacks/crypto.js')
| -rw-r--r-- | src/node-fallbacks/crypto.js | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/node-fallbacks/crypto.js b/src/node-fallbacks/crypto.js index 0f428df13..4a0e4c735 100644 --- a/src/node-fallbacks/crypto.js +++ b/src/node-fallbacks/crypto.js @@ -1,5 +1,7 @@ export * from "crypto-browserify"; +export var DEFAULT_ENCODING = "buffer"; + // we deliberately reference crypto. directly here because we want to preserve the This binding export const getRandomValues = (array) => { return crypto.getRandomValues(array); @@ -25,15 +27,62 @@ export const timingSafeEqual = throw new RangeError("Input buffers must have the same length"); } + // these error checks are also performed in the function + // however there is a bug where exceptions return no value return crypto.timingSafeEqual(a, b); } : undefined; +export const scryptSync = + "scryptSync" in crypto + ? (password, salt, keylen, options) => { + const res = crypto.scryptSync(password, salt, keylen, options); + return DEFAULT_ENCODING !== "buffer" + ? new Buffer(res).toString(DEFAULT_ENCODING) + : new Buffer(res); + } + : undefined; + +export const scrypt = + "scryptSync" in crypto + ? function (password, salt, keylen, options, callback) { + if (typeof options === "function") { + callback = options; + options = undefined; + } + + if (typeof callback !== "function") { + var err = new TypeError("callback must be a function"); + err.code = "ERR_INVALID_CALLBACK"; + throw err; + } + + try { + const result = crypto.scryptSync(password, salt, keylen, options); + process.nextTick( + callback, + null, + DEFAULT_ENCODING !== "buffer" + ? new Buffer(result).toString(DEFAULT_ENCODING) + : new Buffer(result), + ); + } catch (err) { + throw err; + } + } + : undefined; + if (timingSafeEqual) { // hide it from stack trace Object.defineProperty(timingSafeEqual, "name", { value: "::bunternal::", }); + Object.defineProperty(scrypt, "name", { + value: "::bunternal::", + }); + Object.defineProperty(scryptSync, "name", { + value: "::bunternal::", + }); } export const webcrypto = crypto; |
