From 49a1d1ab46d22ac02659cb787ded08d644f79cb5 Mon Sep 17 00:00:00 2001 From: Telokis Date: Sun, 28 May 2017 23:20:08 +0200 Subject: [PATCH 01/25] Added bin entry --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 97be5df..503a57a 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,9 @@ "crypt", "crypto" ], + "bin": { + "bcrypt": "bin/bcrypt" + }, "main": "index.js", "browser": "dist/bcrypt.js", "dependencies": {}, From 127318c7dd3e1efa01c25756b03298fcbf675857 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Mon, 5 Mar 2018 18:37:24 +0100 Subject: [PATCH 02/25] Postfix bower.json template file, fixes #66 --- bower.json | 2 +- package.json | 2 +- scripts/build.js | 2 +- src/{bower.json => bower.json.template} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/{bower.json => bower.json.template} (100%) diff --git a/bower.json b/bower.json index c152405..1ea9a98 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "bcryptjs", "description": "Optimized bcrypt in plain JavaScript with zero dependencies.", - "version": "2.4.3", + "version": "2.4.4", "main": "dist/bcrypt.min.js", "license": "New-BSD", "homepage": "http://dcode.io/", diff --git a/package.json b/package.json index 503a57a..bba1b33 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bcryptjs", "description": "Optimized bcrypt in plain JavaScript with zero dependencies. Compatible to 'bcrypt'.", - "version": "2.4.3", + "version": "2.4.4", "author": "Daniel Wirtz ", "contributors": [ "Shane Girish (https://github.com/shaneGirish)", diff --git a/scripts/build.js b/scripts/build.js index 7b34ea4..093ff7a 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -33,5 +33,5 @@ scope = { VERSION: pkg.version }; console.log("Updating bower.json with scope", JSON.stringify(scope, null, 2)); fs.writeFileSync( path.join(rootDir, "bower.json"), - MetaScript.transform(fs.readFileSync(filename = path.join(srcDir, "bower.json")), filename, scope, srcDir) + MetaScript.transform(fs.readFileSync(path.join(srcDir, "bower.json.template")), path.join(srcDir, "bower.json"), scope, srcDir) ); diff --git a/src/bower.json b/src/bower.json.template similarity index 100% rename from src/bower.json rename to src/bower.json.template From 648482a5395bef074ad34e52759fede957a89397 Mon Sep 17 00:00:00 2001 From: Dennis Richter Date: Mon, 5 Mar 2018 18:39:02 +0100 Subject: [PATCH 03/25] Improve safeStringCompare using xor (#77) --- src/bcrypt.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/bcrypt.js b/src/bcrypt.js index 11dedc1..bd043df 100644 --- a/src/bcrypt.js +++ b/src/bcrypt.js @@ -198,18 +198,11 @@ bcrypt.hash = function(s, salt, callback, progressCallback) { * @inner */ function safeStringCompare(known, unknown) { - var right = 0, - wrong = 0; - for (var i=0, k=known.length; i Date: Mon, 5 Mar 2018 19:20:18 +0100 Subject: [PATCH 04/25] Post-merge; Clean up a bit --- dist/bcrypt.js | 288 ++++++++-------------------------------- dist/bcrypt.min.js | 95 +++++++------ dist/bcrypt.min.js.gz | Bin 9443 -> 10622 bytes dist/bcrypt.min.map | 8 +- package.json | 7 +- src/bcrypt.js | 12 +- src/bcrypt/util.js | 19 +-- src/bcrypt/util/utf8.js | 52 ++++++++ 8 files changed, 176 insertions(+), 305 deletions(-) create mode 100644 src/bcrypt/util/utf8.js diff --git a/dist/bcrypt.js b/dist/bcrypt.js index a50dbee..87c7155 100644 --- a/dist/bcrypt.js +++ b/dist/bcrypt.js @@ -106,7 +106,6 @@ * @param {number=} seed_length Not supported. * @returns {string} Resulting salt * @throws {Error} If a random fallback is required but not set - * @expose */ bcrypt.genSaltSync = function(rounds, seed_length) { rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; @@ -133,7 +132,6 @@ * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function - * @expose */ bcrypt.genSalt = function(rounds, seed_length, callback) { if (typeof seed_length === 'function') @@ -178,7 +176,6 @@ * @param {string} s String to hash * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 * @returns {string} Resulting hash - * @expose */ bcrypt.hashSync = function(s, salt) { if (typeof salt === 'undefined') @@ -199,7 +196,6 @@ * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function - * @expose */ bcrypt.hash = function(s, salt, callback, progressCallback) { @@ -238,18 +234,11 @@ * @inner */ function safeStringCompare(known, unknown) { - var right = 0, - wrong = 0; - for (var i=0, k=known.length; i> 6 | 192; + buffer[offset++] = c1 & 63 | 128; + } else if ( + ( c1 & 0xFC00) === 0xD800 && + ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00 + ) { + c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); + ++i; + buffer[offset++] = c1 >> 18 | 240; + buffer[offset++] = c1 >> 12 & 63 | 128; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } else { + buffer[offset++] = c1 >> 12 | 224; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } + } + return buffer; + } + /** * Converts a JavaScript string to UTF8 bytes. + * @function * @param {string} str String * @returns {!Array.} UTF8 bytes * @inner */ - function stringToBytes(str) { - var out = [], - i = 0; - utfx.encodeUTF16toUTF8(function() { - if (i >= str.length) return null; - return str.charCodeAt(i++); - }, function(b) { - out.push(b); - }); - return out; - } + var stringToBytes = utf8Array; // A base64 implementation for the bcrypt algorithm. This is partly non-standard. @@ -486,203 +515,6 @@ return res; } - /** - * utfx-embeddable (c) 2014 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/utfx for details - */ - var utfx = function() { - "use strict"; - - /** - * utfx namespace. - * @inner - * @type {!Object.} - */ - var utfx = {}; - - /** - * Maximum valid code point. - * @type {number} - * @const - */ - utfx.MAX_CODEPOINT = 0x10FFFF; - - /** - * Encodes UTF8 code points to UTF8 bytes. - * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point - * respectively `null` if there are no more code points left or a single numeric code point. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte - */ - utfx.encodeUTF8 = function(src, dst) { - var cp = null; - if (typeof src === 'number') - cp = src, - src = function() { return null; }; - while (cp !== null || (cp = src()) !== null) { - if (cp < 0x80) - dst(cp&0x7F); - else if (cp < 0x800) - dst(((cp>>6)&0x1F)|0xC0), - dst((cp&0x3F)|0x80); - else if (cp < 0x10000) - dst(((cp>>12)&0x0F)|0xE0), - dst(((cp>>6)&0x3F)|0x80), - dst((cp&0x3F)|0x80); - else - dst(((cp>>18)&0x07)|0xF0), - dst(((cp>>12)&0x3F)|0x80), - dst(((cp>>6)&0x3F)|0x80), - dst((cp&0x3F)|0x80); - cp = null; - } - }; - - /** - * Decodes UTF8 bytes to UTF8 code points. - * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there - * are no more bytes left. - * @param {!function(number)} dst Code points destination as a function successively called with each decoded code point. - * @throws {RangeError} If a starting byte is invalid in UTF8 - * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the - * remaining bytes. - */ - utfx.decodeUTF8 = function(src, dst) { - var a, b, c, d, fail = function(b) { - b = b.slice(0, b.indexOf(null)); - var err = Error(b.toString()); - err.name = "TruncatedError"; - err['bytes'] = b; - throw err; - }; - while ((a = src()) !== null) { - if ((a&0x80) === 0) - dst(a); - else if ((a&0xE0) === 0xC0) - ((b = src()) === null) && fail([a, b]), - dst(((a&0x1F)<<6) | (b&0x3F)); - else if ((a&0xF0) === 0xE0) - ((b=src()) === null || (c=src()) === null) && fail([a, b, c]), - dst(((a&0x0F)<<12) | ((b&0x3F)<<6) | (c&0x3F)); - else if ((a&0xF8) === 0xF0) - ((b=src()) === null || (c=src()) === null || (d=src()) === null) && fail([a, b, c ,d]), - dst(((a&0x07)<<18) | ((b&0x3F)<<12) | ((c&0x3F)<<6) | (d&0x3F)); - else throw RangeError("Illegal starting byte: "+a); - } - }; - - /** - * Converts UTF16 characters to UTF8 code points. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @param {!function(number)} dst Code points destination as a function successively called with each converted code - * point. - */ - utfx.UTF16toUTF8 = function(src, dst) { - var c1, c2 = null; - while (true) { - if ((c1 = c2 !== null ? c2 : src()) === null) - break; - if (c1 >= 0xD800 && c1 <= 0xDFFF) { - if ((c2 = src()) !== null) { - if (c2 >= 0xDC00 && c2 <= 0xDFFF) { - dst((c1-0xD800)*0x400+c2-0xDC00+0x10000); - c2 = null; continue; - } - } - } - dst(c1); - } - if (c2 !== null) dst(c2); - }; - - /** - * Converts UTF8 code points to UTF16 characters. - * @param {(!function():number|null) | number} src Code points source, either as a function returning the next code point - * respectively `null` if there are no more code points left or a single numeric code point. - * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. - * @throws {RangeError} If a code point is out of range - */ - utfx.UTF8toUTF16 = function(src, dst) { - var cp = null; - if (typeof src === 'number') - cp = src, src = function() { return null; }; - while (cp !== null || (cp = src()) !== null) { - if (cp <= 0xFFFF) - dst(cp); - else - cp -= 0x10000, - dst((cp>>10)+0xD800), - dst((cp%0x400)+0xDC00); - cp = null; - } - }; - - /** - * Converts and encodes UTF16 characters to UTF8 bytes. - * @param {!function():number|null} src Characters source as a function returning the next char code respectively `null` - * if there are no more characters left. - * @param {!function(number)} dst Bytes destination as a function successively called with the next byte. - */ - utfx.encodeUTF16toUTF8 = function(src, dst) { - utfx.UTF16toUTF8(src, function(cp) { - utfx.encodeUTF8(cp, dst); - }); - }; - - /** - * Decodes and converts UTF8 bytes to UTF16 characters. - * @param {!function():number|null} src Bytes source as a function returning the next byte respectively `null` if there - * are no more bytes left. - * @param {!function(number)} dst Characters destination as a function successively called with each converted char code. - * @throws {RangeError} If a starting byte is invalid in UTF8 - * @throws {Error} If the last sequence is truncated. Has an array property `bytes` holding the remaining bytes. - */ - utfx.decodeUTF8toUTF16 = function(src, dst) { - utfx.decodeUTF8(src, function(cp) { - utfx.UTF8toUTF16(cp, dst); - }); - }; - - /** - * Calculates the byte length of an UTF8 code point. - * @param {number} cp UTF8 code point - * @returns {number} Byte length - */ - utfx.calculateCodePoint = function(cp) { - return (cp < 0x80) ? 1 : (cp < 0x800) ? 2 : (cp < 0x10000) ? 3 : 4; - }; - - /** - * Calculates the number of UTF8 bytes required to store UTF8 code points. - * @param {(!function():number|null)} src Code points source as a function returning the next code point respectively - * `null` if there are no more code points left. - * @returns {number} The number of UTF8 bytes required - */ - utfx.calculateUTF8 = function(src) { - var cp, l=0; - while ((cp = src()) !== null) - l += utfx.calculateCodePoint(cp); - return l; - }; - - /** - * Calculates the number of UTF8 code points respectively UTF8 bytes required to store UTF16 char codes. - * @param {(!function():number|null)} src Characters source as a function returning the next char code respectively - * `null` if there are no more characters left. - * @returns {!Array.} The number of UTF8 code points at index 0 and the number of UTF8 bytes required at index 1. - */ - utfx.calculateUTF16asUTF8 = function(src) { - var n=0, l=0; - utfx.UTF16toUTF8(src, function(cp) { - ++n; l += utfx.calculateCodePoint(cp); - }); - return [n,l]; - }; - - return utfx; - }(); - Date.now = Date.now || function() { return +new Date; }; /** @@ -1361,7 +1193,6 @@ * @param {!Array.} b Byte array * @param {number} len Maximum input length * @returns {string} - * @expose */ bcrypt.encodeBase64 = base64_encode; @@ -1371,7 +1202,6 @@ * @param {string} s String to decode * @param {number} len Maximum output length * @returns {!Array.} - * @expose */ bcrypt.decodeBase64 = base64_decode; diff --git a/dist/bcrypt.min.js b/dist/bcrypt.min.js index 0fd2f1e..23d2a73 100644 --- a/dist/bcrypt.min.js +++ b/dist/bcrypt.min.js @@ -3,46 +3,55 @@ Released under the Apache License, Version 2.0 see: https://github.com/dcodeIO/bcrypt.js for details */ -(function(u,r){"function"===typeof define&&define.amd?define([],r):"function"===typeof require&&"object"===typeof module&&module&&module.exports?module.exports=r():(u.dcodeIO=u.dcodeIO||{}).bcrypt=r()})(this,function(){function u(e){if("undefined"!==typeof module&&module&&module.exports)try{return require("crypto").randomBytes(e)}catch(d){}try{var c;(self.crypto||self.msCrypto).getRandomValues(c=new Uint32Array(e));return Array.prototype.slice.call(c)}catch(b){}if(!w)throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); -return w(e)}function r(e,d){for(var c=0,b=0,a=0,f=e.length;ac?!1:0===b}function H(e){var d=[],c=0;I.encodeUTF16toUTF8(function(){return c>=e.length?null:e.charCodeAt(c++)},function(b){d.push(b)});return d}function x(e,d){var c=0,b=[],a,f;if(0>=d||d>e.length)throw Error("Illegal len: "+d);for(;c>2&63]);a=(a&3)<<4;if(c>=d){b.push(s[a&63]);break}f=e[c++]&255;a|=f>>4&15;b.push(s[a&63]);a=(f&15)<<2;if(c>=d){b.push(s[a& -63]);break}f=e[c++]&255;a|=f>>6&3;b.push(s[a&63]);b.push(s[f&63])}return b.join("")}function B(e,d){var c=0,b=e.length,a=0,f=[],g,m,h;if(0>=d)throw Error("Illegal len: "+d);for(;c>>0;h|=(m&48)>>4;f.push(z(h));if(++a>=d||c>=b)break;h=e.charCodeAt(c++);g=h>>0;h|=(g&60)>>2;f.push(z(h));if(++a>=d||c>=b)break;h=e.charCodeAt(c++);m=h>>0;h|=m;f.push(z(h));++a}b=[];for(c=0;c>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[1];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[2];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[3];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[4];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512| -f>>8&255];a+=b[768|f&255];g=g^a^c[5];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[6];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[7];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[8];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[9];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[10];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^ -c[11];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[12];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[13];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[14];a=b[f>>>24];a+=b[256|f>>16&255];a^=b[512|f>>8&255];a+=b[768|f&255];g=g^a^c[15];a=b[g>>>24];a+=b[256|g>>16&255];a^=b[512|g>>8&255];a+=b[768|g&255];f=f^a^c[16];e[d]=g^c[17];e[d+1]=f;return e}function t(e,d){for(var c=0,b=0;4>c;++c)b=b<<8|e[d]&255,d=(d+1)%e.length; -return{key:b,offp:d}}function C(e,d,c){for(var b=0,a=[0,0],f=d.length,g=c.length,m,h=0;hn;n++)for(y=0;y>1;y++)v(g,y<<1,l,k);h=[];for(n=0;n>24&255)>>>0),h.push((g[n]>>16&255)>>>0),h.push((g[n]>>8&255)>>>0),h.push((g[n]&255)>>>0);if(b){b(null,h);return}return h}b&&p(f)}var g=E.slice(),m=g.length,h;if(4>c||31>>0;var l,k,n=0,y;Int32Array?(l=new Int32Array(F),k=new Int32Array(G)):(l=F.slice(),k=G.slice());J(d,e,l,k);if("undefined"!==typeof b)f();else for(;;)if("undefined"!==typeof(h=f()))return h||[]}function A(e,d,c,b){function a(a){var b=[];b.push("$2");"a"<=f&&b.push(f);b.push("$");10>l&&b.push("0");b.push(l.toString());b.push("$");b.push(x(k,k.length));b.push(x(a,4* -E.length-1));return b.join("")}if("string"!==typeof e||"string"!==typeof d){b=Error("Invalid string / salt: Not a string");if(c){p(c.bind(this,b));return}throw b;}var f,g;if("$"!==d.charAt(0)||"2"!==d.charAt(1)){b=Error("Invalid salt version: "+d.substring(0,2));if(c){p(c.bind(this,b));return}throw b;}if("$"===d.charAt(2))f=String.fromCharCode(0),g=3;else{f=d.charAt(2);if("a"!==f&&"b"!==f&&"y"!==f||"$"!==d.charAt(3)){b=Error("Invalid salt revision: "+d.substring(2,4));if(c){p(c.bind(this,b));return}throw b; -}g=4}if("$"e?e=4:31e&&c.push("0");c.push(e.toString());c.push("$");c.push(x(u(16),16));return c.join("")};k.genSalt=function(e,d,c){function b(a){p(function(){try{a(null,k.genSaltSync(e))}catch(b){a(b)}})}"function"===typeof d&&(c=d,d=void 0);"function"===typeof e&&(c=e,e=void 0);if("undefined"===typeof e)e=10;else if("number"!==typeof e)throw Error("illegal arguments: "+typeof e);if(c){if("function"!==typeof c)throw Error("Illegal callback: "+ -typeof c);b(c)}else return new Promise(function(a,c){b(function(b,d){b?c(b):a(d)})})};k.hashSync=function(e,d){"undefined"===typeof d&&(d=10);"number"===typeof d&&(d=k.genSaltSync(d));if("string"!==typeof e||"string"!==typeof d)throw Error("Illegal arguments: "+typeof e+", "+typeof d);return A(e,d)};k.hash=function(e,d,c,b){function a(a){"string"===typeof e&&"number"===typeof d?k.genSalt(d,function(c,d){A(e,d,a,b)}):"string"===typeof e&&"string"===typeof d?A(e,d,a,b):p(a.bind(this,Error("Illegal arguments: "+ -typeof e+", "+typeof d)))}if(c){if("function"!==typeof c)throw Error("Illegal callback: "+typeof c);a(c)}else return new Promise(function(b,c){a(function(a,d){a?c(a):b(d)})})};k.compareSync=function(e,d){if("string"!==typeof e||"string"!==typeof d)throw Error("Illegal arguments: "+typeof e+", "+typeof d);return 60!==d.length?!1:r(k.hashSync(e,d.substr(0,d.length-31)),d)};k.compare=function(e,d,c,b){function a(a){"string"!==typeof e||"string"!==typeof d?p(a.bind(this,Error("Illegal arguments: "+typeof e+ -", "+typeof d))):60!==d.length?p(a.bind(this,null,!1)):k.hash(e,d.substr(0,29),function(b,c){b?a(b):a(null,r(c,d))},b)}if(c){if("function"!==typeof c)throw Error("Illegal callback: "+typeof c);a(c)}else return new Promise(function(b,c){a(function(a,d){a?c(a):b(d)})})};k.getRounds=function(e){if("string"!==typeof e)throw Error("Illegal arguments: "+typeof e);return parseInt(e.split("$")[2],10)};k.getSalt=function(e){if("string"!==typeof e)throw Error("Illegal arguments: "+typeof e);if(60!==e.length)throw Error("Illegal hash length: "+ -e.length+" != 60");return e.substring(0,29)};var p="undefined"!==typeof process&&process&&"function"===typeof process.nextTick?"function"===typeof setImmediate?setImmediate:process.nextTick:setTimeout,s="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),q=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12, -13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,-1,-1,-1,-1,-1],z=String.fromCharCode,I=function(){var e={MAX_CODEPOINT:1114111,encodeUTF8:function(d,c){var b=null;"number"===typeof d&&(b=d,d=function(){return null});for(;null!==b||null!==(b=d());)128>b?c(b&127):(2048>b?c(b>>6&31|192):(65536>b?c(b>>12&15|224):(c(b>>18&7|240),c(b>>12&63|128)),c(b>>6&63|128)),c(b&63|128)),b=null},decodeUTF8:function(d,c){for(var b, -a,f,e,k=function(a){a=a.slice(0,a.indexOf(null));var b=Error(a.toString());b.name="TruncatedError";b.bytes=a;throw b;};null!==(b=d());)if(0===(b&128))c(b);else if(192===(b&224))null===(a=d())&&k([b,a]),c((b&31)<<6|a&63);else if(224===(b&240))null!==(a=d())&&null!==(f=d())||k([b,a,f]),c((b&15)<<12|(a&63)<<6|f&63);else if(240===(b&248))null!==(a=d())&&null!==(f=d())&&null!==(e=d())||k([b,a,f,e]),c((b&7)<<18|(a&63)<<12|(f&63)<<6|e&63);else throw RangeError("Illegal starting byte: "+b);},UTF16toUTF8:function(d, -c){for(var b,a=null;null!==(b=null!==a?a:d());)55296<=b&&57343>=b&&null!==(a=d())&&56320<=a&&57343>=a?(c(1024*(b-55296)+a-56320+65536),a=null):c(b);null!==a&&c(a)},UTF8toUTF16:function(d,c){var b=null;"number"===typeof d&&(b=d,d=function(){return null});for(;null!==b||null!==(b=d());)65535>=b?c(b):(b-=65536,c((b>>10)+55296),c(b%1024+56320)),b=null},encodeUTF16toUTF8:function(d,c){e.UTF16toUTF8(d,function(b){e.encodeUTF8(b,c)})},decodeUTF8toUTF16:function(d,c){e.decodeUTF8(d,function(b){e.UTF8toUTF16(b, -c)})},calculateCodePoint:function(d){return 128>d?1:2048>d?2:65536>d?3:4},calculateUTF8:function(d){for(var c,b=0;null!==(c=d());)b+=e.calculateCodePoint(c);return b},calculateUTF16asUTF8:function(d){var c=0,b=0;e.UTF16toUTF8(d,function(a){++c;b+=e.calculateCodePoint(a)});return[c,b]}};return e}();Date.now=Date.now||function(){return+new Date};var F=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069, -3041331479,2450970073,2306472731],G=[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828, -289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486, -1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557, -442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592, -3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370, -48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946,1266315497,3048417604,3681880366,3289982499,290971E4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509, -1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880, -613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303, -2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385, -1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030, -4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055,3913112168, -2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499, -499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905, -3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651, -309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610, -1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037, -2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504,976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200, -2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241, -3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891, -3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409E3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588, -3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493, -1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462],E=[1332899944,1700884034,1701343084,1684370003,1668446532, -1869963892];k.encodeBase64=x;k.decodeBase64=B;return k}); +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,g,p){a!=Array.prototype&&a!=Object.prototype&&(a[g]=p.value)};$jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_"; +$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var a=0;return function(g){return $jscomp.SYMBOL_PREFIX+(g||"")+a++}}(); +$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var a=$jscomp.global.Symbol.iterator;a||(a=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&$jscomp.defineProperty(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(a){var g=0;return $jscomp.iteratorPrototype(function(){return g=k||k>n.length)throw Error("Illegal len: "+k);for(;a>2&63]);e=(e&3)<<4;if(a>=k){c.push(x[e&63]);break}var f=n[a++]&255;e|=f>>4&15;c.push(x[e&63]);e=(f&15)<<2;if(a>=k){c.push(x[e&63]);break}f=n[a++]&255;e|=f>>6&3;c.push(x[e&63]);c.push(x[f&63])}return c.join("")}function q(a,k){var n=0,c=a.length,e=0,f=[];if(0>= +k)throw Error("Illegal len: "+k);for(;n>>0;d|=(h&48)>>4;f.push(B(d));if(++e>=k||n>=c)break;d=a.charCodeAt(n++);b=d>>0;d|=(b&60)>>2;f.push(B(d));if(++e>=k||n>=c)break;d=a.charCodeAt(n++);h=d>>0;d|=h;f.push(B(d));++e}a=[];for(n=0;n>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[1];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[2];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[3];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[4];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[5];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[6];d=c[e>>>24];d+= +c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[7];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[8];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[9];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[10];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[11];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[12];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255]; +d+=c[768|e&255];f^=d^l[13];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[14];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[15];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[16];a[k]=f^l[17];a[k+1]=e;return a}function v(a,k){for(var n=0,c=0;4>n;++n)c=c<<8|a[k]&255,k=(k+1)%a.length;return{key:c,offp:k}}function b(a,k,l){for(var c=0,e=[0,0],f=k.length,d=l.length,n,b=0;bm;m++)for(p=0;p>1;p++)h(d,p<<1,q,y);g=[];for(m=0;m>24&255)>>>0),g.push((d[m]>>16&255)>>>0),g.push((d[m]>>8&255)>>>0),g.push((d[m]&255)>>>0);if(c){c(null,g);return}return g}c&&r(f)}var d=C.slice(),n=d.length;if(4>l||31>>0;var m=0,p;if(Int32Array){var q=new Int32Array(D);var y=new Int32Array(E)}else q=D.slice(),y=E.slice();A(k,a,q,y);if("undefined"!==typeof c)f();else for(;;)if("undefined"!==typeof(g=f()))return g||[]}function t(a,k,b,c){function e(a){var c=[];c.push("$2");"a"<=f&&c.push(f);c.push("$");10>l&&c.push("0");c.push(l.toString());c.push("$");c.push(p(h,h.length));c.push(p(a,4*C.length-1));return c.join("")}if("string"!==typeof a||"string"!==typeof k){c=Error("Invalid string / salt: Not a string"); +if(b){r(b.bind(this,c));return}throw c;}if("$"!==k.charAt(0)||"2"!==k.charAt(1)){c=Error("Invalid salt version: "+k.substring(0,2));if(b){r(b.bind(this,c));return}throw c;}if("$"===k.charAt(2)){var f=String.fromCharCode(0);var d=3}else{f=k.charAt(2);if("a"!==f&&"b"!==f&&"y"!==f||"$"!==k.charAt(3)){c=Error("Invalid salt revision: "+k.substring(2,4));if(b){r(b.bind(this,c));return}throw c;}d=4}if("$"b?b=4:31b&&k.push("0");k.push(b.toString());k.push("$");k.push(p(a(16), +16));return k.join("")};m.genSalt=function(a,b,g){function c(c){r(function(){try{c(null,m.genSaltSync(a))}catch(f){c(f)}})}"function"===typeof b&&(g=b,b=void 0);"function"===typeof a&&(g=a,a=void 0);if("undefined"===typeof a)a=10;else if("number"!==typeof a)throw Error("illegal arguments: "+typeof a);if(g){if("function"!==typeof g)throw Error("Illegal callback: "+typeof g);c(g)}else return new Promise(function(a,b){c(function(c,f){c?b(c):a(f)})})};m.hashSync=function(a,b){"undefined"===typeof b&& +(b=10);"number"===typeof b&&(b=m.genSaltSync(b));if("string"!==typeof a||"string"!==typeof b)throw Error("Illegal arguments: "+typeof a+", "+typeof b);return t(a,b)};m.hash=function(a,b,g,c){function e(f){"string"===typeof a&&"number"===typeof b?m.genSalt(b,function(b,e){t(a,e,f,c)}):"string"===typeof a&&"string"===typeof b?t(a,b,f,c):r(f.bind(this,Error("Illegal arguments: "+typeof a+", "+typeof b)))}if(g){if("function"!==typeof g)throw Error("Illegal callback: "+typeof g);e(g)}else return new Promise(function(a, +c){e(function(b,d){b?c(b):a(d)})})};m.compareSync=function(a,b){if("string"!==typeof a||"string"!==typeof b)throw Error("Illegal arguments: "+typeof a+", "+typeof b);return 60!==b.length?!1:g(m.hashSync(a,b.substr(0,b.length-31)),b)};m.compare=function(a,b,h,c){function e(f){"string"!==typeof a||"string"!==typeof b?r(f.bind(this,Error("Illegal arguments: "+typeof a+", "+typeof b))):60!==b.length?r(f.bind(this,null,!1)):m.hash(a,b.substr(0,29),function(a,c){a?f(a):f(null,g(c,b))},c)}if(h){if("function"!== +typeof h)throw Error("Illegal callback: "+typeof h);e(h)}else return new Promise(function(a,c){e(function(b,d){b?c(b):a(d)})})};m.getRounds=function(a){if("string"!==typeof a)throw Error("Illegal arguments: "+typeof a);return parseInt(a.split("$")[2],10)};m.getSalt=function(a){if("string"!==typeof a)throw Error("Illegal arguments: "+typeof a);if(60!==a.length)throw Error("Illegal hash length: "+a.length+" != 60");return a.substring(0,29)};var r="undefined"!==typeof process&&process&&"function"=== +typeof process.nextTick?"function"===typeof setImmediate?setImmediate:process.nextTick:setTimeout,F=function(a){var b=0,g;var c=Array;for(var e=0,f,d=0;df?e+=1:2048>f?e+=2:55296===(f&64512)&&56320===(a.charCodeAt(d+1)&64512)?(++d,e+=4):e+=3;e=new c(e);f=0;for(d=a.length;fc?e[b++]=c:(2048>c?e[b++]=c>>6|192:(55296===(c&64512)&&56320===((g=a.charCodeAt(f+1))&64512)?(c=65536+((c&1023)<<10)+(g&1023),++f,e[b++]=c>>18|240,e[b++]=c>>12&63|128): +e[b++]=c>>12|224,e[b++]=c>>6&63|128),e[b++]=c&63|128);return e},x="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),u=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52, +53,-1,-1,-1,-1,-1],B=String.fromCharCode;Date.now=Date.now||function(){return+new Date};var D=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],E=[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518, +2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850, +3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683, +2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616, +3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313, +375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946, +1266315497,3048417604,3681880366,3289982499,290971E4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528, +3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465, +1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079, +3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896, +1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597, +1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055,3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625, +3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970, +69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669, +3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236, +3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074, +2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504,976866871,3556439503,2881648439,1522871579,1555064734, +1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357, +993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658, +2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409E3,2509781533,112762804,3463356488,1866414978,891333506, +18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953, +1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296, +2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462],C=[1332899944,1700884034,1701343084,1684370003,1668446532,1869963892];m.encodeBase64=p;m.decodeBase64=q;return m}); diff --git a/dist/bcrypt.min.js.gz b/dist/bcrypt.min.js.gz index 6bde4bde53a58f73d813ca1143452f52f3dfd122..ed69e722fa489c8a4e81b3be6d6be023b6d33244 100644 GIT binary patch literal 10622 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 Y#qWRLH~;bHKYsfB1*L7~5glXz0RGpoEdT%j literal 9443 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 diff --git a/dist/bcrypt.min.map b/dist/bcrypt.min.map index 35d0f83..501bac5 100644 --- a/dist/bcrypt.min.map +++ b/dist/bcrypt.min.map @@ -1,8 +1,8 @@ { "version":3, "file":"", -"lineCount":48, -"mappings":"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", -"sources":["dist/bcrypt.js"], -"names":["global","factory","define","require","module","random","len","e","a","self","Uint32Array","Array","prototype","slice","call","randomFallback","Error","safeStringCompare","known","unknown","right","wrong","i","k","length","charCodeAt","stringToBytes","str","out","utfx","encodeUTF16toUTF8","b","push","base64_encode","off","rs","c1","c2","BASE64_CODE","join","base64_decode","s","slen","olen","o","code","BASE64_INDEX","stringFromCharCode","c3","c4","res","_encipher","lr","P","S","n","l","r","_streamtoword","data","offp","word","key","_key","offset","plen","sw","_ekskey","_crypt","salt","rounds","callback","progressCallback","next","start","Date","now","MAX_EXECUTION_TIME","j","clen","cdata","ret","nextTick","C_ORIG","err","bind","BCRYPT_SALT_LEN","Int32Array","P_ORIG","S_ORIG","_hash","finish","bytes","minor","toString","saltb","charAt","substring","String","fromCharCode","r1","parseInt","r2","real_salt","passwordb","bcrypt","setRandomFallback","bcrypt.setRandomFallback","genSaltSync","bcrypt.genSaltSync","seed_length","GENSALT_DEFAULT_LOG2_ROUNDS","genSalt","bcrypt.genSalt","_async","undefined","Promise","resolve","reject","hashSync","bcrypt.hashSync","hash","bcrypt.hash","compareSync","bcrypt.compareSync","substr","compare","bcrypt.compare","comp","getRounds","bcrypt.getRounds","split","getSalt","bcrypt.getSalt","process","setImmediate","setTimeout","utfx.encodeUTF8","src","dst","cp","utfx.decodeUTF8","c","d","fail","indexOf","name","RangeError","utfx.UTF16toUTF8","utfx.UTF8toUTF16","utfx.encodeUTF16toUTF8","UTF16toUTF8","encodeUTF8","utfx.decodeUTF8toUTF16","decodeUTF8","UTF8toUTF16","utfx.calculateCodePoint","utfx.calculateUTF8","calculateCodePoint","utfx.calculateUTF16asUTF8","encodeBase64","decodeBase64"] +"lineCount":57, +"mappings":"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", +"sources":[" [synthetic:base] "," [synthetic:util/defines] "," [synthetic:util/defineproperty] "," [synthetic:util/global] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:util/polyfill] "," [synthetic:es6/promise] ","dist/bcrypt.js"], +"names":["global","factory","define","require","module","random","len","e","a","self","Uint32Array","Array","prototype","slice","call","randomFallback","Error","safeStringCompare","known","unknown","diff","length","i","charCodeAt","base64_encode","b","off","rs","c1","push","BASE64_CODE","c2","join","base64_decode","s","slen","olen","code","BASE64_INDEX","o","stringFromCharCode","c3","c4","res","_encipher","lr","P","S","l","r","n","_streamtoword","data","offp","word","key","_key","offset","plen","sw","_ekskey","_crypt","salt","rounds","callback","progressCallback","next","start","Date","now","MAX_EXECUTION_TIME","j","clen","cdata","ret","nextTick","C_ORIG","err","bind","BCRYPT_SALT_LEN","Int32Array","P_ORIG","S_ORIG","_hash","finish","bytes","minor","toString","saltb","charAt","substring","String","fromCharCode","r1","parseInt","r2","real_salt","passwordb","stringToBytes","bcrypt","setRandomFallback","bcrypt.setRandomFallback","genSaltSync","bcrypt.genSaltSync","seed_length","GENSALT_DEFAULT_LOG2_ROUNDS","genSalt","bcrypt.genSalt","_async","undefined","Promise","resolve","reject","hashSync","bcrypt.hashSync","hash","bcrypt.hash","compareSync","bcrypt.compareSync","substr","compare","bcrypt.compare","comp","getRounds","bcrypt.getRounds","split","getSalt","bcrypt.getSalt","process","setImmediate","setTimeout","utf8Array","string","c","buffer","k","encodeBase64","decodeBase64"] } diff --git a/package.json b/package.json index bba1b33..8b6d9fe 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,10 @@ "browser": "dist/bcrypt.js", "dependencies": {}, "devDependencies": { - "testjs": "~1", - "closurecompiler": "~1", - "metascript": "~0.18", "bcrypt": "latest", - "utfx": "~1" + "closurecompiler": "~1", + "metascript": "~1.0.0", + "testjs": "~1" }, "license": "MIT", "scripts": { diff --git a/src/bcrypt.js b/src/bcrypt.js index bd043df..d9c0492 100644 --- a/src/bcrypt.js +++ b/src/bcrypt.js @@ -66,7 +66,6 @@ bcrypt.setRandomFallback = function(random) { * @param {number=} seed_length Not supported. * @returns {string} Resulting salt * @throws {Error} If a random fallback is required but not set - * @expose */ bcrypt.genSaltSync = function(rounds, seed_length) { rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; @@ -93,7 +92,6 @@ bcrypt.genSaltSync = function(rounds, seed_length) { * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function - * @expose */ bcrypt.genSalt = function(rounds, seed_length, callback) { if (typeof seed_length === 'function') @@ -138,7 +136,6 @@ bcrypt.genSalt = function(rounds, seed_length, callback) { * @param {string} s String to hash * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 * @returns {string} Resulting hash - * @expose */ bcrypt.hashSync = function(s, salt) { if (typeof salt === 'undefined') @@ -159,7 +156,6 @@ bcrypt.hashSync = function(s, salt) { * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function - * @expose */ bcrypt.hash = function(s, salt, callback, progressCallback) { @@ -199,7 +195,7 @@ bcrypt.hash = function(s, salt, callback, progressCallback) { */ function safeStringCompare(known, unknown) { var diff = known.length ^ unknown.length; - for (var i=0, i} b Byte array * @param {number} len Maximum input length * @returns {string} - * @expose */ bcrypt.encodeBase64 = base64_encode; @@ -315,6 +306,5 @@ bcrypt.encodeBase64 = base64_encode; * @param {string} s String to decode * @param {number} len Maximum output length * @returns {!Array.} - * @expose */ bcrypt.decodeBase64 = base64_decode; diff --git a/src/bcrypt/util.js b/src/bcrypt/util.js index a149f71..28b82e9 100644 --- a/src/bcrypt/util.js +++ b/src/bcrypt/util.js @@ -8,26 +8,17 @@ var nextTick = typeof process !== 'undefined' && process && typeof process.nextT ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick) : setTimeout; +//? include("util/utf8.js"); + /** * Converts a JavaScript string to UTF8 bytes. + * @function * @param {string} str String * @returns {!Array.} UTF8 bytes * @inner */ -function stringToBytes(str) { - var out = [], - i = 0; - utfx.encodeUTF16toUTF8(function() { - if (i >= str.length) return null; - return str.charCodeAt(i++); - }, function(b) { - out.push(b); - }); - return out; -} +var stringToBytes = utf8Array; //? include("util/base64.js"); -//? include("../../node_modules/utfx/dist/utfx-embeddable.js"); - -Date.now = Date.now || function() { return +new Date; }; +Date.now = Date.now || function() { return +new Date; }; diff --git a/src/bcrypt/util/utf8.js b/src/bcrypt/util/utf8.js new file mode 100644 index 0000000..c2090e4 --- /dev/null +++ b/src/bcrypt/util/utf8.js @@ -0,0 +1,52 @@ +/** Calculates the byte length of a string encoded as UTF8. */ +function utf8Length(string) { + var len = 0, + c = 0; + for (var i = 0; i < string.length; ++i) { + c = string.charCodeAt(i); + if (c < 128) + len += 1; + else if (c < 2048) + len += 2; + else if ( + (c & 0xFC00) === 0xD800 && + (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00 + ) { + ++i; + len += 4; + } else + len += 3; + } + return len; +} + +/** Converts a string to an array of UTF8 bytes. */ +function utf8Array(string) { + var offset = 0, + c1, c2; + var buffer = new Array(utf8Length(string)); + for (var i = 0, k = string.length; i < k; ++i) { + c1 = string.charCodeAt(i); + if (c1 < 128) { + buffer[offset++] = c1; + } else if (c1 < 2048) { + buffer[offset++] = c1 >> 6 | 192; + buffer[offset++] = c1 & 63 | 128; + } else if ( + ( c1 & 0xFC00) === 0xD800 && + ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00 + ) { + c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); + ++i; + buffer[offset++] = c1 >> 18 | 240; + buffer[offset++] = c1 >> 12 & 63 | 128; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } else { + buffer[offset++] = c1 >> 12 | 224; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } + } + return buffer; +} From 684fac6814a81d974c805a15e22fd69922c7ca6e Mon Sep 17 00:00:00 2001 From: dcodeIO Date: Mon, 5 Mar 2018 19:26:00 +0100 Subject: [PATCH 05/25] Make sure the bin script uses LF --- .gitattributes | 1 + bin/bcrypt | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9be2ab2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +bin/bcrypt text eol=lf diff --git a/bin/bcrypt b/bin/bcrypt index 4cfc9d9..e7c2ea0 100644 --- a/bin/bcrypt +++ b/bin/bcrypt @@ -1,25 +1,27 @@ #!/usr/bin/env node var path = require("path"), - bcrypt = require(path.join(__dirname, '..', 'index.js')), - pkg = require(path.join(__dirname, '..', 'package.json')); + bcrypt = require("../index.js"), + pkg = require("../package.json"); if (process.argv.length < 3) { - process.stderr.write([ // No dependencies, so we do it from hand. + process.stderr.write([ "", " |_ _ _ _ |_", - " |_)(_| \\/|_)|_ v"+pkg['version']+" (c) "+pkg['author'], + " |_)(_| \\/|_)|_.js v" + pkg['version'], " / | " - ].join('\n')+'\n\n'+" Usage: "+path.basename(process.argv[1])+" [rounds|salt]\n"); + ].join('\n')+'\n\n'+" Usage: " + path.basename(process.argv[1]) + " [rounds|salt]\n"); process.exit(1); } else { var salt; if (process.argv.length > 3) { salt = process.argv[3]; var rounds = parseInt(salt, 10); - if (rounds == salt) + if (rounds == salt) { salt = bcrypt.genSaltSync(rounds); - } else + } + } else { salt = bcrypt.genSaltSync(); - process.stdout.write(bcrypt.hashSync(process.argv[2], salt)+"\n"); + } + process.stdout.write(bcrypt.hashSync(process.argv[2], salt) + "\n"); } From 7e2e93af99df2952253f9cf32db29aefa8f272f7 Mon Sep 17 00:00:00 2001 From: Md Hishaam Akhtar <58990970+mdhishaamakhtar@users.noreply.github.com> Date: Fri, 4 Dec 2020 18:31:07 +0530 Subject: [PATCH 06/25] Added externs to .npmignore (#124) The npm package does not need externs as it is needed only for closure compiler. Added it in .npmignore since bcryptjs overrides global module and process in WebStorm IDE. --- .npmignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmignore b/.npmignore index e14a574..c48b15c 100644 --- a/.npmignore +++ b/.npmignore @@ -4,3 +4,4 @@ debug.log doco/ tests/bench.js *.png +externs From 2f45985738604c743c4b8cc8464e3e7d3e04c73d Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 18:39:17 +0100 Subject: [PATCH 07/25] Modernize project structure BREAKING CHANGE: The project now exports an ECMAScript module by default, albeit with an UMD fallback, ships with types, the dist/ directory no longer exists in version control, and Closure Compiler externs have been removed. --- .github/FUNDING.yml | 1 + .github/workflows/publish.yml | 33 + .github/workflows/test.yml | 25 + .gitignore | 5 +- .npmignore | 7 - .travis.yml | 18 - .vscode/settings.json | 3 - LICENSE | 27 +- README.md | 278 ++--- bcrypt.png | Bin 3340 -> 0 bytes bin/bcrypt | 14 +- bower.json | 22 - dist/README.md | 15 - dist/bcrypt.js | 1209 --------------------- dist/bcrypt.min.js | 57 - dist/bcrypt.min.js.gz | Bin 10622 -> 0 bytes dist/bcrypt.min.map | 8 - donate.png | Bin 1553 -> 0 bytes externs/bcrypt.js | 91 -- externs/minimal-env.js | 98 -- index.d.ts | 3 + index.js | 1157 +++++++++++++++++++- package-lock.json | 1292 +++++++++++++++++++++++ package.json | 52 +- scripts/build.js | 37 - src/bcrypt.js | 310 ------ src/bcrypt/impl.js | 669 ------------ src/bcrypt/prng/README.md | 5 - src/bcrypt/prng/accum.js | 133 --- src/bcrypt/prng/isaac.js | 140 --- src/bcrypt/util.js | 24 - src/bcrypt/util/base64.js | 115 -- src/bcrypt/util/utf8.js | 52 - src/bower.json.template | 22 - src/wrap.js | 50 - tests/bench.js | 9 +- tests/index.js | 189 ++++ tests/suite.js | 197 ---- tests/typescript/test-import.ts | 6 + tests/typescript/test-require.ts | 5 + tests/typescript/tsconfig.base.json | 6 + tests/typescript/tsconfig.commonjs.json | 8 + tests/typescript/tsconfig.esnext.json | 7 + tests/typescript/tsconfig.json | 3 + tests/typescript/tsconfig.nodenext.json | 8 + types.d.ts | 150 +++ umd/index.d.ts | 2 + umd/package.json | 3 + 48 files changed, 3046 insertions(+), 3519 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/test.yml delete mode 100644 .npmignore delete mode 100644 .travis.yml delete mode 100644 .vscode/settings.json delete mode 100644 bcrypt.png delete mode 100644 bower.json delete mode 100644 dist/README.md delete mode 100644 dist/bcrypt.js delete mode 100644 dist/bcrypt.min.js delete mode 100644 dist/bcrypt.min.js.gz delete mode 100644 dist/bcrypt.min.map delete mode 100644 donate.png delete mode 100644 externs/bcrypt.js delete mode 100644 externs/minimal-env.js create mode 100644 index.d.ts create mode 100644 package-lock.json delete mode 100644 scripts/build.js delete mode 100644 src/bcrypt.js delete mode 100644 src/bcrypt/impl.js delete mode 100644 src/bcrypt/prng/README.md delete mode 100644 src/bcrypt/prng/accum.js delete mode 100644 src/bcrypt/prng/isaac.js delete mode 100644 src/bcrypt/util.js delete mode 100644 src/bcrypt/util/base64.js delete mode 100644 src/bcrypt/util/utf8.js delete mode 100644 src/bower.json.template delete mode 100644 src/wrap.js create mode 100644 tests/index.js delete mode 100644 tests/suite.js create mode 100644 tests/typescript/test-import.ts create mode 100644 tests/typescript/test-require.ts create mode 100644 tests/typescript/tsconfig.base.json create mode 100644 tests/typescript/tsconfig.commonjs.json create mode 100644 tests/typescript/tsconfig.esnext.json create mode 100644 tests/typescript/tsconfig.json create mode 100644 tests/typescript/tsconfig.nodenext.json create mode 100644 types.d.ts create mode 100644 umd/index.d.ts create mode 100644 umd/package.json diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..bab062f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: dcodeIO diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..3d3a5ca --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,33 @@ +name: Publish +on: + workflow_dispatch: +jobs: + publish: + name: Publish + if: github.repository == 'dcodeIO/bcrypt.js' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: master + - uses: actions/setup-node@v4 + with: + node-version: current + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build + - name: Run tests + run: npm test + - name: Publish + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + VERSION=$(npx aspublish --version) + if [ -z "$VERSION" ]; then + echo "Changes do not trigger a release" + else + echo "Publishing new version: $VERSION" + npx aspublish + fi diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..b98fcad --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,25 @@ +name: Test +on: + push: + branches: + - master + pull_request: + workflow_dispatch: +jobs: + test: + name: Test + runs-on: ubuntu-latest + strategy: + matrix: + node_version: ["current", "lts_latest"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + - name: Install dependencies + run: npm ci --no-audit + - name: Build + run: npm run build + - name: Run tests + run: npm test diff --git a/.gitignore b/.gitignore index 2383109..d838984 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules/ -npm-debug.log -debug.log -doco/ +npm-debug.* +umd/index.js diff --git a/.npmignore b/.npmignore deleted file mode 100644 index c48b15c..0000000 --- a/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -node_modules/ -npm-debug.log -debug.log -doco/ -tests/bench.js -*.png -externs diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index e2ed92d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: node_js - -node_js: - - 0.10 - - 0.12 - - 4 - - 6 - -before_script: npm -g install testjs - -env: - - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0c4a669..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "vsicons.presets.angular": false -} \ No newline at end of file diff --git a/LICENSE b/LICENSE index 3f6395f..6ffc6d9 100644 --- a/LICENSE +++ b/LICENSE @@ -2,8 +2,8 @@ bcrypt.js --------- Copyright (c) 2012 Nevins Bartolomeo Copyright (c) 2012 Shane Girish -Copyright (c) 2014 Daniel Wirtz - +Copyright (c) 2025 Daniel Wirtz + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -25,26 +25,3 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -isaac.js --------- -Copyright (c) 2012 Yves-Marie K. Rinquin - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 3fd7517..eb24684 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ bcrypt.js ========= + Optimized bcrypt in JavaScript with zero dependencies. Compatible to the C++ [bcrypt](https://npmjs.org/package/bcrypt) binding on node.js and also working in the browser. -build static donate ❤ - +[![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/test.yml?branch=master&label=test&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/publish.yml?branch=master&label=publish&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/bcryptjs.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/bcryptjs) Security considerations ----------------------- + Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power. ([see](http://en.wikipedia.org/wiki/Bcrypt)) @@ -20,232 +21,155 @@ hashes is 60 characters. Usage ----- -The library is compatible with CommonJS and AMD loaders and is exposed globally as `dcodeIO.bcrypt` if neither is -available. -### node.js +The package exports an ECMAScript module with an UMD fallback. -On node.js, the inbuilt [crypto module](http://nodejs.org/api/crypto.html)'s randomBytes interface is used to obtain -secure random numbers. - -`npm install bcryptjs` - -```js -var bcrypt = require('bcryptjs'); -... +``` +$> npm install bcryptjs ``` -### Browser +```ts +import bcrypt from 'bcryptjs' +``` -In the browser, bcrypt.js relies on [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI)'s getRandomValues -interface to obtain secure random numbers. If no cryptographically secure source of randomness is available, you may -specify one through [bcrypt.setRandomFallback](https://github.com/dcodeIO/bcrypt.js#setrandomfallbackrandom). +### Usage with a CDN -```js -var bcrypt = dcodeIO.bcrypt; -... -``` +* From GitHub via [jsDelivr](https://www.jsdelivr.com):
+ `https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js@TAG/index.js` (ESM) +* From npm via [jsDelivr](https://www.jsdelivr.com):
+ `https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/index.js` (ESM)
+ `https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/umd/index.js` (UMD) +* From npm via [unpkg](https://unpkg.com):
+ `https://unpkg.com/bcryptjs@VERSION/index.js` (ESM)
+ `https://unpkg.com/bcryptjs@VERSION/umd/index.js` (UMD) -or +Replace `TAG` respectively `VERSION` with a [specific version](https://github.com/dcodeIO/bcrypt.js/releases) or omit it (not recommended in production) to use latest. -```js -require.config({ - paths: { "bcrypt": "/path/to/bcrypt.js" } -}); -require(["bcrypt"], function(bcrypt) { - ... -}); -``` +### Usage - Sync -Usage - Sync ------------- To hash a password: -```javascript -var bcrypt = require('bcryptjs'); -var salt = bcrypt.genSaltSync(10); -var hash = bcrypt.hashSync("B4c0/\/", salt); -// Store hash in your password DB. +```ts +const salt = bcrypt.genSaltSync(10) +const hash = bcrypt.hashSync('B4c0/\/', salt) +// Store hash in your password DB ``` -To check a password: +To check a password: -```javascript -// Load hash from your password DB. -bcrypt.compareSync("B4c0/\/", hash); // true -bcrypt.compareSync("not_bacon", hash); // false +```ts +// Load hash from your password DB +bcrypt.compareSync('B4c0/\/', hash) // true +bcrypt.compareSync('not_bacon', hash) // false ``` Auto-gen a salt and hash: -```javascript -var hash = bcrypt.hashSync('bacon', 8); +```ts +const hash = bcrypt.hashSync('bacon', 10) ``` -Usage - Async -------------- -To hash a password: +### Usage - Async -```javascript -var bcrypt = require('bcryptjs'); -bcrypt.genSalt(10, function(err, salt) { - bcrypt.hash("B4c0/\/", salt, function(err, hash) { - // Store hash in your password DB. - }); -}); +To hash a password: + +```ts +const salt = await bcrypt.genSalt(10) +const hash = await bcrypt.hash('B4c0/\/', salt) +// Store hash in your password DB +``` + +```ts +bcrypt.genSalt(10, (err, salt) => { + bcrypt.hash('B4c0/\/', salt, function(err, hash) { + // Store hash in your password DB + }) +}) ``` To check a password: -```javascript -// Load hash from your password DB. -bcrypt.compare("B4c0/\/", hash, function(err, res) { - // res === true -}); -bcrypt.compare("not_bacon", hash, function(err, res) { - // res === false -}); +```ts +// Load hash from your password DB +await bcrypt.compare('B4c0/\/', hash) // true +await bcrypt.compare('not_bacon', hash) // false +``` -// As of bcryptjs 2.4.0, compare returns a promise if callback is omitted: -bcrypt.compare("B4c0/\/", hash).then((res) => { +```ts +// Load hash from your password DB +bcrypt.compare('B4c0/\/', hash, (err, res) => { // res === true -}); +}) +bcrypt.compare('not_bacon', hash, (err, res) => { + // res === false +}) ``` Auto-gen a salt and hash: -```javascript -bcrypt.hash('bacon', 8, function(err, hash) { -}); +```ts +await bcrypt.hash('B4c0/\/', 10) +// Store hash in your password DB ``` -**Note:** Under the hood, asynchronisation splits a crypto operation into small chunks. After the completion of a chunk, the execution of the next chunk is placed on the back of [JS event loop queue](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop), thus efficiently sharing the computational resources with the other operations in the queue. - -API ---- -### setRandomFallback(random) - -Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto -API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is -seeded properly! - -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| random | *function(number):!Array.<number>* | Function taking the number of bytes to generate as its sole argument, returning the corresponding array of cryptographically secure random byte values. -| **@see** | | http://nodejs.org/api/crypto.html -| **@see** | | http://www.w3.org/TR/WebCryptoAPI/ - -**Hint:** You might use [isaac.js](https://github.com/rubycon/isaac.js) as a CSPRNG but you still have to make sure to -seed it properly. - -### genSaltSync(rounds=, seed_length=) - -Synchronously generates a salt. - -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| rounds | *number* | Number of rounds to use, defaults to 10 if omitted -| seed_length | *number* | Not supported. -| **@returns** | *string* | Resulting salt -| **@throws** | *Error* | If a random fallback is required but not set - -### genSalt(rounds=, seed_length=, callback) - -Asynchronously generates a salt. - -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| rounds | *number | function(Error, string=)* | Number of rounds to use, defaults to 10 if omitted -| seed_length | *number | function(Error, string=)* | Not supported. -| callback | *function(Error, string=)* | Callback receiving the error, if any, and the resulting salt -| **@returns** | *Promise* | If `callback` has been omitted -| **@throws** | *Error* | If `callback` is present but not a function - -### hashSync(s, salt=) - -Synchronously generates a hash for the given string. - -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| s | *string* | String to hash -| salt | *number | string* | Salt length to generate or salt to use, default to 10 -| **@returns** | *string* | Resulting hash - -### hash(s, salt, callback, progressCallback=) - -Asynchronously generates a hash for the given string. +```ts +bcrypt.hash('B4c0/\/', 10, (err, hash) => { + // Store hash in your password DB +}) +``` -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| s | *string* | String to hash -| salt | *number | string* | Salt length to generate or salt to use -| callback | *function(Error, string=)* | Callback receiving the error, if any, and the resulting hash -| progressCallback | *function(number)* | Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. -| **@returns** | *Promise* | If `callback` has been omitted -| **@throws** | *Error* | If `callback` is present but not a function +**Note:** Under the hood, asynchronous APIs split an operation into small chunks. After the completion of a chunk, the execution of the next chunk is placed on the back of the [JS event queue](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop), efficiently yielding for other computation to execute. -### compareSync(s, hash) +### Usage - Command Line -Synchronously tests a string against a hash. +``` +Usage: bcrypt [rounds|salt] +``` -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| s | *string* | String to compare -| hash | *string* | Hash to test against -| **@returns** | *boolean* | true if matching, otherwise false -| **@throws** | *Error* | If an argument is illegal +API +--- -### compare(s, hash, callback, progressCallback=) +### Callback types -Asynchronously compares the given data against the given hash. +* type **Callback<`T`>**: `(err: Error | null, result?: T) => void` -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| s | *string* | Data to compare -| hash | *string* | Data to be compared to -| callback | *function(Error, boolean)* | Callback receiving the error, if any, otherwise the result -| progressCallback | *function(number)* | Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. -| **@returns** | *Promise* | If `callback` has been omitted -| **@throws** | *Error* | If `callback` is present but not a function +* type **ProgressCallback**: `(percentage: number) => void` -### getRounds(hash) +### Functions -Gets the number of rounds used to encrypt the specified hash. +* bcrypt.**setRandomFallback**(random: `(length: number) => number[]`): `void`
+ Sets the pseudo random number generator to use as a fallback if neither Node's [crypto](http://nodejs.org/api/crypto.html) module nor the [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| hash | *string* | Hash to extract the used number of rounds from -| **@returns** | *number* | Number of rounds used -| **@throws** | *Error* | If `hash` is not a string +* bcrypt.**genSaltSync**(rounds?: `number`): `string`
+ Synchronously generates a salt. Number of rounds defaults to 10 when omitted. -### getSalt(hash) +* bcrypt.**genSalt**(rounds?: `number`): `Promise`
+ bcrypt.**genSalt**(rounds: `number`, callback: `Callback`): `void`
+ bcrypt.**genSalt**(callback: `Callback`): `void`
+ Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. -Gets the salt portion from a hash. Does not validate the hash. +* bcrypt.**hashSync**(s: `string`, salt?: `number | string`): `string` + Synchronously generates a hash for the given string. Number of rounds defaults to 10 when omitted. -| Parameter | Type | Description -|-----------------|-----------------|--------------- -| hash | *string* | Hash to extract the salt from -| **@returns** | *string* | Extracted salt part -| **@throws** | *Error* | If `hash` is not a string or otherwise invalid +* bcrypt.**hash**(s: `string`, salt: `number | string`): `Promise`
+ bcrypt.**hash**(s: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
+ Asynchronously generates a hash for the given string. Optionally calls a progress callback with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. +* bcrypt.**compareSync**(s: `string`, hash: `string`): `boolean`
+ Synchronously tests a string against a hash. -Command line ------------- -`Usage: bcrypt [salt]` +* bcrypt.**compare**(s: `string`, hash: `string`): `Promise`
+ bcrypt.**compare**(s: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
+ Asynchronously compares a string against a hash. Optionally calls a progress callback with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. -If the input has spaces inside, simply surround it with quotes. +* bcrypt.**getRounds**(hash: `string`): `number`
+ Gets the number of rounds used to encrypt the specified hash. -Downloads ---------- -* [Distributions](https://github.com/dcodeIO/bcrypt.js/tree/master/dist) -* [ZIP-Archive](https://github.com/dcodeIO/bcrypt.js/archive/master.zip) -* [Tarball](https://github.com/dcodeIO/bcrypt.js/tarball/master) +* bcrypt.**getSalt**(hash: `string`): `string`
+ Gets the salt portion from a hash. Does not validate the hash. Credits ------- -Based on work started by Shane Girish at [bcrypt-nodejs](https://github.com/shaneGirish/bcrypt-nodejs) (MIT-licensed), -which is itself based on [javascript-bcrypt](http://code.google.com/p/javascript-bcrypt/) (New BSD-licensed). -License -------- -New-BSD / MIT ([see](https://github.com/dcodeIO/bcrypt.js/blob/master/LICENSE)) +Based on work started by Shane Girish at [bcrypt-nodejs](https://github.com/shaneGirish/bcrypt-nodejs), which is itself +based on [javascript-bcrypt](http://code.google.com/p/javascript-bcrypt/) (New BSD-licensed). diff --git a/bcrypt.png b/bcrypt.png deleted file mode 100644 index 303025052fe8802ccc8373cead9832806364e7cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3340 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 [rounds|salt]\n"); + console.log("Usage: " + path.basename(process.argv[1]) + " [rounds|salt]"); process.exit(1); } else { var salt; @@ -23,5 +17,5 @@ if (process.argv.length < 3) { } else { salt = bcrypt.genSaltSync(); } - process.stdout.write(bcrypt.hashSync(process.argv[2], salt) + "\n"); + console.log(bcrypt.hashSync(process.argv[2], salt)); } diff --git a/bower.json b/bower.json deleted file mode 100644 index 1ea9a98..0000000 --- a/bower.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "bcryptjs", - "description": "Optimized bcrypt in plain JavaScript with zero dependencies.", - "version": "2.4.4", - "main": "dist/bcrypt.min.js", - "license": "New-BSD", - "homepage": "http://dcode.io/", - "repository": { - "type": "git", - "url": "git://github.com/dcodeIO/bcrypt.js.git" - }, - "keywords": ["bcrypt", "password", "auth", "authentication", "encryption", "crypt", "crypto"], - "dependencies": {}, - "devDependencies": {}, - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/dist/README.md b/dist/README.md deleted file mode 100644 index 4020f45..0000000 --- a/dist/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Distributions -============= -bcrypt.js is available as the following distributions: - -* **[bcrypt.js](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.js)** - contains the commented source code. - -* **[bcrypt.min.js](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.min.js)** - has been compiled with Closure Compiler using advanced optimizations. - -* **[bcrypt.min.map](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.min.map)** - contains the source map generated by Closure Compiler. - -* **[bcrypt.min.js.gz](https://github.com/dcodeIO/bcrypt.js/blob/master/dist/bcrypt.min.js.gz)** - has also been gzipped using `-9`. diff --git a/dist/bcrypt.js b/dist/bcrypt.js deleted file mode 100644 index 87c7155..0000000 --- a/dist/bcrypt.js +++ /dev/null @@ -1,1209 +0,0 @@ -/* - Copyright (c) 2012 Nevins Bartolomeo - Copyright (c) 2012 Shane Girish - Copyright (c) 2014 Daniel Wirtz - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @license bcrypt.js (c) 2013 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/bcrypt.js for details - */ -(function(global, factory) { - - /* AMD */ if (typeof define === 'function' && define["amd"]) - define([], factory); - /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) - module["exports"] = factory(); - /* Global */ else - (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory(); - -}(this, function() { - "use strict"; - - /** - * bcrypt namespace. - * @type {Object.} - */ - var bcrypt = {}; - - /** - * The random implementation to use as a fallback. - * @type {?function(number):!Array.} - * @inner - */ - var randomFallback = null; - - /** - * Generates cryptographically secure random bytes. - * @function - * @param {number} len Bytes length - * @returns {!Array.} Random bytes - * @throws {Error} If no random implementation is available - * @inner - */ - function random(len) { - /* node */ if (typeof module !== 'undefined' && module && module['exports']) - try { - return require("crypto")['randomBytes'](len); - } catch (e) {} - /* WCA */ try { - var a; (self['crypto']||self['msCrypto'])['getRandomValues'](a = new Uint32Array(len)); - return Array.prototype.slice.call(a); - } catch (e) {} - /* fallback */ if (!randomFallback) - throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); - return randomFallback(len); - } - - // Test if any secure randomness source is available - var randomAvailable = false; - try { - random(1); - randomAvailable = true; - } catch (e) {} - - // Default fallback, if any - randomFallback = null; - /** - * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto - * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it - * is seeded properly! - * @param {?function(number):!Array.} random Function taking the number of bytes to generate as its - * sole argument, returning the corresponding array of cryptographically secure random byte values. - * @see http://nodejs.org/api/crypto.html - * @see http://www.w3.org/TR/WebCryptoAPI/ - */ - bcrypt.setRandomFallback = function(random) { - randomFallback = random; - }; - - /** - * Synchronously generates a salt. - * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted - * @param {number=} seed_length Not supported. - * @returns {string} Resulting salt - * @throws {Error} If a random fallback is required but not set - */ - bcrypt.genSaltSync = function(rounds, seed_length) { - rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof rounds !== 'number') - throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length)); - if (rounds < 4) - rounds = 4; - else if (rounds > 31) - rounds = 31; - var salt = []; - salt.push("$2a$"); - if (rounds < 10) - salt.push("0"); - salt.push(rounds.toString()); - salt.push('$'); - salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw - return salt.join(''); - }; - - /** - * Asynchronously generates a salt. - * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted - * @param {(number|function(Error, string=))=} seed_length Not supported. - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - */ - bcrypt.genSalt = function(rounds, seed_length, callback) { - if (typeof seed_length === 'function') - callback = seed_length, - seed_length = undefined; // Not supported. - if (typeof rounds === 'function') - callback = rounds, - rounds = undefined; - if (typeof rounds === 'undefined') - rounds = GENSALT_DEFAULT_LOG2_ROUNDS; - else if (typeof rounds !== 'number') - throw Error("illegal arguments: "+(typeof rounds)); - - function _async(callback) { - nextTick(function() { // Pretty thin, but salting is fast enough - try { - callback(null, bcrypt.genSaltSync(rounds)); - } catch (err) { - callback(err); - } - }); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); - }; - - /** - * Synchronously generates a hash for the given string. - * @param {string} s String to hash - * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 - * @returns {string} Resulting hash - */ - bcrypt.hashSync = function(s, salt) { - if (typeof salt === 'undefined') - salt = GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof salt === 'number') - salt = bcrypt.genSaltSync(salt); - if (typeof s !== 'string' || typeof salt !== 'string') - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)); - return _hash(s, salt); - }; - - /** - * Asynchronously generates a hash for the given string. - * @param {string} s String to hash - * @param {number|string} salt Salt length to generate or salt to use - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash - * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed - * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - */ - bcrypt.hash = function(s, salt, callback, progressCallback) { - - function _async(callback) { - if (typeof s === 'string' && typeof salt === 'number') - bcrypt.genSalt(salt, function(err, salt) { - _hash(s, salt, callback, progressCallback); - }); - else if (typeof s === 'string' && typeof salt === 'string') - _hash(s, salt, callback, progressCallback); - else - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)))); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); - }; - - /** - * Compares two strings of the same length in constant time. - * @param {string} known Must be of the correct length - * @param {string} unknown Must be the same length as `known` - * @returns {boolean} - * @inner - */ - function safeStringCompare(known, unknown) { - var diff = known.length ^ unknown.length; - for (var i = 0; i < known.length; ++i) { - diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i); - } - return diff === 0; - } - - /** - * Synchronously tests a string against a hash. - * @param {string} s String to compare - * @param {string} hash Hash to test against - * @returns {boolean} true if matching, otherwise false - * @throws {Error} If an argument is illegal - */ - bcrypt.compareSync = function(s, hash) { - if (typeof s !== "string" || typeof hash !== "string") - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)); - if (hash.length !== 60) - return false; - return safeStringCompare(bcrypt.hashSync(s, hash.substr(0, hash.length-31)), hash); - }; - - /** - * Asynchronously compares the given data against the given hash. - * @param {string} s Data to compare - * @param {string} hash Data to be compared to - * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result - * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed - * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - */ - bcrypt.compare = function(s, hash, callback, progressCallback) { - - function _async(callback) { - if (typeof s !== "string" || typeof hash !== "string") { - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)))); - return; - } - if (hash.length !== 60) { - nextTick(callback.bind(this, null, false)); - return; - } - bcrypt.hash(s, hash.substr(0, 29), function(err, comp) { - if (err) - callback(err); - else - callback(null, safeStringCompare(comp, hash)); - }, progressCallback); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); - }; - - /** - * Gets the number of rounds used to encrypt the specified hash. - * @param {string} hash Hash to extract the used number of rounds from - * @returns {number} Number of rounds used - * @throws {Error} If `hash` is not a string - */ - bcrypt.getRounds = function(hash) { - if (typeof hash !== "string") - throw Error("Illegal arguments: "+(typeof hash)); - return parseInt(hash.split("$")[2], 10); - }; - - /** - * Gets the salt portion from a hash. Does not validate the hash. - * @param {string} hash Hash to extract the salt from - * @returns {string} Extracted salt part - * @throws {Error} If `hash` is not a string or otherwise invalid - */ - bcrypt.getSalt = function(hash) { - if (typeof hash !== 'string') - throw Error("Illegal arguments: "+(typeof hash)); - if (hash.length !== 60) - throw Error("Illegal hash length: "+hash.length+" != 60"); - return hash.substring(0, 29); - }; - - /** - * Continues with the callback on the next tick. - * @function - * @param {function(...[*])} callback Callback to execute - * @inner - */ - var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function' - ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick) - : setTimeout; - - /** Calculates the byte length of a string encoded as UTF8. */ - function utf8Length(string) { - var len = 0, - c = 0; - for (var i = 0; i < string.length; ++i) { - c = string.charCodeAt(i); - if (c < 128) - len += 1; - else if (c < 2048) - len += 2; - else if ( - (c & 0xFC00) === 0xD800 && - (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00 - ) { - ++i; - len += 4; - } else - len += 3; - } - return len; - } - - /** Converts a string to an array of UTF8 bytes. */ - function utf8Array(string) { - var offset = 0, - c1, c2; - var buffer = new Array(utf8Length(string)); - for (var i = 0, k = string.length; i < k; ++i) { - c1 = string.charCodeAt(i); - if (c1 < 128) { - buffer[offset++] = c1; - } else if (c1 < 2048) { - buffer[offset++] = c1 >> 6 | 192; - buffer[offset++] = c1 & 63 | 128; - } else if ( - ( c1 & 0xFC00) === 0xD800 && - ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00 - ) { - c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); - ++i; - buffer[offset++] = c1 >> 18 | 240; - buffer[offset++] = c1 >> 12 & 63 | 128; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } else { - buffer[offset++] = c1 >> 12 | 224; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } - } - return buffer; - } - - /** - * Converts a JavaScript string to UTF8 bytes. - * @function - * @param {string} str String - * @returns {!Array.} UTF8 bytes - * @inner - */ - var stringToBytes = utf8Array; - - // A base64 implementation for the bcrypt algorithm. This is partly non-standard. - - /** - * bcrypt's own non-standard base64 dictionary. - * @type {!Array.} - * @const - * @inner - **/ - var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(''); - - /** - * @type {!Array.} - * @const - * @inner - **/ - var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, - 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, - -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1]; - - /** - * @type {!function(...number):string} - * @inner - */ - var stringFromCharCode = String.fromCharCode; - - /** - * Encodes a byte array to base64 with up to len bytes of input. - * @param {!Array.} b Byte array - * @param {number} len Maximum input length - * @returns {string} - * @inner - */ - function base64_encode(b, len) { - var off = 0, - rs = [], - c1, c2; - if (len <= 0 || len > b.length) - throw Error("Illegal len: "+len); - while (off < len) { - c1 = b[off++] & 0xff; - rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); - c1 = (c1 & 0x03) << 4; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 4) & 0x0f; - rs.push(BASE64_CODE[c1 & 0x3f]); - c1 = (c2 & 0x0f) << 2; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 6) & 0x03; - rs.push(BASE64_CODE[c1 & 0x3f]); - rs.push(BASE64_CODE[c2 & 0x3f]); - } - return rs.join(''); - } - - /** - * Decodes a base64 encoded string to up to len bytes of output. - * @param {string} s String to decode - * @param {number} len Maximum output length - * @returns {!Array.} - * @inner - */ - function base64_decode(s, len) { - var off = 0, - slen = s.length, - olen = 0, - rs = [], - c1, c2, c3, c4, o, code; - if (len <= 0) - throw Error("Illegal len: "+len); - while (off < slen - 1 && olen < len) { - code = s.charCodeAt(off++); - c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - code = s.charCodeAt(off++); - c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c1 == -1 || c2 == -1) - break; - o = (c1 << 2) >>> 0; - o |= (c2 & 0x30) >> 4; - rs.push(stringFromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c3 == -1) - break; - o = ((c2 & 0x0f) << 4) >>> 0; - o |= (c3 & 0x3c) >> 2; - rs.push(stringFromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - o = ((c3 & 0x03) << 6) >>> 0; - o |= c4; - rs.push(stringFromCharCode(o)); - ++olen; - } - var res = []; - for (off = 0; off} - * @const - * @inner - */ - var P_ORIG = [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, - 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, - 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, - 0xb5470917, 0x9216d5d9, 0x8979fb1b - ]; - - /** - * @type {Array.} - * @const - * @inner - */ - var S_ORIG = [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, - 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, - 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, - 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, - 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, - 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, - 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, - 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, - 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, - 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, - 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, - 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, - 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, - 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, - 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, - 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, - 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, - 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, - 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, - 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, - 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, - 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, - 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, - 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, - 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, - 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, - 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, - 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, - 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, - 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, - 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, - 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, - 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, - 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, - 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, - 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, - 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, - 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, - 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, - 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, - 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, - 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, - 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, - 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, - 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, - 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, - 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, - 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, - 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, - 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, - 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, - 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, - 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, - 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, - 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, - 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, - 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, - 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, - 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, - 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, - 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, - 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, - 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, - 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, - 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, - 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, - 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, - 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, - 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, - 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, - 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, - 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, - 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, - 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, - 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, - 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, - 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, - 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, - 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, - 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, - 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, - 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, - 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, - 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, - 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, - 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, - 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, - 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, - 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, - 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, - 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, - 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, - 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, - 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, - 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, - 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, - 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, - 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, - 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, - 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, - 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, - 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, - 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, - 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, - 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, - 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, - 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, - 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, - 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, - 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, - 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, - 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, - 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, - 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, - 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, - 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, - 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, - 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, - 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, - 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, - 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, - 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, - 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, - 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, - 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, - 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, - 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, - 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, - 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, - 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, - 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, - 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, - 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, - 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, - 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, - 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, - 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, - 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, - 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, - 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, - 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, - 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, - 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, - 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, - 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, - 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, - 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, - 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, - 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, - 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, - 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, - 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, - 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, - 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, - 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, - 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, - 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, - 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, - 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, - 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, - 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, - 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, - 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, - 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, - 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, - 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, - 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ]; - - /** - * @type {Array.} - * @const - * @inner - */ - var C_ORIG = [ - 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, - 0x6f756274 - ]; - - /** - * @param {Array.} lr - * @param {number} off - * @param {Array.} P - * @param {Array.} S - * @returns {Array.} - * @inner - */ - function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt - var n, - l = lr[off], - r = lr[off + 1]; - - l ^= P[0]; - - /* - for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) - // Feistel substitution on left word - n = S[l >>> 24], - n += S[0x100 | ((l >> 16) & 0xff)], - n ^= S[0x200 | ((l >> 8) & 0xff)], - n += S[0x300 | (l & 0xff)], - r ^= n ^ P[++i], - // Feistel substitution on right word - n = S[r >>> 24], - n += S[0x100 | ((r >> 16) & 0xff)], - n ^= S[0x200 | ((r >> 8) & 0xff)], - n += S[0x300 | (r & 0xff)], - l ^= n ^ P[++i]; - */ - - //The following is an unrolled version of the above loop. - //Iteration 0 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[1]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[2]; - //Iteration 1 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[3]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[4]; - //Iteration 2 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[5]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[6]; - //Iteration 3 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[7]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[8]; - //Iteration 4 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[9]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[10]; - //Iteration 5 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[11]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[12]; - //Iteration 6 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[13]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[14]; - //Iteration 7 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[15]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[16]; - - lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; - lr[off + 1] = l; - return lr; - } - - /** - * @param {Array.} data - * @param {number} offp - * @returns {{key: number, offp: number}} - * @inner - */ - function _streamtoword(data, offp) { - for (var i = 0, word = 0; i < 4; ++i) - word = (word << 8) | (data[offp] & 0xff), - offp = (offp + 1) % data.length; - return { key: word, offp: offp }; - } - - /** - * @param {Array.} key - * @param {Array.} P - * @param {Array.} S - * @inner - */ - function _key(key, P, S) { - var offset = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offset), - offset = sw.offp, - P[i] = P[i] ^ sw.key; - for (i = 0; i < plen; i += 2) - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; - } - - /** - * Expensive key schedule Blowfish. - * @param {Array.} data - * @param {Array.} key - * @param {Array.} P - * @param {Array.} S - * @inner - */ - function _ekskey(data, key, P, S) { - var offp = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offp), - offp = sw.offp, - P[i] = P[i] ^ sw.key; - offp = 0; - for (i = 0; i < plen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; - } - - /** - * Internaly crypts a string. - * @param {Array.} b Bytes to crypt - * @param {Array.} salt Salt bytes to use - * @param {number} rounds Number of rounds - * @param {function(Error, Array.=)=} callback Callback receiving the error, if any, and the resulting bytes. If - * omitted, the operation will be performed synchronously. - * @param {function(number)=} progressCallback Callback called with the current progress - * @returns {!Array.|undefined} Resulting bytes if callback has been omitted, otherwise `undefined` - * @inner - */ - function _crypt(b, salt, rounds, callback, progressCallback) { - var cdata = C_ORIG.slice(), - clen = cdata.length, - err; - - // Validate - if (rounds < 4 || rounds > 31) { - err = Error("Illegal number of rounds (4-31): "+rounds); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - if (salt.length !== BCRYPT_SALT_LEN) { - err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - rounds = (1 << rounds) >>> 0; - - var P, S, i = 0, j; - - //Use typed arrays when available - huge speedup! - if (Int32Array) { - P = new Int32Array(P_ORIG); - S = new Int32Array(S_ORIG); - } else { - P = P_ORIG.slice(); - S = S_ORIG.slice(); - } - - _ekskey(salt, b, P, S); - - /** - * Calcualtes the next round. - * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` - * @inner - */ - function next() { - if (progressCallback) - progressCallback(i / rounds); - if (i < rounds) { - var start = Date.now(); - for (; i < rounds;) { - i = i + 1; - _key(b, P, S); - _key(salt, P, S); - if (Date.now() - start > MAX_EXECUTION_TIME) - break; - } - } else { - for (i = 0; i < 64; i++) - for (j = 0; j < (clen >> 1); j++) - _encipher(cdata, j << 1, P, S); - var ret = []; - for (i = 0; i < clen; i++) - ret.push(((cdata[i] >> 24) & 0xff) >>> 0), - ret.push(((cdata[i] >> 16) & 0xff) >>> 0), - ret.push(((cdata[i] >> 8) & 0xff) >>> 0), - ret.push((cdata[i] & 0xff) >>> 0); - if (callback) { - callback(null, ret); - return; - } else - return ret; - } - if (callback) - nextTick(next); - } - - // Async - if (typeof callback !== 'undefined') { - next(); - - // Sync - } else { - var res; - while (true) - if (typeof(res = next()) !== 'undefined') - return res || []; - } - } - - /** - * Internally hashes a string. - * @param {string} s String to hash - * @param {?string} salt Salt to use, actually never null - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, - * hashing is perormed synchronously. - * @param {function(number)=} progressCallback Callback called with the current progress - * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` - * @inner - */ - function _hash(s, salt, callback, progressCallback) { - var err; - if (typeof s !== 'string' || typeof salt !== 'string') { - err = Error("Invalid string / salt: Not a string"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - - // Validate the salt - var minor, offset; - if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') { - err = Error("Invalid salt version: "+salt.substring(0,2)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - if (salt.charAt(2) === '$') - minor = String.fromCharCode(0), - offset = 3; - else { - minor = salt.charAt(2); - if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') { - err = Error("Invalid salt revision: "+salt.substring(2,4)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - offset = 4; - } - - // Extract number of rounds - if (salt.charAt(offset + 2) > '$') { - err = Error("Missing salt rounds"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, - r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), - rounds = r1 + r2, - real_salt = salt.substring(offset + 3, offset + 25); - s += minor >= 'a' ? "\x00" : ""; - - var passwordb = stringToBytes(s), - saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); - - /** - * Finishes hashing. - * @param {Array.} bytes Byte array - * @returns {string} - * @inner - */ - function finish(bytes) { - var res = []; - res.push("$2"); - if (minor >= 'a') - res.push(minor); - res.push("$"); - if (rounds < 10) - res.push("0"); - res.push(rounds.toString()); - res.push("$"); - res.push(base64_encode(saltb, saltb.length)); - res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); - return res.join(''); - } - - // Sync - if (typeof callback == 'undefined') - return finish(_crypt(passwordb, saltb, rounds)); - - // Async - else { - _crypt(passwordb, saltb, rounds, function(err, bytes) { - if (err) - callback(err, null); - else - callback(null, finish(bytes)); - }, progressCallback); - } - } - - /** - * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. - * @function - * @param {!Array.} b Byte array - * @param {number} len Maximum input length - * @returns {string} - */ - bcrypt.encodeBase64 = base64_encode; - - /** - * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. - * @function - * @param {string} s String to decode - * @param {number} len Maximum output length - * @returns {!Array.} - */ - bcrypt.decodeBase64 = base64_decode; - - return bcrypt; -})); diff --git a/dist/bcrypt.min.js b/dist/bcrypt.min.js deleted file mode 100644 index 23d2a73..0000000 --- a/dist/bcrypt.min.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - bcrypt.js (c) 2013 Daniel Wirtz - Released under the Apache License, Version 2.0 - see: https://github.com/dcodeIO/bcrypt.js for details -*/ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,g,p){a!=Array.prototype&&a!=Object.prototype&&(a[g]=p.value)};$jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_"; -$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var a=0;return function(g){return $jscomp.SYMBOL_PREFIX+(g||"")+a++}}(); -$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var a=$jscomp.global.Symbol.iterator;a||(a=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&$jscomp.defineProperty(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(a){var g=0;return $jscomp.iteratorPrototype(function(){return g=k||k>n.length)throw Error("Illegal len: "+k);for(;a>2&63]);e=(e&3)<<4;if(a>=k){c.push(x[e&63]);break}var f=n[a++]&255;e|=f>>4&15;c.push(x[e&63]);e=(f&15)<<2;if(a>=k){c.push(x[e&63]);break}f=n[a++]&255;e|=f>>6&3;c.push(x[e&63]);c.push(x[f&63])}return c.join("")}function q(a,k){var n=0,c=a.length,e=0,f=[];if(0>= -k)throw Error("Illegal len: "+k);for(;n>>0;d|=(h&48)>>4;f.push(B(d));if(++e>=k||n>=c)break;d=a.charCodeAt(n++);b=d>>0;d|=(b&60)>>2;f.push(B(d));if(++e>=k||n>=c)break;d=a.charCodeAt(n++);h=d>>0;d|=h;f.push(B(d));++e}a=[];for(n=0;n>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[1];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[2];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[3];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[4];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[5];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[6];d=c[e>>>24];d+= -c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[7];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[8];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[9];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[10];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[11];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[12];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255]; -d+=c[768|e&255];f^=d^l[13];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[14];d=c[e>>>24];d+=c[256|e>>16&255];d^=c[512|e>>8&255];d+=c[768|e&255];f^=d^l[15];d=c[f>>>24];d+=c[256|f>>16&255];d^=c[512|f>>8&255];d+=c[768|f&255];e^=d^l[16];a[k]=f^l[17];a[k+1]=e;return a}function v(a,k){for(var n=0,c=0;4>n;++n)c=c<<8|a[k]&255,k=(k+1)%a.length;return{key:c,offp:k}}function b(a,k,l){for(var c=0,e=[0,0],f=k.length,d=l.length,n,b=0;bm;m++)for(p=0;p>1;p++)h(d,p<<1,q,y);g=[];for(m=0;m>24&255)>>>0),g.push((d[m]>>16&255)>>>0),g.push((d[m]>>8&255)>>>0),g.push((d[m]&255)>>>0);if(c){c(null,g);return}return g}c&&r(f)}var d=C.slice(),n=d.length;if(4>l||31>>0;var m=0,p;if(Int32Array){var q=new Int32Array(D);var y=new Int32Array(E)}else q=D.slice(),y=E.slice();A(k,a,q,y);if("undefined"!==typeof c)f();else for(;;)if("undefined"!==typeof(g=f()))return g||[]}function t(a,k,b,c){function e(a){var c=[];c.push("$2");"a"<=f&&c.push(f);c.push("$");10>l&&c.push("0");c.push(l.toString());c.push("$");c.push(p(h,h.length));c.push(p(a,4*C.length-1));return c.join("")}if("string"!==typeof a||"string"!==typeof k){c=Error("Invalid string / salt: Not a string"); -if(b){r(b.bind(this,c));return}throw c;}if("$"!==k.charAt(0)||"2"!==k.charAt(1)){c=Error("Invalid salt version: "+k.substring(0,2));if(b){r(b.bind(this,c));return}throw c;}if("$"===k.charAt(2)){var f=String.fromCharCode(0);var d=3}else{f=k.charAt(2);if("a"!==f&&"b"!==f&&"y"!==f||"$"!==k.charAt(3)){c=Error("Invalid salt revision: "+k.substring(2,4));if(b){r(b.bind(this,c));return}throw c;}d=4}if("$"b?b=4:31b&&k.push("0");k.push(b.toString());k.push("$");k.push(p(a(16), -16));return k.join("")};m.genSalt=function(a,b,g){function c(c){r(function(){try{c(null,m.genSaltSync(a))}catch(f){c(f)}})}"function"===typeof b&&(g=b,b=void 0);"function"===typeof a&&(g=a,a=void 0);if("undefined"===typeof a)a=10;else if("number"!==typeof a)throw Error("illegal arguments: "+typeof a);if(g){if("function"!==typeof g)throw Error("Illegal callback: "+typeof g);c(g)}else return new Promise(function(a,b){c(function(c,f){c?b(c):a(f)})})};m.hashSync=function(a,b){"undefined"===typeof b&& -(b=10);"number"===typeof b&&(b=m.genSaltSync(b));if("string"!==typeof a||"string"!==typeof b)throw Error("Illegal arguments: "+typeof a+", "+typeof b);return t(a,b)};m.hash=function(a,b,g,c){function e(f){"string"===typeof a&&"number"===typeof b?m.genSalt(b,function(b,e){t(a,e,f,c)}):"string"===typeof a&&"string"===typeof b?t(a,b,f,c):r(f.bind(this,Error("Illegal arguments: "+typeof a+", "+typeof b)))}if(g){if("function"!==typeof g)throw Error("Illegal callback: "+typeof g);e(g)}else return new Promise(function(a, -c){e(function(b,d){b?c(b):a(d)})})};m.compareSync=function(a,b){if("string"!==typeof a||"string"!==typeof b)throw Error("Illegal arguments: "+typeof a+", "+typeof b);return 60!==b.length?!1:g(m.hashSync(a,b.substr(0,b.length-31)),b)};m.compare=function(a,b,h,c){function e(f){"string"!==typeof a||"string"!==typeof b?r(f.bind(this,Error("Illegal arguments: "+typeof a+", "+typeof b))):60!==b.length?r(f.bind(this,null,!1)):m.hash(a,b.substr(0,29),function(a,c){a?f(a):f(null,g(c,b))},c)}if(h){if("function"!== -typeof h)throw Error("Illegal callback: "+typeof h);e(h)}else return new Promise(function(a,c){e(function(b,d){b?c(b):a(d)})})};m.getRounds=function(a){if("string"!==typeof a)throw Error("Illegal arguments: "+typeof a);return parseInt(a.split("$")[2],10)};m.getSalt=function(a){if("string"!==typeof a)throw Error("Illegal arguments: "+typeof a);if(60!==a.length)throw Error("Illegal hash length: "+a.length+" != 60");return a.substring(0,29)};var r="undefined"!==typeof process&&process&&"function"=== -typeof process.nextTick?"function"===typeof setImmediate?setImmediate:process.nextTick:setTimeout,F=function(a){var b=0,g;var c=Array;for(var e=0,f,d=0;df?e+=1:2048>f?e+=2:55296===(f&64512)&&56320===(a.charCodeAt(d+1)&64512)?(++d,e+=4):e+=3;e=new c(e);f=0;for(d=a.length;fc?e[b++]=c:(2048>c?e[b++]=c>>6|192:(55296===(c&64512)&&56320===((g=a.charCodeAt(f+1))&64512)?(c=65536+((c&1023)<<10)+(g&1023),++f,e[b++]=c>>18|240,e[b++]=c>>12&63|128): -e[b++]=c>>12|224,e[b++]=c>>6&63|128),e[b++]=c&63|128);return e},x="./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),u=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,54,55,56,57,58,59,60,61,62,63,-1,-1,-1,-1,-1,-1,-1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,-1,-1,-1,-1,-1,-1,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52, -53,-1,-1,-1,-1,-1],B=String.fromCharCode;Date.now=Date.now||function(){return+new Date};var D=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],E=[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518, -2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850, -3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683, -2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616, -3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313, -375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946, -1266315497,3048417604,3681880366,3289982499,290971E4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528, -3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465, -1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079, -3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896, -1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597, -1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055,3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625, -3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970, -69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669, -3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236, -3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074, -2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504,976866871,3556439503,2881648439,1522871579,1555064734, -1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357, -993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658, -2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409E3,2509781533,112762804,3463356488,1866414978,891333506, -18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953, -1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296, -2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462],C=[1332899944,1700884034,1701343084,1684370003,1668446532,1869963892];m.encodeBase64=p;m.decodeBase64=q;return m}); diff --git a/dist/bcrypt.min.js.gz b/dist/bcrypt.min.js.gz deleted file mode 100644 index ed69e722fa489c8a4e81b3be6d6be023b6d33244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10622 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 Y#qWRLH~;bHKYsfB1*L7~5glXz0RGpoEdT%j diff --git a/dist/bcrypt.min.map b/dist/bcrypt.min.map deleted file mode 100644 index 501bac5..0000000 --- a/dist/bcrypt.min.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"", -"lineCount":57, -"mappings":"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", -"sources":[" [synthetic:base] "," [synthetic:util/defines] "," [synthetic:util/defineproperty] "," [synthetic:util/global] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:util/polyfill] "," [synthetic:es6/promise] ","dist/bcrypt.js"], -"names":["global","factory","define","require","module","random","len","e","a","self","Uint32Array","Array","prototype","slice","call","randomFallback","Error","safeStringCompare","known","unknown","diff","length","i","charCodeAt","base64_encode","b","off","rs","c1","push","BASE64_CODE","c2","join","base64_decode","s","slen","olen","code","BASE64_INDEX","o","stringFromCharCode","c3","c4","res","_encipher","lr","P","S","l","r","n","_streamtoword","data","offp","word","key","_key","offset","plen","sw","_ekskey","_crypt","salt","rounds","callback","progressCallback","next","start","Date","now","MAX_EXECUTION_TIME","j","clen","cdata","ret","nextTick","C_ORIG","err","bind","BCRYPT_SALT_LEN","Int32Array","P_ORIG","S_ORIG","_hash","finish","bytes","minor","toString","saltb","charAt","substring","String","fromCharCode","r1","parseInt","r2","real_salt","passwordb","stringToBytes","bcrypt","setRandomFallback","bcrypt.setRandomFallback","genSaltSync","bcrypt.genSaltSync","seed_length","GENSALT_DEFAULT_LOG2_ROUNDS","genSalt","bcrypt.genSalt","_async","undefined","Promise","resolve","reject","hashSync","bcrypt.hashSync","hash","bcrypt.hash","compareSync","bcrypt.compareSync","substr","compare","bcrypt.compare","comp","getRounds","bcrypt.getRounds","split","getSalt","bcrypt.getSalt","process","setImmediate","setTimeout","utf8Array","string","c","buffer","k","encodeBase64","decodeBase64"] -} diff --git a/donate.png b/donate.png deleted file mode 100644 index f1404fde9f1fad2111de347d2bf2bd4b329e2007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcmV+s2JZQZP)lu%bJv0tbeJ*5(Of^uL39QXm_^G~LvF&91 z@X=m=OEfh{&TNEU1=N-)k15IzP6Vz6dGozENo$ruymBGoUrlzINfA~L1fyoisOH+N z0c5LU_%d7sPtqV_ReC?F3?t}_GH8qB-f=ERxl+73FYvO>&sMCa7pO$z<@jAAdLRg+ zI-W?#mhk<8cD$te7D&Yr$tgnh_08C5^k9$44NL?8lL^~{8}Wg^;?5F=g3?vS1!v2S z!B%QO<4=jZMs$L7qQLF}S=MERHiRpxx1sWOOMp^^zC}-FfsUzm;nD}d1a{FP zQp~L4rI~O(Xp$`B<|y3VJ~+FKsLa!#?*1&;EA(*nL{ZlgKp@7$y)_qHFeT!Fm;lFD zez*r>VxEQ#W|(zKH1$N_Y#Rf6GXY^|@zhvv64r1bjJhf# zEQ?)(>dINb?~{tpiv{h6pzS<0jZranoodT_eQ><@DJo4-II9g(zmN~Md|t%e?OkxL(uz3O+aqENo_iM<^P+BrX3gi zZeYV}`_b5Z2970aI2Nm6f9oT-TF#;IQ8VP?K)>6LW7ycwQ6~A!&J$aJe>1SkU#UV z8l;Vj(-hEo$pkJn2J5^`DThEyevA&S%sjw6xxo=$S5pT2LL*$~e+J8rVz1*7sXbX* z+A(3Yh)pXCsXylhA`_CGe0%}{pOM;T$W63NyRY7eZOjX}I{FD-MJws{R_hN!hwa#e zL-V)Loq(Cfbzk}gd+nRSd~pE*I@sHmmZPz?8*HzKlwJti!d$qzL$I$XhWp2!$sCkR zJ82{Q - */ - -/** - * @type {Object.} - */ -var bcrypt = {}; - -/** - * @param {?function(number):!Array.} random - */ -bcrypt.setRandomFallback = function(random) {}; - -/** - * @param {number=} rounds - * @param {number=} seed_length - * @returns {string} - */ -bcrypt.genSaltSync = function(rounds, seed_length) {}; - -/** - * @param {(number|function(Error, ?string))=} rounds - * @param {(number|function(Error, ?string))=} seed_length - * @param {function(Error, string=)=} callback - */ -bcrypt.genSalt = function(rounds, seed_length, callback) {}; - -/** - * @param {string} s - * @param {(number|string)=} salt - * @returns {?string} - */ -bcrypt.hashSync = function(s, salt) {}; - -/** - * @param {string} s - * @param {number|string} salt - * @param {function(Error, string=)} callback - * @expose - */ -bcrypt.hash = function(s, salt, callback) {}; - -/** - * @param {string} s - * @param {string} hash - * @returns {boolean} - * @throws {Error} - */ -bcrypt.compareSync = function(s, hash) {}; - -/** - * @param {string} s - * @param {string} hash - * @param {function(Error, boolean)} callback - * @throws {Error} - */ -bcrypt.compare = function(s, hash, callback) {}; - -/** - * @param {string} hash - * @returns {number} - * @throws {Error} - */ -bcrypt.getRounds = function(hash) {}; - -/** - * @param {string} hash - * @returns {string} - * @throws {Error} - * @expose - */ -bcrypt.getSalt = function(hash) {}; diff --git a/externs/minimal-env.js b/externs/minimal-env.js deleted file mode 100644 index 0db9d4c..0000000 --- a/externs/minimal-env.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @fileoverview Minimal environment for bcrypt.js. - * @externs - */ - -/** - * @param {string} moduleName - * returns {*} - */ -function require(moduleName) {} - -/** - * @constructor - * @private - */ -var Module = function() {}; - -/** - * @type {*} - */ -Module.prototype.exports; - -/** - * @type {Module} - */ -var module; - -/** - * @type {string} - */ -var __dirname; - -/** - * @type {Object.} - */ -var process = {}; - -/** - * @param {function()} func - */ -process.nextTick = function(func) {}; - -/** - * @param {string} s - * @constructor - * @extends Array - */ -var Buffer = function(s) {}; - -/** - BEGIN_NODE_INCLUDE - var crypto = require('crypto'); - END_NODE_INCLUDE - */ - -/** - * @type {Object.} - */ -var crypto = {}; - -/** - * @param {number} n - * @returns {Array.} - */ -crypto.randomBytes = function(n) {}; - -/** - * @type {Object.} - */ -window.crypto = {}; - -/** - * @param {Uint8Array|Int8Array|Uint16Array|Int16Array|Uint32Array|Int32Array} array - */ -window.crypto.getRandomValues = function(array) {}; - -/** - * @param {string} name - * @param {function(...[*]):*} constructor - */ -var define = function(name, constructor) {}; - -/** - * @type {boolean} - */ -define.amd; - -/** - * @param {...*} var_args - * @returns {string} - */ -String.fromCodePoint = function(var_args) {}; - -/** - * @param {number} offset - * @returns {number} - */ -String.prototype.codePointAt = function(offset) {}; diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..b223a40 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,3 @@ +import * as bcrypt from './types.js'; +export * from './types.js'; +export default bcrypt; diff --git a/index.js b/index.js index f11b4e7..3edaae1 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ /* Copyright (c) 2012 Nevins Bartolomeo Copyright (c) 2012 Shane Girish - Copyright (c) 2013 Daniel Wirtz + Copyright (c) 2025 Daniel Wirtz Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -26,4 +26,1157 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -module.exports = require("./dist/bcrypt.js"); +/** + * The random implementation to use as a fallback. + * @type {?function(number):!Array.} + * @inner + */ +var randomFallback = null; + +/** + * Generates cryptographically secure random bytes. + * @function + * @param {number} len Bytes length + * @returns {!Array.} Random bytes + * @throws {Error} If no random implementation is available + * @inner + */ +function random(len) { + // Web Crypto API + try { + return crypto.getRandomValues(new Uint8Array(len)); + } catch {} + // Node.js crypto + if (typeof require === 'function') { + try { + return require("crypto").randomBytes(len); + } catch {} + } + // Fallback + if (!randomFallback) { + throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); + } + return randomFallback(len); +} + +// Default fallback, if any +randomFallback = null; + +/** + * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto + * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it + * is seeded properly! + * @param {?function(number):!Array.} random Function taking the number of bytes to generate as its + * sole argument, returning the corresponding array of cryptographically secure random byte values. + * @see http://nodejs.org/api/crypto.html + * @see http://www.w3.org/TR/WebCryptoAPI/ + */ +export function setRandomFallback(random) { + randomFallback = random; +} + +/** + * Synchronously generates a salt. + * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted + * @param {number=} seed_length Not supported. + * @returns {string} Resulting salt + * @throws {Error} If a random fallback is required but not set + */ +export function genSaltSync(rounds, seed_length) { + rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; + if (typeof rounds !== 'number') + throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length)); + if (rounds < 4) + rounds = 4; + else if (rounds > 31) + rounds = 31; + var salt = []; + salt.push("$2a$"); + if (rounds < 10) + salt.push("0"); + salt.push(rounds.toString()); + salt.push('$'); + salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw + return salt.join(''); +} + +/** + * Asynchronously generates a salt. + * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted + * @param {(number|function(Error, string=))=} seed_length Not supported. + * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt + * @returns {!Promise} If `callback` has been omitted + * @throws {Error} If `callback` is present but not a function + */ +export function genSalt(rounds, seed_length, callback) { + if (typeof seed_length === 'function') + callback = seed_length, + seed_length = undefined; // Not supported. + if (typeof rounds === 'function') + callback = rounds, + rounds = undefined; + if (typeof rounds === 'undefined') + rounds = GENSALT_DEFAULT_LOG2_ROUNDS; + else if (typeof rounds !== 'number') + throw Error("illegal arguments: "+(typeof rounds)); + + function _async(callback) { + nextTick(function() { // Pretty thin, but salting is fast enough + try { + callback(null, genSaltSync(rounds)); + } catch (err) { + callback(err); + } + }); + } + + if (callback) { + if (typeof callback !== 'function') + throw Error("Illegal callback: "+typeof(callback)); + _async(callback); + } else + return new Promise(function(resolve, reject) { + _async(function(err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); +} + +/** + * Synchronously generates a hash for the given string. + * @param {string} s String to hash + * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 + * @returns {string} Resulting hash + */ +export function hashSync(s, salt) { + if (typeof salt === 'undefined') + salt = GENSALT_DEFAULT_LOG2_ROUNDS; + if (typeof salt === 'number') + salt = genSaltSync(salt); + if (typeof s !== 'string' || typeof salt !== 'string') + throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)); + return _hash(s, salt); +} + +/** + * Asynchronously generates a hash for the given string. + * @param {string} s String to hash + * @param {number|string} salt Salt length to generate or salt to use + * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash + * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed + * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. + * @returns {!Promise} If `callback` has been omitted + * @throws {Error} If `callback` is present but not a function + */ +export function hash(s, salt, callback, progressCallback) { + + function _async(callback) { + if (typeof s === 'string' && typeof salt === 'number') + genSalt(salt, function(err, salt) { + _hash(s, salt, callback, progressCallback); + }); + else if (typeof s === 'string' && typeof salt === 'string') + _hash(s, salt, callback, progressCallback); + else + nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)))); + } + + if (callback) { + if (typeof callback !== 'function') + throw Error("Illegal callback: "+typeof(callback)); + _async(callback); + } else + return new Promise(function(resolve, reject) { + _async(function(err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); +} + +/** + * Compares two strings of the same length in constant time. + * @param {string} known Must be of the correct length + * @param {string} unknown Must be the same length as `known` + * @returns {boolean} + * @inner + */ +function safeStringCompare(known, unknown) { + var diff = known.length ^ unknown.length; + for (var i = 0; i < known.length; ++i) { + diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i); + } + return diff === 0; +} + +/** + * Synchronously tests a string against a hash. + * @param {string} s String to compare + * @param {string} hash Hash to test against + * @returns {boolean} true if matching, otherwise false + * @throws {Error} If an argument is illegal + */ +export function compareSync(s, hash) { + if (typeof s !== "string" || typeof hash !== "string") + throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)); + if (hash.length !== 60) + return false; + return safeStringCompare(hashSync(s, hash.substr(0, hash.length-31)), hash); +} + +/** + * Asynchronously compares the given data against the given hash. + * @param {string} s Data to compare + * @param {string} hashValue Data to be compared to + * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result + * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed + * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. + * @returns {!Promise} If `callback` has been omitted + * @throws {Error} If `callback` is present but not a function + */ +export function compare(s, hashValue, callback, progressCallback) { + + function _async(callback) { + if (typeof s !== "string" || typeof hashValue !== "string") { + nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hashValue)))); + return; + } + if (hashValue.length !== 60) { + nextTick(callback.bind(this, null, false)); + return; + } + hash(s, hashValue.substring(0, 29), function(err, comp) { + if (err) + callback(err); + else + callback(null, safeStringCompare(comp, hashValue)); + }, progressCallback); + } + + if (callback) { + if (typeof callback !== 'function') + throw Error("Illegal callback: "+typeof(callback)); + _async(callback); + } else + return new Promise(function(resolve, reject) { + _async(function(err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); +} + +/** + * Gets the number of rounds used to encrypt the specified hash. + * @param {string} hash Hash to extract the used number of rounds from + * @returns {number} Number of rounds used + * @throws {Error} If `hash` is not a string + */ +export function getRounds(hash) { + if (typeof hash !== "string") + throw Error("Illegal arguments: "+(typeof hash)); + return parseInt(hash.split("$")[2], 10); +} + +/** + * Gets the salt portion from a hash. Does not validate the hash. + * @param {string} hash Hash to extract the salt from + * @returns {string} Extracted salt part + * @throws {Error} If `hash` is not a string or otherwise invalid + */ +export function getSalt(hash) { + if (typeof hash !== 'string') + throw Error("Illegal arguments: "+(typeof hash)); + if (hash.length !== 60) + throw Error("Illegal hash length: "+hash.length+" != 60"); + return hash.substring(0, 29); +}; + +/** + * Continues with the callback on the next tick. + * @function + * @param {function(...[*])} callback Callback to execute + * @inner + */ +var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function' + ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick) + : setTimeout; + +/** Calculates the byte length of a string encoded as UTF8. */ +function utf8Length(string) { + var len = 0, + c = 0; + for (var i = 0; i < string.length; ++i) { + c = string.charCodeAt(i); + if (c < 128) + len += 1; + else if (c < 2048) + len += 2; + else if ( + (c & 0xFC00) === 0xD800 && + (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00 + ) { + ++i; + len += 4; + } else + len += 3; + } + return len; +} + +/** Converts a string to an array of UTF8 bytes. */ +function utf8Array(string) { + var offset = 0, + c1, c2; + var buffer = new Array(utf8Length(string)); + for (var i = 0, k = string.length; i < k; ++i) { + c1 = string.charCodeAt(i); + if (c1 < 128) { + buffer[offset++] = c1; + } else if (c1 < 2048) { + buffer[offset++] = c1 >> 6 | 192; + buffer[offset++] = c1 & 63 | 128; + } else if ( + ( c1 & 0xFC00) === 0xD800 && + ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00 + ) { + c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); + ++i; + buffer[offset++] = c1 >> 18 | 240; + buffer[offset++] = c1 >> 12 & 63 | 128; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } else { + buffer[offset++] = c1 >> 12 | 224; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } + } + return buffer; +} + +// A base64 implementation for the bcrypt algorithm. This is partly non-standard. + +/** + * bcrypt's own non-standard base64 dictionary. + * @type {!Array.} + * @const + * @inner + **/ +var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(''); + +/** + * @type {!Array.} + * @const + * @inner + **/ +var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, + -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1]; + +/** + * Encodes a byte array to base64 with up to len bytes of input. + * @param {!Array.} b Byte array + * @param {number} len Maximum input length + * @returns {string} + * @inner + */ +function base64_encode(b, len) { + var off = 0, + rs = [], + c1, c2; + if (len <= 0 || len > b.length) + throw Error("Illegal len: "+len); + while (off < len) { + c1 = b[off++] & 0xff; + rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.push(BASE64_CODE[c1 & 0x3f]); + break; + } + c2 = b[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.push(BASE64_CODE[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.push(BASE64_CODE[c1 & 0x3f]); + break; + } + c2 = b[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.push(BASE64_CODE[c1 & 0x3f]); + rs.push(BASE64_CODE[c2 & 0x3f]); + } + return rs.join(''); +} + +/** + * Decodes a base64 encoded string to up to len bytes of output. + * @param {string} s String to decode + * @param {number} len Maximum output length + * @returns {!Array.} + * @inner + */ +function base64_decode(s, len) { + var off = 0, + slen = s.length, + olen = 0, + rs = [], + c1, c2, c3, c4, o, code; + if (len <= 0) + throw Error("Illegal len: "+len); + while (off < slen - 1 && olen < len) { + code = s.charCodeAt(off++); + c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + code = s.charCodeAt(off++); + c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + if (c1 == -1 || c2 == -1) + break; + o = (c1 << 2) >>> 0; + o |= (c2 & 0x30) >> 4; + rs.push(String.fromCharCode(o)); + if (++olen >= len || off >= slen) + break; + code = s.charCodeAt(off++); + c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + if (c3 == -1) + break; + o = ((c2 & 0x0f) << 4) >>> 0; + o |= (c3 & 0x3c) >> 2; + rs.push(String.fromCharCode(o)); + if (++olen >= len || off >= slen) + break; + code = s.charCodeAt(off++); + c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + o = ((c3 & 0x03) << 6) >>> 0; + o |= c4; + rs.push(String.fromCharCode(o)); + ++olen; + } + var res = []; + for (off = 0; off} + * @const + * @inner + */ +var P_ORIG = [ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, + 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, + 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, + 0xb5470917, 0x9216d5d9, 0x8979fb1b +]; + +/** + * @type {Array.} + * @const + * @inner + */ +var S_ORIG = [ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, + 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, + 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, + 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, + 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, + 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, + 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, + 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, + 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, + 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, + 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, + 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, + 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, + 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, + 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, + 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, + 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, + 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, + 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, + 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, + 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, + 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, + 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, + 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, + 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, + 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, + 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, + 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, + 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, + 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, + 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, + 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, + 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, + 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, + 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, + 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, + 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, + 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, + 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, + 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, + 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, + 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, + 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, + 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, + 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, + 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, + 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, + 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, + 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, + 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, + 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, + 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, + 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, + 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, + 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, + 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, + 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, + 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, + 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, + 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, + 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, + 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, + 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, + 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, + 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, + 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, + 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, + 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, + 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, + 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, + 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, + 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, + 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, + 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, + 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, + 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, + 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, + 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, + 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, + 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, + 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, + 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, + 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, + 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, + 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, + 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, + 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, + 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, + 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, + 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, + 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, + 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, + 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, + 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, + 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, + 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, + 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, + 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, + 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, + 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, + 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, + 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, + 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, + 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, + 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, + 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, + 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, + 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, + 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, + 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, + 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, + 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, + 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, + 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, + 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, + 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, + 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, + 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, + 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, + 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, + 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, + 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, + 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, + 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, + 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, + 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, + 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, + 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, + 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, + 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, + 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, + 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, + 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, + 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, + 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, + 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, + 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, + 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, + 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, + 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 +]; + +/** + * @type {Array.} + * @const + * @inner + */ +var C_ORIG = [ + 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, + 0x6f756274 +]; + +/** + * @param {Array.} lr + * @param {number} off + * @param {Array.} P + * @param {Array.} S + * @returns {Array.} + * @inner + */ +function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt + var n, + l = lr[off], + r = lr[off + 1]; + + l ^= P[0]; + + /* + for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) + // Feistel substitution on left word + n = S[l >>> 24], + n += S[0x100 | ((l >> 16) & 0xff)], + n ^= S[0x200 | ((l >> 8) & 0xff)], + n += S[0x300 | (l & 0xff)], + r ^= n ^ P[++i], + // Feistel substitution on right word + n = S[r >>> 24], + n += S[0x100 | ((r >> 16) & 0xff)], + n ^= S[0x200 | ((r >> 8) & 0xff)], + n += S[0x300 | (r & 0xff)], + l ^= n ^ P[++i]; + */ + + //The following is an unrolled version of the above loop. + //Iteration 0 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[1]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[2]; + //Iteration 1 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[3]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[4]; + //Iteration 2 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[5]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[6]; + //Iteration 3 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[7]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[8]; + //Iteration 4 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[9]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[10]; + //Iteration 5 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[11]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[12]; + //Iteration 6 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[13]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[14]; + //Iteration 7 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[15]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[16]; + + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + return lr; +} + +/** + * @param {Array.} data + * @param {number} offp + * @returns {{key: number, offp: number}} + * @inner + */ +function _streamtoword(data, offp) { + for (var i = 0, word = 0; i < 4; ++i) + word = (word << 8) | (data[offp] & 0xff), + offp = (offp + 1) % data.length; + return { key: word, offp: offp }; +} + +/** + * @param {Array.} key + * @param {Array.} P + * @param {Array.} S + * @inner + */ +function _key(key, P, S) { + var offset = 0, + lr = [0, 0], + plen = P.length, + slen = S.length, + sw; + for (var i = 0; i < plen; i++) + sw = _streamtoword(key, offset), + offset = sw.offp, + P[i] = P[i] ^ sw.key; + for (i = 0; i < plen; i += 2) + lr = _encipher(lr, 0, P, S), + P[i] = lr[0], + P[i + 1] = lr[1]; + for (i = 0; i < slen; i += 2) + lr = _encipher(lr, 0, P, S), + S[i] = lr[0], + S[i + 1] = lr[1]; +} + +/** + * Expensive key schedule Blowfish. + * @param {Array.} data + * @param {Array.} key + * @param {Array.} P + * @param {Array.} S + * @inner + */ +function _ekskey(data, key, P, S) { + var offp = 0, + lr = [0, 0], + plen = P.length, + slen = S.length, + sw; + for (var i = 0; i < plen; i++) + sw = _streamtoword(key, offp), + offp = sw.offp, + P[i] = P[i] ^ sw.key; + offp = 0; + for (i = 0; i < plen; i += 2) + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[0] ^= sw.key, + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[1] ^= sw.key, + lr = _encipher(lr, 0, P, S), + P[i] = lr[0], + P[i + 1] = lr[1]; + for (i = 0; i < slen; i += 2) + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[0] ^= sw.key, + sw = _streamtoword(data, offp), + offp = sw.offp, + lr[1] ^= sw.key, + lr = _encipher(lr, 0, P, S), + S[i] = lr[0], + S[i + 1] = lr[1]; +} + +/** + * Internaly crypts a string. + * @param {Array.} b Bytes to crypt + * @param {Array.} salt Salt bytes to use + * @param {number} rounds Number of rounds + * @param {function(Error, Array.=)=} callback Callback receiving the error, if any, and the resulting bytes. If + * omitted, the operation will be performed synchronously. + * @param {function(number)=} progressCallback Callback called with the current progress + * @returns {!Array.|undefined} Resulting bytes if callback has been omitted, otherwise `undefined` + * @inner + */ +function _crypt(b, salt, rounds, callback, progressCallback) { + var cdata = C_ORIG.slice(), + clen = cdata.length, + err; + + // Validate + if (rounds < 4 || rounds > 31) { + err = Error("Illegal number of rounds (4-31): "+rounds); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + if (salt.length !== BCRYPT_SALT_LEN) { + err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + rounds = (1 << rounds) >>> 0; + + var P, S, i = 0, j; + + //Use typed arrays when available - huge speedup! + if (Int32Array) { + P = new Int32Array(P_ORIG); + S = new Int32Array(S_ORIG); + } else { + P = P_ORIG.slice(); + S = S_ORIG.slice(); + } + + _ekskey(salt, b, P, S); + + /** + * Calcualtes the next round. + * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` + * @inner + */ + function next() { + if (progressCallback) + progressCallback(i / rounds); + if (i < rounds) { + var start = Date.now(); + for (; i < rounds;) { + i = i + 1; + _key(b, P, S); + _key(salt, P, S); + if (Date.now() - start > MAX_EXECUTION_TIME) + break; + } + } else { + for (i = 0; i < 64; i++) + for (j = 0; j < (clen >> 1); j++) + _encipher(cdata, j << 1, P, S); + var ret = []; + for (i = 0; i < clen; i++) + ret.push(((cdata[i] >> 24) & 0xff) >>> 0), + ret.push(((cdata[i] >> 16) & 0xff) >>> 0), + ret.push(((cdata[i] >> 8) & 0xff) >>> 0), + ret.push((cdata[i] & 0xff) >>> 0); + if (callback) { + callback(null, ret); + return; + } else + return ret; + } + if (callback) + nextTick(next); + } + + // Async + if (typeof callback !== 'undefined') { + next(); + + // Sync + } else { + var res; + while (true) + if (typeof(res = next()) !== 'undefined') + return res || []; + } +} + +/** + * Internally hashes a string. + * @param {string} s String to hash + * @param {?string} salt Salt to use, actually never null + * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, + * hashing is perormed synchronously. + * @param {function(number)=} progressCallback Callback called with the current progress + * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` + * @inner + */ +function _hash(s, salt, callback, progressCallback) { + var err; + if (typeof s !== 'string' || typeof salt !== 'string') { + err = Error("Invalid string / salt: Not a string"); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } + else + throw err; + } + + // Validate the salt + var minor, offset; + if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') { + err = Error("Invalid salt version: "+salt.substring(0,2)); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } + else + throw err; + } + if (salt.charAt(2) === '$') + minor = String.fromCharCode(0), + offset = 3; + else { + minor = salt.charAt(2); + if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') { + err = Error("Invalid salt revision: "+salt.substring(2,4)); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + offset = 4; + } + + // Extract number of rounds + if (salt.charAt(offset + 2) > '$') { + err = Error("Missing salt rounds"); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else + throw err; + } + var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, + r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), + rounds = r1 + r2, + real_salt = salt.substring(offset + 3, offset + 25); + s += minor >= 'a' ? "\x00" : ""; + + var passwordb = utf8Array(s), + saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); + + /** + * Finishes hashing. + * @param {Array.} bytes Byte array + * @returns {string} + * @inner + */ + function finish(bytes) { + var res = []; + res.push("$2"); + if (minor >= 'a') + res.push(minor); + res.push("$"); + if (rounds < 10) + res.push("0"); + res.push(rounds.toString()); + res.push("$"); + res.push(base64_encode(saltb, saltb.length)); + res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); + return res.join(''); + } + + // Sync + if (typeof callback == 'undefined') + return finish(_crypt(passwordb, saltb, rounds)); + + // Async + else { + _crypt(passwordb, saltb, rounds, function(err, bytes) { + if (err) + callback(err, null); + else + callback(null, finish(bytes)); + }, progressCallback); + } +} + +/** + * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. + * @function + * @param {!Array.} b Byte array + * @param {number} len Maximum input length + * @returns {string} + */ +export function encodeBase64(b, len) { + return base64_encode(b, len); +} + +/** + * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. + * @function + * @param {string} s String to decode + * @param {number} len Maximum output length + * @returns {!Array.} + */ +export function decodeBase64(s, len) { + return base64_decode(s, len); +} + +export default { + setRandomFallback, + genSaltSync, + genSalt, + hashSync, + hash, + compareSync, + compare, + getRounds, + getSalt, + encodeBase64, + decodeBase64 +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8e46b75 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1292 @@ +{ + "name": "bcryptjs", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bcryptjs", + "version": "0.0.0", + "license": "MIT", + "bin": { + "bcrypt": "bin/bcrypt" + }, + "devDependencies": { + "bcrypt": "^5.1.1", + "esm2umd": "^0.2.2", + "typescript": "^5.7.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", + "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/traverse": "^7.26.8", + "@babel/types": "^7.26.8", + "@types/gensync": "^1.0.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@types/gensync": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", + "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.97", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", + "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esm2umd": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/esm2umd/-/esm2umd-0.2.2.tgz", + "integrity": "sha512-boNmWNAUIyir6V0V5XGJDQ79vHQgYdagXxVHdG2ArVkQ/e6daZ1PAqPLXdSepV+ehYPTsqdv6KPSejogORP68A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.8", + "@babel/plugin-transform-modules-commonjs": "^7.26.3" + }, + "bin": { + "esm2umd": "bin/esm2umd.js" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/package.json b/package.json index 8b6d9fe..d480725 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bcryptjs", "description": "Optimized bcrypt in plain JavaScript with zero dependencies. Compatible to 'bcrypt'.", - "version": "2.4.4", + "version": "0.0.0", "author": "Daniel Wirtz ", "contributors": [ "Shane Girish (https://github.com/shaneGirish)", @@ -26,24 +26,44 @@ "crypt", "crypto" ], + "type": "module", + "main": "umd/index.js", + "types": "umd/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./index.d.ts", + "default": "./index.js" + }, + "require": { + "types": "./umd/index.d.ts", + "default": "./umd/index.js" + } + } + }, "bin": { "bcrypt": "bin/bcrypt" }, - "main": "index.js", - "browser": "dist/bcrypt.js", - "dependencies": {}, - "devDependencies": { - "bcrypt": "latest", - "closurecompiler": "~1", - "metascript": "~1.0.0", - "testjs": "~1" - }, - "license": "MIT", + "license": "BSD-3-Clause", "scripts": { - "test": "node node_modules/testjs/bin/testjs", - "build": "node scripts/build.js", - "compile": "node node_modules/closurecompiler/bin/ccjs dist/bcrypt.js --compilation_level=SIMPLE_OPTIMIZATIONS --create_source_map=dist/bcrypt.min.map > dist/bcrypt.min.js", - "compress": "gzip -c -9 dist/bcrypt.min.js > dist/bcrypt.min.js.gz", - "make": "npm run build && npm run compile && npm run compress && npm test" + "build": "esm2umd bcrypt index.js > umd/index.js", + "test": "npm run test:unit && npm run test:typescript", + "test:unit": "node tests", + "test:typescript": "tsc --project tests/typescript/tsconfig.esnext.json && tsc --project tests/typescript/tsconfig.nodenext.json && tsc --project tests/typescript/tsconfig.commonjs.json" + }, + "files": [ + "index.js", + "index.d.ts", + "umd/index.js", + "umd/index.d.ts", + "umd/package.json", + "types.d.ts", + "LICENSE", + "README.md" + ], + "devDependencies": { + "bcrypt": "^5.1.1", + "esm2umd": "^0.2.2", + "typescript": "^5.7.3" } } diff --git a/scripts/build.js b/scripts/build.js deleted file mode 100644 index 093ff7a..0000000 --- a/scripts/build.js +++ /dev/null @@ -1,37 +0,0 @@ -var MetaScript = require("metascript"), - path = require("path"), - fs = require("fs"); - -var rootDir = path.join(__dirname, ".."), - srcDir = path.join(rootDir, "src"), - distDir = path.join(rootDir, "dist"), - pkg = require(path.join(rootDir, "package.json")), - filename; - -var scope = { - VERSION: pkg.version, - ISAAC: false -}; - -// Make standard build -console.log("Building bcrypt.js with scope", JSON.stringify(scope, null, 2)); -fs.writeFileSync( - path.join(distDir, "bcrypt.js"), - MetaScript.transform(fs.readFileSync(filename = path.join(srcDir, "wrap.js")), filename, scope, srcDir) -); - -// Make isaac build - see: https://github.com/dcodeIO/bcrypt.js/issues/16 -/* scope.ISAAC = true; -console.log("Building bcrypt-isaac.js with scope", JSON.stringify(scope, null, 2)); -fs.writeFileSync( - path.join(distDir, "bcrypt-isaac.js"), - MetaScript.transform(fs.readFileSync(filename = path.join(srcDir, "bcrypt.js")), filename, scope, srcDir) -); */ - -// Update bower.json -scope = { VERSION: pkg.version }; -console.log("Updating bower.json with scope", JSON.stringify(scope, null, 2)); -fs.writeFileSync( - path.join(rootDir, "bower.json"), - MetaScript.transform(fs.readFileSync(path.join(srcDir, "bower.json.template")), path.join(srcDir, "bower.json"), scope, srcDir) -); diff --git a/src/bcrypt.js b/src/bcrypt.js deleted file mode 100644 index d9c0492..0000000 --- a/src/bcrypt.js +++ /dev/null @@ -1,310 +0,0 @@ -/** - * bcrypt namespace. - * @type {Object.} - */ -var bcrypt = {}; - -/** - * The random implementation to use as a fallback. - * @type {?function(number):!Array.} - * @inner - */ -var randomFallback = null; - -/** - * Generates cryptographically secure random bytes. - * @function - * @param {number} len Bytes length - * @returns {!Array.} Random bytes - * @throws {Error} If no random implementation is available - * @inner - */ -function random(len) { - /* node */ if (typeof module !== 'undefined' && module && module['exports']) - try { - return require("crypto")['randomBytes'](len); - } catch (e) {} - /* WCA */ try { - var a; (self['crypto']||self['msCrypto'])['getRandomValues'](a = new Uint32Array(len)); - return Array.prototype.slice.call(a); - } catch (e) {} - /* fallback */ if (!randomFallback) - throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); - return randomFallback(len); -} - -// Test if any secure randomness source is available -var randomAvailable = false; -try { - random(1); - randomAvailable = true; -} catch (e) {} - -// Default fallback, if any -randomFallback = /*? if (ISAAC) { */function(len) { - for (var a=[], i=0; i} random Function taking the number of bytes to generate as its - * sole argument, returning the corresponding array of cryptographically secure random byte values. - * @see http://nodejs.org/api/crypto.html - * @see http://www.w3.org/TR/WebCryptoAPI/ - */ -bcrypt.setRandomFallback = function(random) { - randomFallback = random; -}; - -/** - * Synchronously generates a salt. - * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted - * @param {number=} seed_length Not supported. - * @returns {string} Resulting salt - * @throws {Error} If a random fallback is required but not set - */ -bcrypt.genSaltSync = function(rounds, seed_length) { - rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof rounds !== 'number') - throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length)); - if (rounds < 4) - rounds = 4; - else if (rounds > 31) - rounds = 31; - var salt = []; - salt.push("$2a$"); - if (rounds < 10) - salt.push("0"); - salt.push(rounds.toString()); - salt.push('$'); - salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw - return salt.join(''); -}; - -/** - * Asynchronously generates a salt. - * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted - * @param {(number|function(Error, string=))=} seed_length Not supported. - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - */ -bcrypt.genSalt = function(rounds, seed_length, callback) { - if (typeof seed_length === 'function') - callback = seed_length, - seed_length = undefined; // Not supported. - if (typeof rounds === 'function') - callback = rounds, - rounds = undefined; - if (typeof rounds === 'undefined') - rounds = GENSALT_DEFAULT_LOG2_ROUNDS; - else if (typeof rounds !== 'number') - throw Error("illegal arguments: "+(typeof rounds)); - - function _async(callback) { - nextTick(function() { // Pretty thin, but salting is fast enough - try { - callback(null, bcrypt.genSaltSync(rounds)); - } catch (err) { - callback(err); - } - }); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); -}; - -/** - * Synchronously generates a hash for the given string. - * @param {string} s String to hash - * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 - * @returns {string} Resulting hash - */ -bcrypt.hashSync = function(s, salt) { - if (typeof salt === 'undefined') - salt = GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof salt === 'number') - salt = bcrypt.genSaltSync(salt); - if (typeof s !== 'string' || typeof salt !== 'string') - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)); - return _hash(s, salt); -}; - -/** - * Asynchronously generates a hash for the given string. - * @param {string} s String to hash - * @param {number|string} salt Salt length to generate or salt to use - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash - * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed - * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - */ -bcrypt.hash = function(s, salt, callback, progressCallback) { - - function _async(callback) { - if (typeof s === 'string' && typeof salt === 'number') - bcrypt.genSalt(salt, function(err, salt) { - _hash(s, salt, callback, progressCallback); - }); - else if (typeof s === 'string' && typeof salt === 'string') - _hash(s, salt, callback, progressCallback); - else - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)))); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); -}; - -/** - * Compares two strings of the same length in constant time. - * @param {string} known Must be of the correct length - * @param {string} unknown Must be the same length as `known` - * @returns {boolean} - * @inner - */ -function safeStringCompare(known, unknown) { - var diff = known.length ^ unknown.length; - for (var i = 0; i < known.length; ++i) { - diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i); - } - return diff === 0; -} - -/** - * Synchronously tests a string against a hash. - * @param {string} s String to compare - * @param {string} hash Hash to test against - * @returns {boolean} true if matching, otherwise false - * @throws {Error} If an argument is illegal - */ -bcrypt.compareSync = function(s, hash) { - if (typeof s !== "string" || typeof hash !== "string") - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)); - if (hash.length !== 60) - return false; - return safeStringCompare(bcrypt.hashSync(s, hash.substr(0, hash.length-31)), hash); -}; - -/** - * Asynchronously compares the given data against the given hash. - * @param {string} s Data to compare - * @param {string} hash Data to be compared to - * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result - * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed - * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. - * @returns {!Promise} If `callback` has been omitted - * @throws {Error} If `callback` is present but not a function - */ -bcrypt.compare = function(s, hash, callback, progressCallback) { - - function _async(callback) { - if (typeof s !== "string" || typeof hash !== "string") { - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)))); - return; - } - if (hash.length !== 60) { - nextTick(callback.bind(this, null, false)); - return; - } - bcrypt.hash(s, hash.substr(0, 29), function(err, comp) { - if (err) - callback(err); - else - callback(null, safeStringCompare(comp, hash)); - }, progressCallback); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); -}; - -/** - * Gets the number of rounds used to encrypt the specified hash. - * @param {string} hash Hash to extract the used number of rounds from - * @returns {number} Number of rounds used - * @throws {Error} If `hash` is not a string - */ -bcrypt.getRounds = function(hash) { - if (typeof hash !== "string") - throw Error("Illegal arguments: "+(typeof hash)); - return parseInt(hash.split("$")[2], 10); -}; - -/** - * Gets the salt portion from a hash. Does not validate the hash. - * @param {string} hash Hash to extract the salt from - * @returns {string} Extracted salt part - * @throws {Error} If `hash` is not a string or otherwise invalid - */ -bcrypt.getSalt = function(hash) { - if (typeof hash !== 'string') - throw Error("Illegal arguments: "+(typeof hash)); - if (hash.length !== 60) - throw Error("Illegal hash length: "+hash.length+" != 60"); - return hash.substring(0, 29); -}; - -//? include("bcrypt/util.js"); - -//? include("bcrypt/impl.js"); - -/** - * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. - * @function - * @param {!Array.} b Byte array - * @param {number} len Maximum input length - * @returns {string} - */ -bcrypt.encodeBase64 = base64_encode; - -/** - * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. - * @function - * @param {string} s String to decode - * @param {number} len Maximum output length - * @returns {!Array.} - */ -bcrypt.decodeBase64 = base64_decode; diff --git a/src/bcrypt/impl.js b/src/bcrypt/impl.js deleted file mode 100644 index fb00aee..0000000 --- a/src/bcrypt/impl.js +++ /dev/null @@ -1,669 +0,0 @@ -/** - * @type {number} - * @const - * @inner - */ -var BCRYPT_SALT_LEN = 16; - -/** - * @type {number} - * @const - * @inner - */ -var GENSALT_DEFAULT_LOG2_ROUNDS = 10; - -/** - * @type {number} - * @const - * @inner - */ -var BLOWFISH_NUM_ROUNDS = 16; - -/** - * @type {number} - * @const - * @inner - */ -var MAX_EXECUTION_TIME = 100; - -/** - * @type {Array.} - * @const - * @inner - */ -var P_ORIG = [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, - 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, - 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, - 0xb5470917, 0x9216d5d9, 0x8979fb1b -]; - -/** - * @type {Array.} - * @const - * @inner - */ -var S_ORIG = [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, - 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, - 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, - 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, - 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, - 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, - 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, - 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, - 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, - 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, - 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, - 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, - 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, - 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, - 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, - 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, - 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, - 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, - 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, - 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, - 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, - 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, - 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, - 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, - 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, - 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, - 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, - 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, - 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, - 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, - 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, - 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, - 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, - 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, - 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, - 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, - 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, - 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, - 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, - 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, - 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, - 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, - 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, - 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, - 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, - 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, - 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, - 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, - 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, - 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, - 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, - 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, - 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, - 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, - 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, - 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, - 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, - 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, - 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, - 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, - 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, - 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, - 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, - 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, - 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, - 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, - 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, - 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, - 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, - 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, - 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, - 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, - 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, - 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, - 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, - 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, - 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, - 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, - 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, - 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, - 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, - 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, - 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, - 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, - 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, - 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, - 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, - 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, - 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, - 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, - 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, - 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, - 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, - 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, - 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, - 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, - 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, - 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, - 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, - 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, - 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, - 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, - 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, - 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, - 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, - 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, - 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, - 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, - 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, - 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, - 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, - 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, - 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, - 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, - 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, - 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, - 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, - 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, - 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, - 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, - 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, - 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, - 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, - 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, - 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, - 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, - 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, - 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, - 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, - 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, - 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, - 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, - 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, - 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, - 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, - 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, - 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, - 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, - 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, - 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, - 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, - 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, - 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, - 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, - 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, - 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, - 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, - 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, - 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, - 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, - 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, - 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, - 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, - 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, - 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, - 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, - 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, - 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, - 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, - 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, - 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, - 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, - 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, - 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, - 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, - 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, - 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 -]; - -/** - * @type {Array.} - * @const - * @inner - */ -var C_ORIG = [ - 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, - 0x6f756274 -]; - -/** - * @param {Array.} lr - * @param {number} off - * @param {Array.} P - * @param {Array.} S - * @returns {Array.} - * @inner - */ -function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt - var n, - l = lr[off], - r = lr[off + 1]; - - l ^= P[0]; - - /* - for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) - // Feistel substitution on left word - n = S[l >>> 24], - n += S[0x100 | ((l >> 16) & 0xff)], - n ^= S[0x200 | ((l >> 8) & 0xff)], - n += S[0x300 | (l & 0xff)], - r ^= n ^ P[++i], - // Feistel substitution on right word - n = S[r >>> 24], - n += S[0x100 | ((r >> 16) & 0xff)], - n ^= S[0x200 | ((r >> 8) & 0xff)], - n += S[0x300 | (r & 0xff)], - l ^= n ^ P[++i]; - */ - - //The following is an unrolled version of the above loop. - //Iteration 0 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[1]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[2]; - //Iteration 1 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[3]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[4]; - //Iteration 2 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[5]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[6]; - //Iteration 3 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[7]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[8]; - //Iteration 4 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[9]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[10]; - //Iteration 5 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[11]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[12]; - //Iteration 6 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[13]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[14]; - //Iteration 7 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[15]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[16]; - - lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; - lr[off + 1] = l; - return lr; -} - -/** - * @param {Array.} data - * @param {number} offp - * @returns {{key: number, offp: number}} - * @inner - */ -function _streamtoword(data, offp) { - for (var i = 0, word = 0; i < 4; ++i) - word = (word << 8) | (data[offp] & 0xff), - offp = (offp + 1) % data.length; - return { key: word, offp: offp }; -} - -/** - * @param {Array.} key - * @param {Array.} P - * @param {Array.} S - * @inner - */ -function _key(key, P, S) { - var offset = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offset), - offset = sw.offp, - P[i] = P[i] ^ sw.key; - for (i = 0; i < plen; i += 2) - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; -} - -/** - * Expensive key schedule Blowfish. - * @param {Array.} data - * @param {Array.} key - * @param {Array.} P - * @param {Array.} S - * @inner - */ -function _ekskey(data, key, P, S) { - var offp = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offp), - offp = sw.offp, - P[i] = P[i] ^ sw.key; - offp = 0; - for (i = 0; i < plen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; -} - -/** - * Internaly crypts a string. - * @param {Array.} b Bytes to crypt - * @param {Array.} salt Salt bytes to use - * @param {number} rounds Number of rounds - * @param {function(Error, Array.=)=} callback Callback receiving the error, if any, and the resulting bytes. If - * omitted, the operation will be performed synchronously. - * @param {function(number)=} progressCallback Callback called with the current progress - * @returns {!Array.|undefined} Resulting bytes if callback has been omitted, otherwise `undefined` - * @inner - */ -function _crypt(b, salt, rounds, callback, progressCallback) { - var cdata = C_ORIG.slice(), - clen = cdata.length, - err; - - // Validate - if (rounds < 4 || rounds > 31) { - err = Error("Illegal number of rounds (4-31): "+rounds); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - if (salt.length !== BCRYPT_SALT_LEN) { - err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - rounds = (1 << rounds) >>> 0; - - var P, S, i = 0, j; - - //Use typed arrays when available - huge speedup! - if (Int32Array) { - P = new Int32Array(P_ORIG); - S = new Int32Array(S_ORIG); - } else { - P = P_ORIG.slice(); - S = S_ORIG.slice(); - } - - _ekskey(salt, b, P, S); - - /** - * Calcualtes the next round. - * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` - * @inner - */ - function next() { - if (progressCallback) - progressCallback(i / rounds); - if (i < rounds) { - var start = Date.now(); - for (; i < rounds;) { - i = i + 1; - _key(b, P, S); - _key(salt, P, S); - if (Date.now() - start > MAX_EXECUTION_TIME) - break; - } - } else { - for (i = 0; i < 64; i++) - for (j = 0; j < (clen >> 1); j++) - _encipher(cdata, j << 1, P, S); - var ret = []; - for (i = 0; i < clen; i++) - ret.push(((cdata[i] >> 24) & 0xff) >>> 0), - ret.push(((cdata[i] >> 16) & 0xff) >>> 0), - ret.push(((cdata[i] >> 8) & 0xff) >>> 0), - ret.push((cdata[i] & 0xff) >>> 0); - if (callback) { - callback(null, ret); - return; - } else - return ret; - } - if (callback) - nextTick(next); - } - - // Async - if (typeof callback !== 'undefined') { - next(); - - // Sync - } else { - var res; - while (true) - if (typeof(res = next()) !== 'undefined') - return res || []; - } -} - -/** - * Internally hashes a string. - * @param {string} s String to hash - * @param {?string} salt Salt to use, actually never null - * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, - * hashing is perormed synchronously. - * @param {function(number)=} progressCallback Callback called with the current progress - * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` - * @inner - */ -function _hash(s, salt, callback, progressCallback) { - var err; - if (typeof s !== 'string' || typeof salt !== 'string') { - err = Error("Invalid string / salt: Not a string"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - - // Validate the salt - var minor, offset; - if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') { - err = Error("Invalid salt version: "+salt.substring(0,2)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - if (salt.charAt(2) === '$') - minor = String.fromCharCode(0), - offset = 3; - else { - minor = salt.charAt(2); - if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') { - err = Error("Invalid salt revision: "+salt.substring(2,4)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - offset = 4; - } - - // Extract number of rounds - if (salt.charAt(offset + 2) > '$') { - err = Error("Missing salt rounds"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, - r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), - rounds = r1 + r2, - real_salt = salt.substring(offset + 3, offset + 25); - s += minor >= 'a' ? "\x00" : ""; - - var passwordb = stringToBytes(s), - saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); - - /** - * Finishes hashing. - * @param {Array.} bytes Byte array - * @returns {string} - * @inner - */ - function finish(bytes) { - var res = []; - res.push("$2"); - if (minor >= 'a') - res.push(minor); - res.push("$"); - if (rounds < 10) - res.push("0"); - res.push(rounds.toString()); - res.push("$"); - res.push(base64_encode(saltb, saltb.length)); - res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); - return res.join(''); - } - - // Sync - if (typeof callback == 'undefined') - return finish(_crypt(passwordb, saltb, rounds)); - - // Async - else { - _crypt(passwordb, saltb, rounds, function(err, bytes) { - if (err) - callback(err, null); - else - callback(null, finish(bytes)); - }, progressCallback); - } -} diff --git a/src/bcrypt/prng/README.md b/src/bcrypt/prng/README.md deleted file mode 100644 index 4735aa6..0000000 --- a/src/bcrypt/prng/README.md +++ /dev/null @@ -1,5 +0,0 @@ -Because of [reasonable security doubts](https://github.com/dcodeIO/bcrypt.js/issues/16), these files, which used to be -a part of bcrypt-isaac.js, are no longer used but are kept here for reference only. - -What is required instead is a proper way to collect entropy sources (using an intermediate stream cipher) which is then -used to seed the CSPRNG. Pick one and use `bcrypt.setRandomFallback` instead. diff --git a/src/bcrypt/prng/accum.js b/src/bcrypt/prng/accum.js deleted file mode 100644 index 8ea7773..0000000 --- a/src/bcrypt/prng/accum.js +++ /dev/null @@ -1,133 +0,0 @@ -/* basic entropy accumulator */ -var accum = (function() { - - var pool, // randomness pool - time, // start timestamp - last; // last step timestamp - - /* initialize with default pool */ - function init() { - pool = []; - time = new Date().getTime(); - last = time; - // use Math.random - pool.push((Math.random() * 0xffffffff)|0); - // use current time - pool.push(time|0); - } - - /* perform one step */ - function step() { - if (!to) - return; - if (pool.length >= 255) { // stop at 255 values (1 more is added on fetch) - stop(); - return; - } - var now = new Date().getTime(); - // use actual time difference - pool.push(now-last); - // always compute, occasionally use Math.random - var rnd = (Math.random() * 0xffffffff)|0; - if (now % 2) - pool[pool.length-1] += rnd; - last = now; - to = setTimeout(step, 100+Math.random()*512); // use hypothetical time difference - } - - var to = null; - - /* starts accumulating */ - function start() { - if (to) return; - to = setTimeout(step, 100+Math.random()*512); - if (console.log) - console.log("bcrypt-isaac: collecting entropy..."); - // install collectors - if (typeof window !== 'undefined' && window && window.addEventListener) - window.addEventListener("load", loadCollector, false), - window.addEventListener("mousemove", mouseCollector, false), - window.addEventListener("touchmove", touchCollector, false); - else if (typeof document !== 'undefined' && document && document.attachEvent) - document.attachEvent("onload", loadCollector), - document.attachEvent("onmousemove", mouseCollector); - } - - /* stops accumulating */ - function stop() { - if (!to) return; - clearTimeout(to); to = null; - // uninstall collectors - if (typeof window !== 'undefined' && window && window.removeEventListener) - window.removeEventListener("load", loadCollector, false), - window.removeEventListener("mousemove", mouseCollector, false), - window.removeEventListener("touchmove", touchCollector, false); - else if (typeof document !== 'undefined' && document && document.detachEvent) - document.detachEvent("onload", loadCollector), - document.detachEvent("onmousemove", mouseCollector); - } - - /* fetches the randomness pool */ - function fetch() { - // add overall time difference - pool.push((new Date().getTime()-time)|0); - var res = pool; - init(); - if (console.log) - console.log("bcrypt-isaac: using "+res.length+"/256 samples of entropy"); - // console.log(res); - return res; - } - - /* adds the current time to the top of the pool */ - function addTime() { - pool[pool.length-1] += new Date().getTime() - time; - } - - /* page load collector */ - function loadCollector() { - if (!to || pool.length >= 255) - return; - pool.push(0); - addTime(); - } - - /* mouse events collector */ - function mouseCollector(ev) { - if (!to || pool.length >= 255) - return; - try { - var x = ev.x || ev.clientX || ev.offsetX || 0, - y = ev.y || ev.clientY || ev.offsetY || 0; - if (x != 0 || y != 0) - pool[pool.length-1] += ((x-mouseCollector.last[0]) ^ (y-mouseCollector.last[1])), - addTime(), - mouseCollector.last = [x,y]; - } catch (e) {} - } - mouseCollector.last = [0,0]; - - /* touch events collector */ - function touchCollector(ev) { - if (!to || pool.length >= 255) - return; - try { - var touch = ev.touches[0] || ev.changedTouches[0]; - var x = touch.pageX || touch.clientX || 0, - y = touch.pageY || touch.clientY || 0; - if (x != 0 || y != 0) - pool[pool.length-1] += (x-touchCollector.last[0]) ^ (y-touchCollector.last[1]), - addTime(), - touchCollector.last = [x,y]; - } catch (e) {} - } - touchCollector.last = [0,0]; - - init(); - return { - "start": start, - "stop": stop, - "fetch": fetch - } - -})(); diff --git a/src/bcrypt/prng/isaac.js b/src/bcrypt/prng/isaac.js deleted file mode 100644 index e33b0e5..0000000 --- a/src/bcrypt/prng/isaac.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - isaac.js Copyright (c) 2012 Yves-Marie K. Rinquin - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -/* isaac module pattern */ -var isaac = (function(){ - - /* internal states */ - var m = Array(256), // internal memory - acc = 0, // accumulator - brs = 0, // last result - cnt = 0, // counter - r = Array(256), // result array - gnt = 0, // generation counter - isd = false; // initially seeded - - - /* 32-bit integer safe adder */ - function add(x, y) { - var lsb = (x & 0xffff) + (y & 0xffff), - msb = (x >>> 16) + (y >>> 16) + (lsb >>> 16); - return (msb << 16) | (lsb & 0xffff); - } - - /* initialisation */ - function reset() { - acc = brs = cnt = 0; - for (var i = 0; i < 256; ++i) - m[i] = r[i] = 0; - gnt = 0; - } - - /* seeding function */ - function seed(s) { - var a, b, c, d, e, f, g, h, i; - - /* seeding the seeds of love */ - a = b = c = d = e = f = g = h = 0x9e3779b9; /* the golden ratio */ - - if (s && typeof(s) === 'number') - s = [s]; - - if (s instanceof Array) { - reset(); - for (i = 0; i < s.length; ++i) - r[i & 0xff] += typeof(s[i]) === 'number' ? s[i] : 0; - } - - /* private: seed mixer */ - function seed_mix() { - a ^= b << 11; d = add(d, a); b = add(b, c); - b ^= c >>> 2; e = add(e, b); c = add(c, d); - c ^= d << 8; f = add(f, c); d = add(d, e); - d ^= e >>> 16; g = add(g, d); e = add(e, f); - e ^= f << 10; h = add(h, e); f = add(f, g); - f ^= g >>> 4; a = add(a, f); g = add(g, h); - g ^= h << 8; b = add(b, g); h = add(h, a); - h ^= a >>> 9; c = add(c, h); a = add(a, b); - } - - for (i = 0; i < 4; i++) /* scramble it */ - seed_mix(); - - for (i = 0; i < 256; i += 8) { - if (s) /* use all the information in the seed */ - a = add(a, r[i + 0]), b = add(b, r[i + 1]), - c = add(c, r[i + 2]), d = add(d, r[i + 3]), - e = add(e, r[i + 4]), f = add(f, r[i + 5]), - g = add(g, r[i + 6]), h = add(h, r[i + 7]); - seed_mix(); - /* fill in m[] with messy stuff */ - m[i + 0] = a; m[i + 1] = b; m[i + 2] = c; m[i + 3] = d; - m[i + 4] = e; m[i + 5] = f; m[i + 6] = g; m[i + 7] = h; - } - if (s) - /* do a second pass to make all of the seed affect all of m[] */ - for (i = 0; i < 256; i += 8) - a = add(a, m[i + 0]), b = add(b, m[i + 1]), - c = add(c, m[i + 2]), d = add(d, m[i + 3]), - e = add(e, m[i + 4]), f = add(f, m[i + 5]), - g = add(g, m[i + 6]), h = add(h, m[i + 7]), - seed_mix(), - /* fill in m[] with messy stuff (again) */ - m[i + 0] = a, m[i + 1] = b, m[i + 2] = c, m[i + 3] = d, - m[i + 4] = e, m[i + 5] = f, m[i + 6] = g, m[i + 7] = h; - prng(); /* fill in the first set of results */ - gnt = 256; /* prepare to use the first set of results */; - } - - /* isaac generator, n = number of run */ - function prng(n) { - var i, x, y; - n = n && typeof(n) === 'number' ? Math.abs(Math.floor(n)) : 1; - while (n--) { - cnt = add(cnt, 1); - brs = add(brs, cnt); - for(i = 0; i < 256; i++) { - switch(i & 3) { - case 0: acc ^= acc << 13; break; - case 1: acc ^= acc >>> 6; break; - case 2: acc ^= acc << 2; break; - case 3: acc ^= acc >>> 16; break; - } - acc = add(m[(i + 128) & 0xff], acc); x = m[i]; - m[i] = y = add(m[(x >>> 2) & 0xff], add(acc, brs)); - r[i] = brs = add(m[(y >>> 10) & 0xff], x); - } - } - } - - /* return a random number between */ - return function() { - if (!isd) // seed from accumulator - isd = true, - accum.stop(), - seed(accum.fetch()); - if (!gnt--) - prng(), gnt = 255; - return r[gnt]; - }; -})(); diff --git a/src/bcrypt/util.js b/src/bcrypt/util.js deleted file mode 100644 index 28b82e9..0000000 --- a/src/bcrypt/util.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Continues with the callback on the next tick. - * @function - * @param {function(...[*])} callback Callback to execute - * @inner - */ -var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function' - ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick) - : setTimeout; - -//? include("util/utf8.js"); - -/** - * Converts a JavaScript string to UTF8 bytes. - * @function - * @param {string} str String - * @returns {!Array.} UTF8 bytes - * @inner - */ -var stringToBytes = utf8Array; - -//? include("util/base64.js"); - -Date.now = Date.now || function() { return +new Date; }; diff --git a/src/bcrypt/util/base64.js b/src/bcrypt/util/base64.js deleted file mode 100644 index deda4af..0000000 --- a/src/bcrypt/util/base64.js +++ /dev/null @@ -1,115 +0,0 @@ -// A base64 implementation for the bcrypt algorithm. This is partly non-standard. - -/** - * bcrypt's own non-standard base64 dictionary. - * @type {!Array.} - * @const - * @inner - **/ -var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(''); - -/** - * @type {!Array.} - * @const - * @inner - **/ -var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, - 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, - -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1]; - -/** - * @type {!function(...number):string} - * @inner - */ -var stringFromCharCode = String.fromCharCode; - -/** - * Encodes a byte array to base64 with up to len bytes of input. - * @param {!Array.} b Byte array - * @param {number} len Maximum input length - * @returns {string} - * @inner - */ -function base64_encode(b, len) { - var off = 0, - rs = [], - c1, c2; - if (len <= 0 || len > b.length) - throw Error("Illegal len: "+len); - while (off < len) { - c1 = b[off++] & 0xff; - rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); - c1 = (c1 & 0x03) << 4; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 4) & 0x0f; - rs.push(BASE64_CODE[c1 & 0x3f]); - c1 = (c2 & 0x0f) << 2; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 6) & 0x03; - rs.push(BASE64_CODE[c1 & 0x3f]); - rs.push(BASE64_CODE[c2 & 0x3f]); - } - return rs.join(''); -} - -/** - * Decodes a base64 encoded string to up to len bytes of output. - * @param {string} s String to decode - * @param {number} len Maximum output length - * @returns {!Array.} - * @inner - */ -function base64_decode(s, len) { - var off = 0, - slen = s.length, - olen = 0, - rs = [], - c1, c2, c3, c4, o, code; - if (len <= 0) - throw Error("Illegal len: "+len); - while (off < slen - 1 && olen < len) { - code = s.charCodeAt(off++); - c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - code = s.charCodeAt(off++); - c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c1 == -1 || c2 == -1) - break; - o = (c1 << 2) >>> 0; - o |= (c2 & 0x30) >> 4; - rs.push(stringFromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c3 == -1) - break; - o = ((c2 & 0x0f) << 4) >>> 0; - o |= (c3 & 0x3c) >> 2; - rs.push(stringFromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - o = ((c3 & 0x03) << 6) >>> 0; - o |= c4; - rs.push(stringFromCharCode(o)); - ++olen; - } - var res = []; - for (off = 0; off> 6 | 192; - buffer[offset++] = c1 & 63 | 128; - } else if ( - ( c1 & 0xFC00) === 0xD800 && - ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00 - ) { - c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); - ++i; - buffer[offset++] = c1 >> 18 | 240; - buffer[offset++] = c1 >> 12 & 63 | 128; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } else { - buffer[offset++] = c1 >> 12 | 224; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } - } - return buffer; -} diff --git a/src/bower.json.template b/src/bower.json.template deleted file mode 100644 index a1f2968..0000000 --- a/src/bower.json.template +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "bcryptjs", - "description": "Optimized bcrypt in plain JavaScript with zero dependencies.", - "version": /*?== VERSION */, - "main": "dist/bcrypt.min.js", - "license": "New-BSD", - "homepage": "http://dcode.io/", - "repository": { - "type": "git", - "url": "git://github.com/dcodeIO/bcrypt.js.git" - }, - "keywords": ["bcrypt", "password", "auth", "authentication", "encryption", "crypt", "crypto"], - "dependencies": {}, - "devDependencies": {}, - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/src/wrap.js b/src/wrap.js deleted file mode 100644 index 561b8c3..0000000 --- a/src/wrap.js +++ /dev/null @@ -1,50 +0,0 @@ -//? if (typeof ISAAC === 'undefined') ISAAC = false; -/* - Copyright (c) 2012 Nevins Bartolomeo - Copyright (c) 2012 Shane Girish - Copyright (c) 2014 Daniel Wirtz - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @license bcrypt.js (c) 2013 Daniel Wirtz - * Released under the Apache License, Version 2.0 - * see: https://github.com/dcodeIO/bcrypt.js for details - */ -(function(global, factory) { - - /* AMD */ if (typeof define === 'function' && define["amd"]) - define([], factory); - /* CommonJS */ else if (typeof require === 'function' && typeof module === "object" && module && module["exports"]) - module["exports"] = factory(); - /* Global */ else - (global["dcodeIO"] = global["dcodeIO"] || {})["bcrypt"] = factory(); - -}(this, function() { - "use strict"; - - //? include("bcrypt.js"); - - return bcrypt; -})); diff --git a/tests/bench.js b/tests/bench.js index 7f492f2..9eb05e0 100644 --- a/tests/bench.js +++ b/tests/bench.js @@ -1,7 +1,8 @@ -var bcrypt = require("bcrypt"), - bcryptjs = require("../index.js"), - pass = "ä☺𠜎️☁", - testRounds = [8, 9, 10, 11, 12, 13, 14, 15]; +import bcrypt from "bcrypt"; +import bcryptjs from "../index.js"; + +const pass = "ä☺𠜎️☁"; +const testRounds = [8, 9, 10, 11, 12, 13, 14, 15]; function testSync(name, salt, impl) { var res; diff --git a/tests/index.js b/tests/index.js new file mode 100644 index 0000000..d8bc296 --- /dev/null +++ b/tests/index.js @@ -0,0 +1,189 @@ +import path from "node:path"; +import fs from "node:fs"; +import assert from "node:assert"; +import { fileURLToPath } from 'node:url'; + +import binding from "bcrypt"; +import bcrypt from "../index.js"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const tests = [ + function encodeBase64(done) { + var str = bcrypt.encodeBase64([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10], 16); + assert.strictEqual(str, "..CA.uOD/eaGAOmJB.yMBu"); + done() + }, + function decodeBase64(done) { + var bytes = bcrypt.decodeBase64("..CA.uOD/eaGAOmJB.yMBv.", 16); + assert.deepEqual(bytes, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]); + done() + }, + function genSaltSync(done) { + var salt = bcrypt.genSaltSync(10); + assert(salt); + assert(typeof salt === 'string'); + assert(salt.length > 0); + done() + }, + function genSalt(done) { + bcrypt.genSalt(10, function(err, salt) { + assert(!err); + assert(salt); + assert(typeof salt === 'string'); + assert(salt.length > 0); + done(); + }); + }, + function hashSync(done) { + assert.doesNotThrow(function() { + bcrypt.hashSync("hello", 10); + }); + assert.notEqual(bcrypt.hashSync("hello", 10), bcrypt.hashSync("hello", 10)); + done(); + }, + function hash(done) { + bcrypt.hash("hello", 10, function(err, hash) { + assert(!err); + assert(hash); + done(); + }); + }, + function compareSync(done) { + var salt1 = bcrypt.genSaltSync(), + hash1 = bcrypt.hashSync("hello", salt1); // $2a$ + var salt2 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2y$"), + hash2 = bcrypt.hashSync("world", salt2); + var salt3 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2b$"), + hash3 = bcrypt.hashSync("hello world", salt3); + + assert.strictEqual(hash1.substring(0,4), "$2a$"); + assert(bcrypt.compareSync("hello", hash1)); + assert(!bcrypt.compareSync("hello", hash2)); + assert(!bcrypt.compareSync("hello", hash3)); + + assert.strictEqual(hash2.substring(0,4), "$2y$"); + assert(bcrypt.compareSync("world", hash2)); + assert(!bcrypt.compareSync("world", hash1)); + assert(!bcrypt.compareSync("world", hash3)); + + assert.strictEqual(hash3.substring(0,4), "$2b$"); + assert(bcrypt.compareSync("hello world", hash3)); + assert(!bcrypt.compareSync("hello world", hash1)); + assert(!bcrypt.compareSync("hello world", hash2)); + + done(); + }, + function compare(done) { + var salt1 = bcrypt.genSaltSync(), + hash1 = bcrypt.hashSync("hello", salt1); // $2a$ + var salt2 = bcrypt.genSaltSync(); + salt2 = salt2.substring(0,2)+'y'+salt2.substring(3); // $2y$ + var hash2 = bcrypt.hashSync("world", salt2); + bcrypt.compare("hello", hash1, function(err, same) { + assert(!err); + assert(same); + bcrypt.compare("hello", hash2, function(err, same) { + assert(!err); + assert(!same); + bcrypt.compare("world", hash2, function(err, same) { + assert(!err); + assert(same); + bcrypt.compare("world", hash1, function(err, same) { + assert(!err); + assert(!same); + done(); + }); + }); + }); + }); + }, + function getSalt(done) { + var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); + var salt = bcrypt.getSalt(hash1); + var hash2 = bcrypt.hashSync("hello", salt); + assert.equal(hash1, hash2); + done(); + }, + function getRounds(done) { + var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); + assert.equal(bcrypt.getRounds(hash1), 10); + done(); + }, + function progress(done) { + bcrypt.genSalt(12, function(err, salt) { + assert(!err); + var progress = []; + bcrypt.hash("hello world", salt, function(err, hash) { + assert(!err); + assert(typeof hash === 'string'); + assert(progress.length >= 2); + assert.strictEqual(progress[0], 0); + assert.strictEqual(progress[progress.length-1], 1); + done(); + }, function(n) { + progress.push(n); + }); + }); + }, + function promise(done) { + bcrypt.genSalt(10) + .then(function(salt) { + bcrypt.hash("hello", salt) + .then(function(hash) { + assert(hash); + bcrypt.compare("hello", hash) + .then(function(result) { + assert(result); + bcrypt.genSalt(/* no args */) + .then(function(salt) { + assert(salt); + done(); + }, function(err) { + assert(false); + }); + }, function(err) { + assert(false); + }); + }, function(err) { + assert(false); + }); + }, function(err) { + assert(false); + }); + }, + function compat_quickbrown(done) { + var pass = fs.readFileSync(path.join(__dirname, "quickbrown.txt"))+"", + salt = bcrypt.genSaltSync(), + hash1 = binding.hashSync(pass, salt), + hash2 = bcrypt.hashSync(pass, salt); + assert.equal(hash1, hash2); + done(); + }, + // function compat_roundsOOB(done) { + // var salt1 = bcrypt.genSaltSync(0), // $10$ like not set + // salt2 = binding.genSaltSync(0); + // assert.strictEqual(salt1.substring(0, 7), "$2a$10$"); + // assert.strictEqual(salt2.substring(0, 7), "$2a$10$"); + + // salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap + // salt2 = bcrypt.genSaltSync(3); + // assert.strictEqual(salt1.substring(0, 7), "$2a$04$"); + // assert.strictEqual(salt2.substring(0, 7), "$2a$04$"); + + // salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap + // salt2 = bcrypt.genSaltSync(32); + // assert.strictEqual(salt1.substring(0, 7), "$2a$31$"); + // assert.strictEqual(salt2.substring(0, 7), "$2a$31$"); + + // done(); + // } +] + +function next() { + if (!tests.length) return + var test = tests.shift(); + console.log(test.name); + test(next); +} +next(); diff --git a/tests/suite.js b/tests/suite.js deleted file mode 100644 index 8c8afe1..0000000 --- a/tests/suite.js +++ /dev/null @@ -1,197 +0,0 @@ -var path = require("path"), - fs = require("fs"), - binding = require("bcrypt"), - bcrypt = require(path.join(__dirname, '..', 'index.js'))/*, - isaac = eval( - fs.readFileSync(path.join(__dirname, "..", "src", "bcrypt", "prng", "accum.js"))+ - fs.readFileSync(path.join(__dirname, "..", "src", "bcrypt", "prng", "isaac.js"))+ - " accum.start();"+ - " isaac" - )*/; - -module.exports = { - - "encodeBase64": function(test) { - var str = bcrypt.encodeBase64([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10], 16); - test.strictEqual(str, "..CA.uOD/eaGAOmJB.yMBu"); - test.done(); - }, - - "decodeBase64": function(test) { - var bytes = bcrypt.decodeBase64("..CA.uOD/eaGAOmJB.yMBv.", 16); - test.deepEqual(bytes, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]); - test.done(); - }, - - "genSaltSync": function(test) { - var salt = bcrypt.genSaltSync(10); - test.ok(salt); - test.ok(typeof salt == 'string'); - test.ok(salt.length > 0); - test.done(); - }, - - "genSalt": function(test) { - bcrypt.genSalt(10, function(err, salt) { - test.ok(salt); - test.ok(typeof salt == 'string'); - test.ok(salt.length > 0); - test.done(); - }); - }, - - "hashSync": function(test) { - test.doesNotThrow(function() { - bcrypt.hashSync("hello", 10); - }); - test.notEqual(bcrypt.hashSync("hello", 10), bcrypt.hashSync("hello", 10)); - test.done(); - }, - - "hash": function(test) { - bcrypt.hash("hello", 10, function(err, hash) { - test.notOk(err); - test.ok(hash); - test.done(); - }); - }, - - "compareSync": function(test) { - var salt1 = bcrypt.genSaltSync(), - hash1 = bcrypt.hashSync("hello", salt1); // $2a$ - var salt2 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2y$"), - hash2 = bcrypt.hashSync("world", salt2); - var salt3 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2b$"), - hash3 = bcrypt.hashSync("hello world", salt3); - - test.strictEqual(hash1.substring(0,4), "$2a$"); - test.ok(bcrypt.compareSync("hello", hash1)); - test.notOk(bcrypt.compareSync("hello", hash2)); - test.notOk(bcrypt.compareSync("hello", hash3)); - - test.strictEqual(hash2.substring(0,4), "$2y$"); - test.ok(bcrypt.compareSync("world", hash2)); - test.notOk(bcrypt.compareSync("world", hash1)); - test.notOk(bcrypt.compareSync("world", hash3)); - - test.strictEqual(hash3.substring(0,4), "$2b$"); - test.ok(bcrypt.compareSync("hello world", hash3)); - test.notOk(bcrypt.compareSync("hello world", hash1)); - test.notOk(bcrypt.compareSync("hello world", hash2)); - - test.done(); - }, - - "compare": function(test) { - var salt1 = bcrypt.genSaltSync(), - hash1 = bcrypt.hashSync("hello", salt1); // $2a$ - var salt2 = bcrypt.genSaltSync(); - salt2 = salt2.substring(0,2)+'y'+salt2.substring(3); // $2y$ - var hash2 = bcrypt.hashSync("world", salt2); - bcrypt.compare("hello", hash1, function(err, same) { - test.notOk(err); - test.ok(same); - bcrypt.compare("hello", hash2, function(err, same) { - test.notOk(err); - test.notOk(same); - bcrypt.compare("world", hash2, function(err, same) { - test.notOk(err); - test.ok(same); - bcrypt.compare("world", hash1, function(err, same) { - test.notOk(err); - test.notOk(same); - test.done(); - }); - }); - }); - }); - }, - - "getSalt": function(test) { - var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); - var salt = bcrypt.getSalt(hash1); - var hash2 = bcrypt.hashSync("hello", salt); - test.equal(hash1, hash2); - test.done(); - }, - - "getRounds": function(test) { - var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); - test.equal(bcrypt.getRounds(hash1), 10); - test.done(); - }, - - "progress": function(test) { - bcrypt.genSalt(12, function(err, salt) { - test.ok(!err); - var progress = []; - bcrypt.hash("hello world", salt, function(err, hash) { - test.ok(!err); - test.ok(typeof hash === 'string'); - test.ok(progress.length >= 2); - test.strictEqual(progress[0], 0); - test.strictEqual(progress[progress.length-1], 1); - test.done(); - }, function(n) { - progress.push(n); - }); - }); - }, - - "promise": function(test) { - bcrypt.genSalt(10) - .then(function(salt) { - bcrypt.hash("hello", salt) - .then(function(hash) { - test.ok(hash); - bcrypt.compare("hello", hash) - .then(function(result) { - test.ok(result); - bcrypt.genSalt(/* no args */) - .then(function(salt) { - test.ok(salt); - test.done(); - }, function(err) { - test.fail(err, null, "promise rejected"); - }); - }, function(err) { - test.fail(err, null, "promise rejected"); - }); - }, function(err) { - test.fail(err, null, 'promise rejected'); - }); - }, function(err) { - test.fail(err, null, "promise rejected"); - }); - }, - - "compat": { - "quickbrown": function(test) { - var pass = fs.readFileSync(path.join(__dirname, "quickbrown.txt"))+"", - salt = bcrypt.genSaltSync(), - hash1 = binding.hashSync(pass, salt), - hash2 = bcrypt.hashSync(pass, salt); - test.equal(hash1, hash2); - test.done(); - }, - - "roundsOOB": function(test) { - var salt1 = bcrypt.genSaltSync(0), // $10$ like not set - salt2 = binding.genSaltSync(0); - test.strictEqual(salt1.substring(0, 7), "$2a$10$"); - test.strictEqual(salt2.substring(0, 7), "$2a$10$"); - - salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap - salt2 = bcrypt.genSaltSync(3); - test.strictEqual(salt1.substring(0, 7), "$2a$04$"); - test.strictEqual(salt2.substring(0, 7), "$2a$04$"); - - salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap - salt2 = bcrypt.genSaltSync(32); - test.strictEqual(salt1.substring(0, 7), "$2a$31$"); - test.strictEqual(salt2.substring(0, 7), "$2a$31$"); - - test.done(); - } - } -}; diff --git a/tests/typescript/test-import.ts b/tests/typescript/test-import.ts new file mode 100644 index 0000000..fab9502 --- /dev/null +++ b/tests/typescript/test-import.ts @@ -0,0 +1,6 @@ +import bcrypt, { hashSync } from '../../index.js'; + +bcrypt.hashSync('test'); +hashSync('test'); + +export default bcrypt; diff --git a/tests/typescript/test-require.ts b/tests/typescript/test-require.ts new file mode 100644 index 0000000..76a3ed1 --- /dev/null +++ b/tests/typescript/test-require.ts @@ -0,0 +1,5 @@ +import bcrypt = require("../../umd/index.js"); + +bcrypt.hashSync('test'); + +export = bcrypt; diff --git a/tests/typescript/tsconfig.base.json b/tests/typescript/tsconfig.base.json new file mode 100644 index 0000000..2b38a3b --- /dev/null +++ b/tests/typescript/tsconfig.base.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ESNext", + "noEmit": true + } +} diff --git a/tests/typescript/tsconfig.commonjs.json b/tests/typescript/tsconfig.commonjs.json new file mode 100644 index 0000000..4bcb890 --- /dev/null +++ b/tests/typescript/tsconfig.commonjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "node10" + }, + "include": ["./test-require.ts"] +} diff --git a/tests/typescript/tsconfig.esnext.json b/tests/typescript/tsconfig.esnext.json new file mode 100644 index 0000000..d4d907b --- /dev/null +++ b/tests/typescript/tsconfig.esnext.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + }, + "include": ["./test-import.ts"] +} diff --git a/tests/typescript/tsconfig.json b/tests/typescript/tsconfig.json new file mode 100644 index 0000000..88a731f --- /dev/null +++ b/tests/typescript/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.commonjs.json" +} diff --git a/tests/typescript/tsconfig.nodenext.json b/tests/typescript/tsconfig.nodenext.json new file mode 100644 index 0000000..823d527 --- /dev/null +++ b/tests/typescript/tsconfig.nodenext.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "nodenext", + }, + "include": ["./test-import.ts"] +} diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..742048c --- /dev/null +++ b/types.d.ts @@ -0,0 +1,150 @@ +// imported from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/bcryptjs/index.d.ts + +/* +MIT License + +Copyright (c) Microsoft Corporation. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE +*/ + +/** + * Sets the pseudo random number generator to use as a fallback if neither node's crypto module nor the Web Crypto API is available. + * Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! + * @param random Function taking the number of bytes to generate as its sole argument, returning the corresponding array of cryptographically secure random byte values. + */ +export declare function setRandomFallback(random: (random: number) => number[]): void; + +/** + * Synchronously generates a salt. + * @param rounds Number of rounds to use, defaults to 10 if omitted + * @return Resulting salt + * @throws If a random fallback is required but not set + */ +export declare function genSaltSync(rounds?: number): string; + +/** + * Asynchronously generates a salt. + * @param rounds Number of rounds to use, defaults to 10 if omitted + * @return Promise with resulting salt, if callback has been omitted + */ +export declare function genSalt(rounds?: number): Promise; + +/** + * Asynchronously generates a salt. + * @param callback Callback receiving the error, if any, and the resulting salt + */ +export declare function genSalt(callback: (err: Error | null, salt: string) => void): void; + +/** + * Asynchronously generates a salt. + * @param rounds Number of rounds to use, defaults to 10 if omitted + * @param callback Callback receiving the error, if any, and the resulting salt + */ +export declare function genSalt(rounds: number, callback: (err: Error | null, salt: string) => void): void; + +/** + * Synchronously generates a hash for the given string. + * @param s String to hash + * @param salt Salt length to generate or salt to use, default to 10 + * @return Resulting hash + */ +export declare function hashSync(s: string, salt?: number | string): string; + +/** + * Asynchronously generates a hash for the given string. + * @param s String to hash + * @param salt Salt length to generate or salt to use + * @return Promise with resulting hash, if callback has been omitted + */ +export declare function hash(s: string, salt: number | string): Promise; + +/** + * Asynchronously generates a hash for the given string. + * @param s String to hash + * @param salt Salt length to generate or salt to use + * @param callback Callback receiving the error, if any, and the resulting hash + * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. + */ +export declare function hash( + s: string, + salt: number | string, + callback?: (err: Error | null, hash: string) => void, + progressCallback?: (percent: number) => void, +): void; + +/** + * Synchronously tests a string against a hash. + * @param s String to compare + * @param hash Hash to test against + * @return true if matching, otherwise false + */ +export declare function compareSync(s: string, hash: string): boolean; + +/** + * Asynchronously compares the given data against the given hash. + * @param s Data to compare + * @param hash Data to be compared to + * @return Promise, if callback has been omitted + */ +export declare function compare(s: string, hash: string): Promise; + +/** + * Asynchronously compares the given data against the given hash. + * @param s Data to compare + * @param hash Data to be compared to + * @param callback Callback receiving the error, if any, otherwise the result + * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. + */ +export declare function compare( + s: string, + hash: string, + callback?: (err: Error | null, success: boolean) => void, + progressCallback?: (percent: number) => void, +): void; + +/** + * Gets the number of rounds used to encrypt the specified hash. + * @param hash Hash to extract the used number of rounds from + * @return Number of rounds used + */ +export declare function getRounds(hash: string): number; + +/** + * Gets the salt portion from a hash. Does not validate the hash. + * @param hash Hash to extract the salt from + * @return Extracted salt part + */ +export declare function getSalt(hash: string): string; + +/** + * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. + * @function + * @param b Byte array + * @param len Maximum input length + */ +export declare function encodeBase64(b: Readonly>, len: number): string; + +/** + * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. + * @function + * @param s String to decode + * @param len Maximum output length + */ +export declare function decodeBase64(s: string, len: number): number[]; diff --git a/umd/index.d.ts b/umd/index.d.ts new file mode 100644 index 0000000..9de5a20 --- /dev/null +++ b/umd/index.d.ts @@ -0,0 +1,2 @@ +import * as bcrypt from '../types.js'; +export = bcrypt; diff --git a/umd/package.json b/umd/package.json new file mode 100644 index 0000000..5bbefff --- /dev/null +++ b/umd/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} From 1b54cc48d4120b50e1d9058e5a67f326102fd744 Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 18:44:49 +0100 Subject: [PATCH 08/25] Fix Node.js version in CI --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b98fcad..daf3e6a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node_version: ["current", "lts_latest"] + node_version: ["current", "lts/*"] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 From c8c9c01799bbc13092fcbb20cfab4d9015d14c61 Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 18:51:19 +0100 Subject: [PATCH 09/25] Fix typo --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 3edaae1..77d4cd7 100644 --- a/index.js +++ b/index.js @@ -1047,7 +1047,7 @@ function _crypt(b, salt, rounds, callback, progressCallback) { * @param {string} s String to hash * @param {?string} salt Salt to use, actually never null * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, - * hashing is perormed synchronously. + * hashing is performed synchronously. * @param {function(number)=} progressCallback Callback called with the current progress * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` * @inner From d36bfb42fa642b6d6986a84ce106a7110e5824db Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 19:10:15 +0100 Subject: [PATCH 10/25] Generate 2b hashes by default BREAKING CHANGE: This library was not affected by the bug that led to incrementing the bcrypt version from 2a to 2b, but nowadays most implementations use 2b, including the native bcrypt binding, so this change aligns with them. Existing hashes will continue to work, but test logic that generates hashes and compares them literally might need to be updated to account for the new default. --- index.js | 4 ++-- tests/index.js | 40 ++++++++++++++++++++-------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/index.js b/index.js index 77d4cd7..196c950 100644 --- a/index.js +++ b/index.js @@ -91,7 +91,7 @@ export function genSaltSync(rounds, seed_length) { else if (rounds > 31) rounds = 31; var salt = []; - salt.push("$2a$"); + salt.push("$2b$"); if (rounds < 10) salt.push("0"); salt.push(rounds.toString()); @@ -228,7 +228,7 @@ export function compareSync(s, hash) { throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)); if (hash.length !== 60) return false; - return safeStringCompare(hashSync(s, hash.substr(0, hash.length-31)), hash); + return safeStringCompare(hashSync(s, hash.substring(0, hash.length-31)), hash); } /** diff --git a/tests/index.js b/tests/index.js index d8bc296..e87bd64 100644 --- a/tests/index.js +++ b/tests/index.js @@ -51,13 +51,13 @@ const tests = [ }, function compareSync(done) { var salt1 = bcrypt.genSaltSync(), - hash1 = bcrypt.hashSync("hello", salt1); // $2a$ - var salt2 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2y$"), + hash1 = bcrypt.hashSync("hello", salt1); // $2b$ + var salt2 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2y$"), hash2 = bcrypt.hashSync("world", salt2); - var salt3 = bcrypt.genSaltSync().replace(/\$2a\$/, "$2b$"), + var salt3 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2a$"), hash3 = bcrypt.hashSync("hello world", salt3); - assert.strictEqual(hash1.substring(0,4), "$2a$"); + assert.strictEqual(hash1.substring(0,4), "$2b$"); assert(bcrypt.compareSync("hello", hash1)); assert(!bcrypt.compareSync("hello", hash2)); assert(!bcrypt.compareSync("hello", hash3)); @@ -67,7 +67,7 @@ const tests = [ assert(!bcrypt.compareSync("world", hash1)); assert(!bcrypt.compareSync("world", hash3)); - assert.strictEqual(hash3.substring(0,4), "$2b$"); + assert.strictEqual(hash3.substring(0,4), "$2a$"); assert(bcrypt.compareSync("hello world", hash3)); assert(!bcrypt.compareSync("hello world", hash1)); assert(!bcrypt.compareSync("hello world", hash2)); @@ -160,24 +160,24 @@ const tests = [ assert.equal(hash1, hash2); done(); }, - // function compat_roundsOOB(done) { - // var salt1 = bcrypt.genSaltSync(0), // $10$ like not set - // salt2 = binding.genSaltSync(0); - // assert.strictEqual(salt1.substring(0, 7), "$2a$10$"); - // assert.strictEqual(salt2.substring(0, 7), "$2a$10$"); + function compat_roundsOOB(done) { + var salt1 = bcrypt.genSaltSync(0), // $10$ like not set + salt2 = binding.genSaltSync(0); + assert.strictEqual(salt1.substring(0, 7), "$2b$10$"); + assert.strictEqual(salt2.substring(0, 7), "$2b$10$"); - // salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap - // salt2 = bcrypt.genSaltSync(3); - // assert.strictEqual(salt1.substring(0, 7), "$2a$04$"); - // assert.strictEqual(salt2.substring(0, 7), "$2a$04$"); + salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap + salt2 = bcrypt.genSaltSync(3); + assert.strictEqual(salt1.substring(0, 7), "$2b$04$"); + assert.strictEqual(salt2.substring(0, 7), "$2b$04$"); - // salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap - // salt2 = bcrypt.genSaltSync(32); - // assert.strictEqual(salt1.substring(0, 7), "$2a$31$"); - // assert.strictEqual(salt2.substring(0, 7), "$2a$31$"); + salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap + salt2 = bcrypt.genSaltSync(32); + assert.strictEqual(salt1.substring(0, 7), "$2b$31$"); + assert.strictEqual(salt2.substring(0, 7), "$2b$31$"); - // done(); - // } + done(); + } ] function next() { From a84d4e45487df0972d8781feafa477d5db4c1dbd Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 19:17:09 +0100 Subject: [PATCH 11/25] Add stale action for issues and PRs --- .github/workflows/stale.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..ff77ba3 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,22 @@ +name: Stale +on: + schedule: + - cron: '0 0 * * *' +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!' + stale-issue-label: 'stale' + stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!' + close-pr-message: 'This PR has been automatically closed due to lack of recent activity, but feel free to reopen it as long as you merge in the main branch afterwards.' + exempt-issue-labels: 'bug,enhancement,compatibility' + exempt-pr-labels: 'breaking change' + exempt-draft-pr: true + exempt-all-milestones: true + exempt-all-assignees: true + days-before-issue-stale: 30 + days-before-pr-stale: 60 + days-before-close: 7 From 4977df0849eaf8cad5b0d0b543fe452432a2d761 Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 19:23:51 +0100 Subject: [PATCH 12/25] Update description to mention TypeScript support --- README.md | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eb24684..515eb77 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ bcrypt.js ========= -Optimized bcrypt in JavaScript with zero dependencies. Compatible to the C++ [bcrypt](https://npmjs.org/package/bcrypt) -binding on node.js and also working in the browser. +Optimized bcrypt in JavaScript with zero dependencies, with TypeScript support. Compatible to the C++ +[bcrypt](https://npmjs.org/package/bcrypt) binding on Node.js and also working in the browser. [![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/test.yml?branch=master&label=test&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/publish.yml?branch=master&label=publish&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/bcryptjs.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/bcryptjs) diff --git a/package.json b/package.json index d480725..e4e1ed6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bcryptjs", - "description": "Optimized bcrypt in plain JavaScript with zero dependencies. Compatible to 'bcrypt'.", + "description": "Optimized bcrypt in plain JavaScript with zero dependencies, with TypeScript support. Compatible to 'bcrypt'.", "version": "0.0.0", "author": "Daniel Wirtz ", "contributors": [ From 548559d032d7dd5ac3e4e16d7afd87b36ebe96ca Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 19:27:50 +0100 Subject: [PATCH 13/25] Rename default branch to 'main' --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3d3a5ca..f870989 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -9,7 +9,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: master + ref: main - uses: actions/setup-node@v4 with: node-version: current diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index daf3e6a..75555a2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Test on: push: branches: - - master + - main pull_request: workflow_dispatch: jobs: diff --git a/README.md b/README.md index 515eb77..b65a9f5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ bcrypt.js Optimized bcrypt in JavaScript with zero dependencies, with TypeScript support. Compatible to the C++ [bcrypt](https://npmjs.org/package/bcrypt) binding on Node.js and also working in the browser. -[![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/test.yml?branch=master&label=test&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/publish.yml?branch=master&label=publish&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/bcryptjs.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/bcryptjs) +[![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/test.yml?branch=main&label=test&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/publish.yml?branch=main&label=publish&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/bcryptjs.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/bcryptjs) Security considerations ----------------------- From e7465479282d8155852ce88d6407eccb14adc106 Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 20:07:13 +0100 Subject: [PATCH 14/25] Format with prettier --- .github/workflows/lint.yml | 23 + .github/workflows/publish.yml | 48 +- .github/workflows/stale.yml | 30 +- .github/workflows/test.yml | 22 +- .prettierrc.js | 1 + README.md | 109 +- bin/bcrypt | 26 +- index.d.ts | 4 +- index.js | 1544 +++++++++++------------ package-lock.json | 19 +- package.json | 5 +- tests/bench.js | 73 +- tests/index.js | 357 +++--- tests/typescript/test-import.ts | 6 +- tests/typescript/test-require.ts | 2 +- tests/typescript/tsconfig.esnext.json | 2 +- tests/typescript/tsconfig.nodenext.json | 2 +- types.d.ts | 34 +- umd/index.d.ts | 2 +- 19 files changed, 1181 insertions(+), 1128 deletions(-) create mode 100644 .github/workflows/lint.yml create mode 100644 .prettierrc.js diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..b9cc9a7 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,23 @@ +name: Test +on: + push: + branches: + - main + pull_request: + workflow_dispatch: +jobs: + test: + name: Test + runs-on: ubuntu-latest + strategy: + matrix: + node_version: ["current"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + - name: Install dependencies + run: npm ci --no-audit + - name: Lint + run: npm run lint diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f870989..86a8c06 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,27 +7,27 @@ jobs: if: github.repository == 'dcodeIO/bcrypt.js' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - with: - ref: main - - uses: actions/setup-node@v4 - with: - node-version: current - - name: Install dependencies - run: npm ci - - name: Build - run: npm run build - - name: Run tests - run: npm test - - name: Publish - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - run: | - VERSION=$(npx aspublish --version) - if [ -z "$VERSION" ]; then - echo "Changes do not trigger a release" - else - echo "Publishing new version: $VERSION" - npx aspublish - fi + - uses: actions/checkout@v4 + with: + ref: main + - uses: actions/setup-node@v4 + with: + node-version: current + - name: Install dependencies + run: npm ci + - name: Build + run: npm run build + - name: Run tests + run: npm test + - name: Publish + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + VERSION=$(npx aspublish --version) + if [ -z "$VERSION" ]; then + echo "Changes do not trigger a release" + else + echo "Publishing new version: $VERSION" + npx aspublish + fi diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index ff77ba3..15db2ba 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,22 +1,22 @@ name: Stale on: schedule: - - cron: '0 0 * * *' + - cron: "0 0 * * *" jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v9 - with: - stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!' - stale-issue-label: 'stale' - stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!' - close-pr-message: 'This PR has been automatically closed due to lack of recent activity, but feel free to reopen it as long as you merge in the main branch afterwards.' - exempt-issue-labels: 'bug,enhancement,compatibility' - exempt-pr-labels: 'breaking change' - exempt-draft-pr: true - exempt-all-milestones: true - exempt-all-assignees: true - days-before-issue-stale: 30 - days-before-pr-stale: 60 - days-before-close: 7 + - uses: actions/stale@v9 + with: + stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!" + stale-issue-label: "stale" + stale-pr-message: "This PR has been automatically marked as stale because it has not had recent activity. It will be closed in one week if no further activity occurs. Thank you for your contributions!" + close-pr-message: "This PR has been automatically closed due to lack of recent activity, but feel free to reopen it as long as you merge in the main branch afterwards." + exempt-issue-labels: "bug,enhancement,compatibility" + exempt-pr-labels: "breaking change" + exempt-draft-pr: true + exempt-all-milestones: true + exempt-all-assignees: true + days-before-issue-stale: 30 + days-before-pr-stale: 60 + days-before-close: 7 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 75555a2..2fbc75e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Test on: push: branches: - - main + - main pull_request: workflow_dispatch: jobs: @@ -13,13 +13,13 @@ jobs: matrix: node_version: ["current", "lts/*"] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node_version }} - - name: Install dependencies - run: npm ci --no-audit - - name: Build - run: npm run build - - name: Run tests - run: npm test + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + - name: Install dependencies + run: npm ci --no-audit + - name: Build + run: npm run build + - name: Run tests + run: npm test diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1 @@ +export default {}; diff --git a/README.md b/README.md index b65a9f5..a9f747a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,11 @@ -bcrypt.js -========= +# bcrypt.js Optimized bcrypt in JavaScript with zero dependencies, with TypeScript support. Compatible to the C++ [bcrypt](https://npmjs.org/package/bcrypt) binding on Node.js and also working in the browser. [![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/test.yml?branch=main&label=test&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/bcrypt.js/publish.yml?branch=main&label=publish&logo=github)](https://github.com/dcodeIO/bcrypt.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/bcryptjs.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/bcryptjs) -Security considerations ------------------------ +## Security considerations Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with @@ -19,8 +17,7 @@ processed in an equal time span. The maximum input length is 72 bytes (note that UTF8 encoded characters use up to 4 bytes) and the length of generated hashes is 60 characters. -Usage ------ +## Usage The package exports an ECMAScript module with an UMD fallback. @@ -29,17 +26,17 @@ $> npm install bcryptjs ``` ```ts -import bcrypt from 'bcryptjs' +import bcrypt from "bcryptjs"; ``` ### Usage with a CDN -* From GitHub via [jsDelivr](https://www.jsdelivr.com):
+- From GitHub via [jsDelivr](https://www.jsdelivr.com):
`https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js@TAG/index.js` (ESM) -* From npm via [jsDelivr](https://www.jsdelivr.com):
+- From npm via [jsDelivr](https://www.jsdelivr.com):
`https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/index.js` (ESM)
`https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/umd/index.js` (UMD) -* From npm via [unpkg](https://unpkg.com):
+- From npm via [unpkg](https://unpkg.com):
`https://unpkg.com/bcryptjs@VERSION/index.js` (ESM)
`https://unpkg.com/bcryptjs@VERSION/umd/index.js` (UMD) @@ -47,11 +44,11 @@ Replace `TAG` respectively `VERSION` with a [specific version](https://github.co ### Usage - Sync -To hash a password: +To hash a password: ```ts -const salt = bcrypt.genSaltSync(10) -const hash = bcrypt.hashSync('B4c0/\/', salt) +const salt = bcrypt.genSaltSync(10); +const hash = bcrypt.hashSync("B4c0/\/", salt); // Store hash in your password DB ``` @@ -59,14 +56,14 @@ To check a password: ```ts // Load hash from your password DB -bcrypt.compareSync('B4c0/\/', hash) // true -bcrypt.compareSync('not_bacon', hash) // false +bcrypt.compareSync("B4c0/\/", hash); // true +bcrypt.compareSync("not_bacon", hash); // false ``` Auto-gen a salt and hash: ```ts -const hash = bcrypt.hashSync('bacon', 10) +const hash = bcrypt.hashSync("bacon", 10); ``` ### Usage - Async @@ -74,48 +71,48 @@ const hash = bcrypt.hashSync('bacon', 10) To hash a password: ```ts -const salt = await bcrypt.genSalt(10) -const hash = await bcrypt.hash('B4c0/\/', salt) +const salt = await bcrypt.genSalt(10); +const hash = await bcrypt.hash("B4c0/\/", salt); // Store hash in your password DB ``` ```ts bcrypt.genSalt(10, (err, salt) => { - bcrypt.hash('B4c0/\/', salt, function(err, hash) { - // Store hash in your password DB - }) -}) + bcrypt.hash("B4c0/\/", salt, function (err, hash) { + // Store hash in your password DB + }); +}); ``` -To check a password: +To check a password: ```ts // Load hash from your password DB -await bcrypt.compare('B4c0/\/', hash) // true -await bcrypt.compare('not_bacon', hash) // false +await bcrypt.compare("B4c0/\/", hash); // true +await bcrypt.compare("not_bacon", hash); // false ``` ```ts // Load hash from your password DB -bcrypt.compare('B4c0/\/', hash, (err, res) => { - // res === true -}) -bcrypt.compare('not_bacon', hash, (err, res) => { - // res === false -}) +bcrypt.compare("B4c0/\/", hash, (err, res) => { + // res === true +}); +bcrypt.compare("not_bacon", hash, (err, res) => { + // res === false +}); ``` Auto-gen a salt and hash: ```ts -await bcrypt.hash('B4c0/\/', 10) +await bcrypt.hash("B4c0/\/", 10); // Store hash in your password DB ``` ```ts -bcrypt.hash('B4c0/\/', 10, (err, hash) => { - // Store hash in your password DB -}) +bcrypt.hash("B4c0/\/", 10, (err, hash) => { + // Store hash in your password DB +}); ``` **Note:** Under the hood, asynchronous APIs split an operation into small chunks. After the completion of a chunk, the execution of the next chunk is placed on the back of the [JS event queue](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop), efficiently yielding for other computation to execute. @@ -126,50 +123,62 @@ bcrypt.hash('B4c0/\/', 10, (err, hash) => { Usage: bcrypt [rounds|salt] ``` -API ---- +## API ### Callback types -* type **Callback<`T`>**: `(err: Error | null, result?: T) => void` +- type **Callback<`T`>**: `(err: Error | null, result?: T) => void` -* type **ProgressCallback**: `(percentage: number) => void` +- type **ProgressCallback**: `(percentage: number) => void` ### Functions -* bcrypt.**setRandomFallback**(random: `(length: number) => number[]`): `void`
+- bcrypt.**setRandomFallback**(random: `(length: number) => number[]`): `void`
Sets the pseudo random number generator to use as a fallback if neither Node's [crypto](http://nodejs.org/api/crypto.html) module nor the [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! -* bcrypt.**genSaltSync**(rounds?: `number`): `string`
+- bcrypt.**genSaltSync**(rounds?: `number`): `string`
Synchronously generates a salt. Number of rounds defaults to 10 when omitted. -* bcrypt.**genSalt**(rounds?: `number`): `Promise`
+- bcrypt.**genSalt**(rounds?: `number`): `Promise`
bcrypt.**genSalt**(rounds: `number`, callback: `Callback`): `void`
bcrypt.**genSalt**(callback: `Callback`): `void`
Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. -* bcrypt.**hashSync**(s: `string`, salt?: `number | string`): `string` +- bcrypt.**hashSync**(s: `string`, salt?: `number | string`): `string` Synchronously generates a hash for the given string. Number of rounds defaults to 10 when omitted. -* bcrypt.**hash**(s: `string`, salt: `number | string`): `Promise`
+- bcrypt.**hash**(s: `string`, salt: `number | string`): `Promise`
bcrypt.**hash**(s: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
Asynchronously generates a hash for the given string. Optionally calls a progress callback with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. -* bcrypt.**compareSync**(s: `string`, hash: `string`): `boolean`
+- bcrypt.**compareSync**(s: `string`, hash: `string`): `boolean`
Synchronously tests a string against a hash. -* bcrypt.**compare**(s: `string`, hash: `string`): `Promise`
+- bcrypt.**compare**(s: `string`, hash: `string`): `Promise`
bcrypt.**compare**(s: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
Asynchronously compares a string against a hash. Optionally calls a progress callback with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. -* bcrypt.**getRounds**(hash: `string`): `number`
+- bcrypt.**getRounds**(hash: `string`): `number`
Gets the number of rounds used to encrypt the specified hash. -* bcrypt.**getSalt**(hash: `string`): `string`
+- bcrypt.**getSalt**(hash: `string`): `string`
Gets the salt portion from a hash. Does not validate the hash. -Credits -------- +## Building + +Building the UMD fallback: + +``` +$> npm run build +``` + +Running the [tests](./tests): + +``` +$> npm test +``` + +## Credits Based on work started by Shane Girish at [bcrypt-nodejs](https://github.com/shaneGirish/bcrypt-nodejs), which is itself based on [javascript-bcrypt](http://code.google.com/p/javascript-bcrypt/) (New BSD-licensed). diff --git a/bin/bcrypt b/bin/bcrypt index caf94ab..5c72e0f 100644 --- a/bin/bcrypt +++ b/bin/bcrypt @@ -4,18 +4,20 @@ import path from "node:path"; import bcrypt from "../index.js"; if (process.argv.length < 3) { - console.log("Usage: " + path.basename(process.argv[1]) + " [rounds|salt]"); - process.exit(1); + console.log( + "Usage: " + path.basename(process.argv[1]) + " [rounds|salt]", + ); + process.exit(1); } else { - var salt; - if (process.argv.length > 3) { - salt = process.argv[3]; - var rounds = parseInt(salt, 10); - if (rounds == salt) { - salt = bcrypt.genSaltSync(rounds); - } - } else { - salt = bcrypt.genSaltSync(); + var salt; + if (process.argv.length > 3) { + salt = process.argv[3]; + var rounds = parseInt(salt, 10); + if (rounds == salt) { + salt = bcrypt.genSaltSync(rounds); } - console.log(bcrypt.hashSync(process.argv[2], salt)); + } else { + salt = bcrypt.genSaltSync(); + } + console.log(bcrypt.hashSync(process.argv[2], salt)); } diff --git a/index.d.ts b/index.d.ts index b223a40..3ae838f 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,3 +1,3 @@ -import * as bcrypt from './types.js'; -export * from './types.js'; +import * as bcrypt from "./types.js"; +export * from "./types.js"; export default bcrypt; diff --git a/index.js b/index.js index 196c950..f959e18 100644 --- a/index.js +++ b/index.js @@ -42,21 +42,23 @@ var randomFallback = null; * @inner */ function random(len) { - // Web Crypto API + // Web Crypto API + try { + return crypto.getRandomValues(new Uint8Array(len)); + } catch {} + // Node.js crypto + if (typeof require === "function") { try { - return crypto.getRandomValues(new Uint8Array(len)); + return require("crypto").randomBytes(len); } catch {} - // Node.js crypto - if (typeof require === 'function') { - try { - return require("crypto").randomBytes(len); - } catch {} - } - // Fallback - if (!randomFallback) { - throw Error("Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative"); - } - return randomFallback(len); + } + // Fallback + if (!randomFallback) { + throw Error( + "Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative", + ); + } + return randomFallback(len); } // Default fallback, if any @@ -72,7 +74,7 @@ randomFallback = null; * @see http://www.w3.org/TR/WebCryptoAPI/ */ export function setRandomFallback(random) { - randomFallback = random; + randomFallback = random; } /** @@ -83,21 +85,20 @@ export function setRandomFallback(random) { * @throws {Error} If a random fallback is required but not set */ export function genSaltSync(rounds, seed_length) { - rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof rounds !== 'number') - throw Error("Illegal arguments: "+(typeof rounds)+", "+(typeof seed_length)); - if (rounds < 4) - rounds = 4; - else if (rounds > 31) - rounds = 31; - var salt = []; - salt.push("$2b$"); - if (rounds < 10) - salt.push("0"); - salt.push(rounds.toString()); - salt.push('$'); - salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw - return salt.join(''); + rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS; + if (typeof rounds !== "number") + throw Error( + "Illegal arguments: " + typeof rounds + ", " + typeof seed_length, + ); + if (rounds < 4) rounds = 4; + else if (rounds > 31) rounds = 31; + var salt = []; + salt.push("$2b$"); + if (rounds < 10) salt.push("0"); + salt.push(rounds.toString()); + salt.push("$"); + salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw + return salt.join(""); } /** @@ -109,41 +110,38 @@ export function genSaltSync(rounds, seed_length) { * @throws {Error} If `callback` is present but not a function */ export function genSalt(rounds, seed_length, callback) { - if (typeof seed_length === 'function') - callback = seed_length, - seed_length = undefined; // Not supported. - if (typeof rounds === 'function') - callback = rounds, - rounds = undefined; - if (typeof rounds === 'undefined') - rounds = GENSALT_DEFAULT_LOG2_ROUNDS; - else if (typeof rounds !== 'number') - throw Error("illegal arguments: "+(typeof rounds)); + if (typeof seed_length === "function") + (callback = seed_length), (seed_length = undefined); // Not supported. + if (typeof rounds === "function") (callback = rounds), (rounds = undefined); + if (typeof rounds === "undefined") rounds = GENSALT_DEFAULT_LOG2_ROUNDS; + else if (typeof rounds !== "number") + throw Error("illegal arguments: " + typeof rounds); - function _async(callback) { - nextTick(function() { // Pretty thin, but salting is fast enough - try { - callback(null, genSaltSync(rounds)); - } catch (err) { - callback(err); - } - }); - } + function _async(callback) { + nextTick(function () { + // Pretty thin, but salting is fast enough + try { + callback(null, genSaltSync(rounds)); + } catch (err) { + callback(err); + } + }); + } - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); + if (callback) { + if (typeof callback !== "function") + throw Error("Illegal callback: " + typeof callback); + _async(callback); + } else + return new Promise(function (resolve, reject) { + _async(function (err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); } /** @@ -153,13 +151,11 @@ export function genSalt(rounds, seed_length, callback) { * @returns {string} Resulting hash */ export function hashSync(s, salt) { - if (typeof salt === 'undefined') - salt = GENSALT_DEFAULT_LOG2_ROUNDS; - if (typeof salt === 'number') - salt = genSaltSync(salt); - if (typeof s !== 'string' || typeof salt !== 'string') - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)); - return _hash(s, salt); + if (typeof salt === "undefined") salt = GENSALT_DEFAULT_LOG2_ROUNDS; + if (typeof salt === "number") salt = genSaltSync(salt); + if (typeof s !== "string" || typeof salt !== "string") + throw Error("Illegal arguments: " + typeof s + ", " + typeof salt); + return _hash(s, salt); } /** @@ -173,32 +169,36 @@ export function hashSync(s, salt) { * @throws {Error} If `callback` is present but not a function */ export function hash(s, salt, callback, progressCallback) { + function _async(callback) { + if (typeof s === "string" && typeof salt === "number") + genSalt(salt, function (err, salt) { + _hash(s, salt, callback, progressCallback); + }); + else if (typeof s === "string" && typeof salt === "string") + _hash(s, salt, callback, progressCallback); + else + nextTick( + callback.bind( + this, + Error("Illegal arguments: " + typeof s + ", " + typeof salt), + ), + ); + } - function _async(callback) { - if (typeof s === 'string' && typeof salt === 'number') - genSalt(salt, function(err, salt) { - _hash(s, salt, callback, progressCallback); - }); - else if (typeof s === 'string' && typeof salt === 'string') - _hash(s, salt, callback, progressCallback); - else - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof salt)))); - } - - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); + if (callback) { + if (typeof callback !== "function") + throw Error("Illegal callback: " + typeof callback); + _async(callback); + } else + return new Promise(function (resolve, reject) { + _async(function (err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); } /** @@ -209,11 +209,11 @@ export function hash(s, salt, callback, progressCallback) { * @inner */ function safeStringCompare(known, unknown) { - var diff = known.length ^ unknown.length; - for (var i = 0; i < known.length; ++i) { - diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i); - } - return diff === 0; + var diff = known.length ^ unknown.length; + for (var i = 0; i < known.length; ++i) { + diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i); + } + return diff === 0; } /** @@ -224,11 +224,13 @@ function safeStringCompare(known, unknown) { * @throws {Error} If an argument is illegal */ export function compareSync(s, hash) { - if (typeof s !== "string" || typeof hash !== "string") - throw Error("Illegal arguments: "+(typeof s)+', '+(typeof hash)); - if (hash.length !== 60) - return false; - return safeStringCompare(hashSync(s, hash.substring(0, hash.length-31)), hash); + if (typeof s !== "string" || typeof hash !== "string") + throw Error("Illegal arguments: " + typeof s + ", " + typeof hash); + if (hash.length !== 60) return false; + return safeStringCompare( + hashSync(s, hash.substring(0, hash.length - 31)), + hash, + ); } /** @@ -242,38 +244,45 @@ export function compareSync(s, hash) { * @throws {Error} If `callback` is present but not a function */ export function compare(s, hashValue, callback, progressCallback) { - - function _async(callback) { - if (typeof s !== "string" || typeof hashValue !== "string") { - nextTick(callback.bind(this, Error("Illegal arguments: "+(typeof s)+', '+(typeof hashValue)))); - return; - } - if (hashValue.length !== 60) { - nextTick(callback.bind(this, null, false)); - return; - } - hash(s, hashValue.substring(0, 29), function(err, comp) { - if (err) - callback(err); - else - callback(null, safeStringCompare(comp, hashValue)); - }, progressCallback); + function _async(callback) { + if (typeof s !== "string" || typeof hashValue !== "string") { + nextTick( + callback.bind( + this, + Error("Illegal arguments: " + typeof s + ", " + typeof hashValue), + ), + ); + return; } + if (hashValue.length !== 60) { + nextTick(callback.bind(this, null, false)); + return; + } + hash( + s, + hashValue.substring(0, 29), + function (err, comp) { + if (err) callback(err); + else callback(null, safeStringCompare(comp, hashValue)); + }, + progressCallback, + ); + } - if (callback) { - if (typeof callback !== 'function') - throw Error("Illegal callback: "+typeof(callback)); - _async(callback); - } else - return new Promise(function(resolve, reject) { - _async(function(err, res) { - if (err) { - reject(err); - return; - } - resolve(res); - }); - }); + if (callback) { + if (typeof callback !== "function") + throw Error("Illegal callback: " + typeof callback); + _async(callback); + } else + return new Promise(function (resolve, reject) { + _async(function (err, res) { + if (err) { + reject(err); + return; + } + resolve(res); + }); + }); } /** @@ -283,9 +292,9 @@ export function compare(s, hashValue, callback, progressCallback) { * @throws {Error} If `hash` is not a string */ export function getRounds(hash) { - if (typeof hash !== "string") - throw Error("Illegal arguments: "+(typeof hash)); - return parseInt(hash.split("$")[2], 10); + if (typeof hash !== "string") + throw Error("Illegal arguments: " + typeof hash); + return parseInt(hash.split("$")[2], 10); } /** @@ -295,12 +304,12 @@ export function getRounds(hash) { * @throws {Error} If `hash` is not a string or otherwise invalid */ export function getSalt(hash) { - if (typeof hash !== 'string') - throw Error("Illegal arguments: "+(typeof hash)); - if (hash.length !== 60) - throw Error("Illegal hash length: "+hash.length+" != 60"); - return hash.substring(0, 29); -}; + if (typeof hash !== "string") + throw Error("Illegal arguments: " + typeof hash); + if (hash.length !== 60) + throw Error("Illegal hash length: " + hash.length + " != 60"); + return hash.substring(0, 29); +} /** * Continues with the callback on the next tick. @@ -308,28 +317,30 @@ export function getSalt(hash) { * @param {function(...[*])} callback Callback to execute * @inner */ -var nextTick = typeof process !== 'undefined' && process && typeof process.nextTick === 'function' - ? (typeof setImmediate === 'function' ? setImmediate : process.nextTick) +var nextTick = + typeof process !== "undefined" && + process && + typeof process.nextTick === "function" + ? typeof setImmediate === "function" + ? setImmediate + : process.nextTick : setTimeout; /** Calculates the byte length of a string encoded as UTF8. */ function utf8Length(string) { var len = 0, - c = 0; + c = 0; for (var i = 0; i < string.length; ++i) { - c = string.charCodeAt(i); - if (c < 128) - len += 1; - else if (c < 2048) - len += 2; - else if ( - (c & 0xFC00) === 0xD800 && - (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00 - ) { - ++i; - len += 4; - } else - len += 3; + c = string.charCodeAt(i); + if (c < 128) len += 1; + else if (c < 2048) len += 2; + else if ( + (c & 0xfc00) === 0xd800 && + (string.charCodeAt(i + 1) & 0xfc00) === 0xdc00 + ) { + ++i; + len += 4; + } else len += 3; } return len; } @@ -337,33 +348,34 @@ function utf8Length(string) { /** Converts a string to an array of UTF8 bytes. */ function utf8Array(string) { var offset = 0, - c1, c2; + c1, + c2; var buffer = new Array(utf8Length(string)); for (var i = 0, k = string.length; i < k; ++i) { - c1 = string.charCodeAt(i); - if (c1 < 128) { - buffer[offset++] = c1; - } else if (c1 < 2048) { - buffer[offset++] = c1 >> 6 | 192; - buffer[offset++] = c1 & 63 | 128; - } else if ( - ( c1 & 0xFC00) === 0xD800 && - ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00 - ) { - c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF); - ++i; - buffer[offset++] = c1 >> 18 | 240; - buffer[offset++] = c1 >> 12 & 63 | 128; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } else { - buffer[offset++] = c1 >> 12 | 224; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } + c1 = string.charCodeAt(i); + if (c1 < 128) { + buffer[offset++] = c1; + } else if (c1 < 2048) { + buffer[offset++] = (c1 >> 6) | 192; + buffer[offset++] = (c1 & 63) | 128; + } else if ( + (c1 & 0xfc00) === 0xd800 && + ((c2 = string.charCodeAt(i + 1)) & 0xfc00) === 0xdc00 + ) { + c1 = 0x10000 + ((c1 & 0x03ff) << 10) + (c2 & 0x03ff); + ++i; + buffer[offset++] = (c1 >> 18) | 240; + buffer[offset++] = ((c1 >> 12) & 63) | 128; + buffer[offset++] = ((c1 >> 6) & 63) | 128; + buffer[offset++] = (c1 & 63) | 128; + } else { + buffer[offset++] = (c1 >> 12) | 224; + buffer[offset++] = ((c1 >> 6) & 63) | 128; + buffer[offset++] = (c1 & 63) | 128; + } } return buffer; -} +} // A base64 implementation for the bcrypt algorithm. This is partly non-standard. @@ -373,21 +385,23 @@ function utf8Array(string) { * @const * @inner **/ -var BASE64_CODE = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(''); +var BASE64_CODE = + "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""); /** * @type {!Array.} * @const * @inner **/ -var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, - 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, - -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1]; +var BASE64_INDEX = [ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, +]; /** * Encodes a byte array to base64 with up to len bytes of input. @@ -397,33 +411,33 @@ var BASE64_INDEX = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, * @inner */ function base64_encode(b, len) { - var off = 0, - rs = [], - c1, c2; - if (len <= 0 || len > b.length) - throw Error("Illegal len: "+len); - while (off < len) { - c1 = b[off++] & 0xff; - rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); - c1 = (c1 & 0x03) << 4; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 4) & 0x0f; - rs.push(BASE64_CODE[c1 & 0x3f]); - c1 = (c2 & 0x0f) << 2; - if (off >= len) { - rs.push(BASE64_CODE[c1 & 0x3f]); - break; - } - c2 = b[off++] & 0xff; - c1 |= (c2 >> 6) & 0x03; - rs.push(BASE64_CODE[c1 & 0x3f]); - rs.push(BASE64_CODE[c2 & 0x3f]); + var off = 0, + rs = [], + c1, + c2; + if (len <= 0 || len > b.length) throw Error("Illegal len: " + len); + while (off < len) { + c1 = b[off++] & 0xff; + rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.push(BASE64_CODE[c1 & 0x3f]); + break; } - return rs.join(''); + c2 = b[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.push(BASE64_CODE[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.push(BASE64_CODE[c1 & 0x3f]); + break; + } + c2 = b[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.push(BASE64_CODE[c1 & 0x3f]); + rs.push(BASE64_CODE[c2 & 0x3f]); + } + return rs.join(""); } /** @@ -434,45 +448,44 @@ function base64_encode(b, len) { * @inner */ function base64_decode(s, len) { - var off = 0, - slen = s.length, - olen = 0, - rs = [], - c1, c2, c3, c4, o, code; - if (len <= 0) - throw Error("Illegal len: "+len); - while (off < slen - 1 && olen < len) { - code = s.charCodeAt(off++); - c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - code = s.charCodeAt(off++); - c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c1 == -1 || c2 == -1) - break; - o = (c1 << 2) >>> 0; - o |= (c2 & 0x30) >> 4; - rs.push(String.fromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - if (c3 == -1) - break; - o = ((c2 & 0x0f) << 4) >>> 0; - o |= (c3 & 0x3c) >> 2; - rs.push(String.fromCharCode(o)); - if (++olen >= len || off >= slen) - break; - code = s.charCodeAt(off++); - c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; - o = ((c3 & 0x03) << 6) >>> 0; - o |= c4; - rs.push(String.fromCharCode(o)); - ++olen; - } - var res = []; - for (off = 0; off>> 0; + o |= (c2 & 0x30) >> 4; + rs.push(String.fromCharCode(o)); + if (++olen >= len || off >= slen) break; + code = s.charCodeAt(off++); + c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + if (c3 == -1) break; + o = ((c2 & 0x0f) << 4) >>> 0; + o |= (c3 & 0x3c) >> 2; + rs.push(String.fromCharCode(o)); + if (++olen >= len || off >= slen) break; + code = s.charCodeAt(off++); + c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1; + o = ((c3 & 0x03) << 6) >>> 0; + o |= c4; + rs.push(String.fromCharCode(o)); + ++olen; + } + var res = []; + for (off = 0; off < olen; off++) res.push(rs[off].charCodeAt(0)); + return res; } /** @@ -509,10 +522,9 @@ var MAX_EXECUTION_TIME = 100; * @inner */ var P_ORIG = [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, - 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, - 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, - 0xb5470917, 0x9216d5d9, 0x8979fb1b + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, ]; /** @@ -521,211 +533,177 @@ var P_ORIG = [ * @inner */ var S_ORIG = [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, - 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, - 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, - 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, - 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, - 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, - 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, - 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, - 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, - 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, - 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, - 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, - 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, - 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, - 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, - 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, - 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, - 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, - 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, - 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, - 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, - 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, - 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, - 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, - 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, - 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, - 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, - 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, - 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, - 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, - 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, - 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, - 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, - 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, - 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, - 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, - 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, - 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, - 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, - 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, - 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, - 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, - 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, - 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, - 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, - 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, - 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, - 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, - 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, - 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, - 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, - 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, - 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, - 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, - 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, - 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, - 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, - 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, - 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, - 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, - 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, - 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, - 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, - 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, - 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, - 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, - 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, - 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, - 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, - 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, - 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, - 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, - 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, - 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, - 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, - 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, - 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, - 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, - 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, - 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, - 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, - 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, - 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, - 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, - 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, - 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, - 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, - 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, - 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, - 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, - 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, - 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, - 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, - 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, - 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, - 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, - 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, - 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, - 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, - 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, - 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, - 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, - 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, - 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, - 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, - 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, - 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, - 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, - 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, - 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, - 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, - 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, - 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, - 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, - 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, - 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, - 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, - 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, - 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, - 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, - 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, - 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, - 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, - 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, - 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, - 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, - 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, - 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, - 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, - 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, - 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, - 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, - 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, - 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, - 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, - 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, - 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, - 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, - 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, - 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, - 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, - 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, - 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, - 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, - 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, - 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, - 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, - 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, - 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, - 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, - 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, - 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, - 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, - 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, - 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, - 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, - 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, - 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, - 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, - 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, - 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, - 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, - 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, - 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, - 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, - 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, - 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, - 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, - 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, - 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, - 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, - 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, - 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, - 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, - 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, - 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, - 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, - 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, - 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, - 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, + 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, + 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, + 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, + 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, + 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, + 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, + 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, + 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, + 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, + 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, + 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, + 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, + 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, + 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, + 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, + 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, + 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944, + 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, + 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, + 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, + 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, + 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, + 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, + 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, + 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, + 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, + 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, + 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, + 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, + 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, + 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, + 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, + 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, + 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, + 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, + 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, + 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, + 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, + 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, + 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, + 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, + 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, + 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, + 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, + 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, + 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, + 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, + 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, + 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, + 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, + 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, + 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, + 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, + 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, + 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, + 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, + 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, + 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, + 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, + 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, + 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, + 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, + 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, + 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, + 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, + 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, + 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, + 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, + 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, + 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, + 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, + 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, + 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, + 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, + 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, + 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, + 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, ]; /** @@ -734,8 +712,7 @@ var S_ORIG = [ * @inner */ var C_ORIG = [ - 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, - 0x6f756274 + 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274, ]; /** @@ -746,14 +723,15 @@ var C_ORIG = [ * @returns {Array.} * @inner */ -function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt - var n, - l = lr[off], - r = lr[off + 1]; +function _encipher(lr, off, P, S) { + // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt + var n, + l = lr[off], + r = lr[off + 1]; - l ^= P[0]; + l ^= P[0]; - /* + /* for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;) // Feistel substitution on left word n = S[l >>> 24], @@ -769,99 +747,99 @@ function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / l ^= n ^ P[++i]; */ - //The following is an unrolled version of the above loop. - //Iteration 0 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[1]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[2]; - //Iteration 1 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[3]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[4]; - //Iteration 2 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[5]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[6]; - //Iteration 3 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[7]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[8]; - //Iteration 4 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[9]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[10]; - //Iteration 5 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[11]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[12]; - //Iteration 6 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[13]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[14]; - //Iteration 7 - n = S[l >>> 24]; - n += S[0x100 | ((l >> 16) & 0xff)]; - n ^= S[0x200 | ((l >> 8) & 0xff)]; - n += S[0x300 | (l & 0xff)]; - r ^= n ^ P[15]; - n = S[r >>> 24]; - n += S[0x100 | ((r >> 16) & 0xff)]; - n ^= S[0x200 | ((r >> 8) & 0xff)]; - n += S[0x300 | (r & 0xff)]; - l ^= n ^ P[16]; + //The following is an unrolled version of the above loop. + //Iteration 0 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[1]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[2]; + //Iteration 1 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[3]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[4]; + //Iteration 2 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[5]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[6]; + //Iteration 3 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[7]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[8]; + //Iteration 4 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[9]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[10]; + //Iteration 5 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[11]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[12]; + //Iteration 6 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[13]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[14]; + //Iteration 7 + n = S[l >>> 24]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[15]; + n = S[r >>> 24]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[16]; - lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; - lr[off + 1] = l; - return lr; + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + return lr; } /** @@ -871,10 +849,10 @@ function _encipher(lr, off, P, S) { // This is our bottleneck: 1714/1905 ticks / * @inner */ function _streamtoword(data, offp) { - for (var i = 0, word = 0; i < 4; ++i) - word = (word << 8) | (data[offp] & 0xff), - offp = (offp + 1) % data.length; - return { key: word, offp: offp }; + for (var i = 0, word = 0; i < 4; ++i) + (word = (word << 8) | (data[offp] & 0xff)), + (offp = (offp + 1) % data.length); + return { key: word, offp: offp }; } /** @@ -884,23 +862,19 @@ function _streamtoword(data, offp) { * @inner */ function _key(key, P, S) { - var offset = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offset), - offset = sw.offp, - P[i] = P[i] ^ sw.key; - for (i = 0; i < plen; i += 2) - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; + var offset = 0, + lr = [0, 0], + plen = P.length, + slen = S.length, + sw; + for (var i = 0; i < plen; i++) + (sw = _streamtoword(key, offset)), + (offset = sw.offp), + (P[i] = P[i] ^ sw.key); + for (i = 0; i < plen; i += 2) + (lr = _encipher(lr, 0, P, S)), (P[i] = lr[0]), (P[i + 1] = lr[1]); + for (i = 0; i < slen; i += 2) + (lr = _encipher(lr, 0, P, S)), (S[i] = lr[0]), (S[i + 1] = lr[1]); } /** @@ -912,36 +886,34 @@ function _key(key, P, S) { * @inner */ function _ekskey(data, key, P, S) { - var offp = 0, - lr = [0, 0], - plen = P.length, - slen = S.length, - sw; - for (var i = 0; i < plen; i++) - sw = _streamtoword(key, offp), - offp = sw.offp, - P[i] = P[i] ^ sw.key; - offp = 0; - for (i = 0; i < plen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - P[i] = lr[0], - P[i + 1] = lr[1]; - for (i = 0; i < slen; i += 2) - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[0] ^= sw.key, - sw = _streamtoword(data, offp), - offp = sw.offp, - lr[1] ^= sw.key, - lr = _encipher(lr, 0, P, S), - S[i] = lr[0], - S[i + 1] = lr[1]; + var offp = 0, + lr = [0, 0], + plen = P.length, + slen = S.length, + sw; + for (var i = 0; i < plen; i++) + (sw = _streamtoword(key, offp)), (offp = sw.offp), (P[i] = P[i] ^ sw.key); + offp = 0; + for (i = 0; i < plen; i += 2) + (sw = _streamtoword(data, offp)), + (offp = sw.offp), + (lr[0] ^= sw.key), + (sw = _streamtoword(data, offp)), + (offp = sw.offp), + (lr[1] ^= sw.key), + (lr = _encipher(lr, 0, P, S)), + (P[i] = lr[0]), + (P[i + 1] = lr[1]); + for (i = 0; i < slen; i += 2) + (sw = _streamtoword(data, offp)), + (offp = sw.offp), + (lr[0] ^= sw.key), + (sw = _streamtoword(data, offp)), + (offp = sw.offp), + (lr[1] ^= sw.key), + (lr = _encipher(lr, 0, P, S)), + (S[i] = lr[0]), + (S[i + 1] = lr[1]); } /** @@ -956,90 +928,86 @@ function _ekskey(data, key, P, S) { * @inner */ function _crypt(b, salt, rounds, callback, progressCallback) { - var cdata = C_ORIG.slice(), - clen = cdata.length, - err; + var cdata = C_ORIG.slice(), + clen = cdata.length, + err; - // Validate - if (rounds < 4 || rounds > 31) { - err = Error("Illegal number of rounds (4-31): "+rounds); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - if (salt.length !== BCRYPT_SALT_LEN) { - err =Error("Illegal salt length: "+salt.length+" != "+BCRYPT_SALT_LEN); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - rounds = (1 << rounds) >>> 0; + // Validate + if (rounds < 4 || rounds > 31) { + err = Error("Illegal number of rounds (4-31): " + rounds); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else throw err; + } + if (salt.length !== BCRYPT_SALT_LEN) { + err = Error( + "Illegal salt length: " + salt.length + " != " + BCRYPT_SALT_LEN, + ); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else throw err; + } + rounds = (1 << rounds) >>> 0; - var P, S, i = 0, j; + var P, + S, + i = 0, + j; - //Use typed arrays when available - huge speedup! - if (Int32Array) { - P = new Int32Array(P_ORIG); - S = new Int32Array(S_ORIG); - } else { - P = P_ORIG.slice(); - S = S_ORIG.slice(); - } + //Use typed arrays when available - huge speedup! + if (Int32Array) { + P = new Int32Array(P_ORIG); + S = new Int32Array(S_ORIG); + } else { + P = P_ORIG.slice(); + S = S_ORIG.slice(); + } - _ekskey(salt, b, P, S); + _ekskey(salt, b, P, S); - /** - * Calcualtes the next round. - * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` - * @inner - */ - function next() { - if (progressCallback) - progressCallback(i / rounds); - if (i < rounds) { - var start = Date.now(); - for (; i < rounds;) { - i = i + 1; - _key(b, P, S); - _key(salt, P, S); - if (Date.now() - start > MAX_EXECUTION_TIME) - break; - } - } else { - for (i = 0; i < 64; i++) - for (j = 0; j < (clen >> 1); j++) - _encipher(cdata, j << 1, P, S); - var ret = []; - for (i = 0; i < clen; i++) - ret.push(((cdata[i] >> 24) & 0xff) >>> 0), - ret.push(((cdata[i] >> 16) & 0xff) >>> 0), - ret.push(((cdata[i] >> 8) & 0xff) >>> 0), - ret.push((cdata[i] & 0xff) >>> 0); - if (callback) { - callback(null, ret); - return; - } else - return ret; - } - if (callback) - nextTick(next); + /** + * Calcualtes the next round. + * @returns {Array.|undefined} Resulting array if callback has been omitted, otherwise `undefined` + * @inner + */ + function next() { + if (progressCallback) progressCallback(i / rounds); + if (i < rounds) { + var start = Date.now(); + for (; i < rounds; ) { + i = i + 1; + _key(b, P, S); + _key(salt, P, S); + if (Date.now() - start > MAX_EXECUTION_TIME) break; + } + } else { + for (i = 0; i < 64; i++) + for (j = 0; j < clen >> 1; j++) _encipher(cdata, j << 1, P, S); + var ret = []; + for (i = 0; i < clen; i++) + ret.push(((cdata[i] >> 24) & 0xff) >>> 0), + ret.push(((cdata[i] >> 16) & 0xff) >>> 0), + ret.push(((cdata[i] >> 8) & 0xff) >>> 0), + ret.push((cdata[i] & 0xff) >>> 0); + if (callback) { + callback(null, ret); + return; + } else return ret; } + if (callback) nextTick(next); + } - // Async - if (typeof callback !== 'undefined') { - next(); + // Async + if (typeof callback !== "undefined") { + next(); - // Sync - } else { - var res; - while (true) - if (typeof(res = next()) !== 'undefined') - return res || []; - } + // Sync + } else { + var res; + while (true) if (typeof (res = next()) !== "undefined") return res || []; + } } /** @@ -1053,96 +1021,92 @@ function _crypt(b, salt, rounds, callback, progressCallback) { * @inner */ function _hash(s, salt, callback, progressCallback) { - var err; - if (typeof s !== 'string' || typeof salt !== 'string') { - err = Error("Invalid string / salt: Not a string"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - - // Validate the salt - var minor, offset; - if (salt.charAt(0) !== '$' || salt.charAt(1) !== '2') { - err = Error("Invalid salt version: "+salt.substring(0,2)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } - else - throw err; - } - if (salt.charAt(2) === '$') - minor = String.fromCharCode(0), - offset = 3; - else { - minor = salt.charAt(2); - if ((minor !== 'a' && minor !== 'b' && minor !== 'y') || salt.charAt(3) !== '$') { - err = Error("Invalid salt revision: "+salt.substring(2,4)); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; - } - offset = 4; - } + var err; + if (typeof s !== "string" || typeof salt !== "string") { + err = Error("Invalid string / salt: Not a string"); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else throw err; + } - // Extract number of rounds - if (salt.charAt(offset + 2) > '$') { - err = Error("Missing salt rounds"); - if (callback) { - nextTick(callback.bind(this, err)); - return; - } else - throw err; + // Validate the salt + var minor, offset; + if (salt.charAt(0) !== "$" || salt.charAt(1) !== "2") { + err = Error("Invalid salt version: " + salt.substring(0, 2)); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else throw err; + } + if (salt.charAt(2) === "$") (minor = String.fromCharCode(0)), (offset = 3); + else { + minor = salt.charAt(2); + if ( + (minor !== "a" && minor !== "b" && minor !== "y") || + salt.charAt(3) !== "$" + ) { + err = Error("Invalid salt revision: " + salt.substring(2, 4)); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else throw err; } - var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, - r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), - rounds = r1 + r2, - real_salt = salt.substring(offset + 3, offset + 25); - s += minor >= 'a' ? "\x00" : ""; + offset = 4; + } - var passwordb = utf8Array(s), - saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); + // Extract number of rounds + if (salt.charAt(offset + 2) > "$") { + err = Error("Missing salt rounds"); + if (callback) { + nextTick(callback.bind(this, err)); + return; + } else throw err; + } + var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10, + r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), + rounds = r1 + r2, + real_salt = salt.substring(offset + 3, offset + 25); + s += minor >= "a" ? "\x00" : ""; - /** - * Finishes hashing. - * @param {Array.} bytes Byte array - * @returns {string} - * @inner - */ - function finish(bytes) { - var res = []; - res.push("$2"); - if (minor >= 'a') - res.push(minor); - res.push("$"); - if (rounds < 10) - res.push("0"); - res.push(rounds.toString()); - res.push("$"); - res.push(base64_encode(saltb, saltb.length)); - res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); - return res.join(''); - } + var passwordb = utf8Array(s), + saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); - // Sync - if (typeof callback == 'undefined') - return finish(_crypt(passwordb, saltb, rounds)); + /** + * Finishes hashing. + * @param {Array.} bytes Byte array + * @returns {string} + * @inner + */ + function finish(bytes) { + var res = []; + res.push("$2"); + if (minor >= "a") res.push(minor); + res.push("$"); + if (rounds < 10) res.push("0"); + res.push(rounds.toString()); + res.push("$"); + res.push(base64_encode(saltb, saltb.length)); + res.push(base64_encode(bytes, C_ORIG.length * 4 - 1)); + return res.join(""); + } - // Async - else { - _crypt(passwordb, saltb, rounds, function(err, bytes) { - if (err) - callback(err, null); - else - callback(null, finish(bytes)); - }, progressCallback); - } + // Sync + if (typeof callback == "undefined") + return finish(_crypt(passwordb, saltb, rounds)); + // Async + else { + _crypt( + passwordb, + saltb, + rounds, + function (err, bytes) { + if (err) callback(err, null); + else callback(null, finish(bytes)); + }, + progressCallback, + ); + } } /** @@ -1153,7 +1117,7 @@ function _hash(s, salt, callback, progressCallback) { * @returns {string} */ export function encodeBase64(b, len) { - return base64_encode(b, len); + return base64_encode(b, len); } /** @@ -1164,19 +1128,19 @@ export function encodeBase64(b, len) { * @returns {!Array.} */ export function decodeBase64(s, len) { - return base64_decode(s, len); + return base64_decode(s, len); } export default { - setRandomFallback, - genSaltSync, - genSalt, - hashSync, - hash, - compareSync, - compare, - getRounds, - getSalt, - encodeBase64, - decodeBase64 -} + setRandomFallback, + genSaltSync, + genSalt, + hashSync, + hash, + compareSync, + compare, + getRounds, + getSalt, + encodeBase64, + decodeBase64, +}; diff --git a/package-lock.json b/package-lock.json index 8e46b75..f655e1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,13 +7,14 @@ "": { "name": "bcryptjs", "version": "0.0.0", - "license": "MIT", + "license": "BSD-3-Clause", "bin": { "bcrypt": "bin/bcrypt" }, "devDependencies": { "bcrypt": "^5.1.1", "esm2umd": "^0.2.2", + "prettier": "^3.5.0", "typescript": "^5.7.3" } }, @@ -1044,6 +1045,22 @@ "dev": true, "license": "ISC" }, + "node_modules/prettier": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", + "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", diff --git a/package.json b/package.json index e4e1ed6..6454159 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,9 @@ }, "license": "BSD-3-Clause", "scripts": { - "build": "esm2umd bcrypt index.js > umd/index.js", + "build": "esm2umd bcrypt index.js > umd/index.js && prettier --write umd/index.js", + "lint": "prettier --check .", + "format": "prettier --write .", "test": "npm run test:unit && npm run test:typescript", "test:unit": "node tests", "test:typescript": "tsc --project tests/typescript/tsconfig.esnext.json && tsc --project tests/typescript/tsconfig.nodenext.json && tsc --project tests/typescript/tsconfig.commonjs.json" @@ -64,6 +66,7 @@ "devDependencies": { "bcrypt": "^5.1.1", "esm2umd": "^0.2.2", + "prettier": "^3.5.0", "typescript": "^5.7.3" } } diff --git a/tests/bench.js b/tests/bench.js index 9eb05e0..9fc91ef 100644 --- a/tests/bench.js +++ b/tests/bench.js @@ -5,35 +5,35 @@ const pass = "ä☺𠜎️☁"; const testRounds = [8, 9, 10, 11, 12, 13, 14, 15]; function testSync(name, salt, impl) { - var res; - console.time(name); - res = impl.hashSync(pass, salt); - console.timeEnd(name); - console.log("`"+res+"` "); + var res; + console.time(name); + res = impl.hashSync(pass, salt); + console.timeEnd(name); + console.log("`" + res + "` "); } function testAsync(name, salt, impl, cb) { - console.time(name); - impl.hash(pass, salt, function(err, res) { - console.timeEnd(name); - console.log("`"+res+"` "); - if (cb) cb(); - }); + console.time(name); + impl.hash(pass, salt, function (err, res) { + console.timeEnd(name); + console.log("`" + res + "` "); + if (cb) cb(); + }); } function testMax(name, impl) { - var s = "", - salt = bcryptjs.genSaltSync(4), - last = null; - while (s.length < 100) { - s += "0"; - var hash = impl.hashSync(s, salt); - if (hash === last) { - console.log(name+" maximum input length is: "+(s.length-1)); - break; - } - last = hash; + var s = "", + salt = bcryptjs.genSaltSync(4), + last = null; + while (s.length < 100) { + s += "0"; + var hash = impl.hashSync(s, salt); + if (hash === last) { + console.log(name + " maximum input length is: " + (s.length - 1)); + break; } + last = hash; + } } testMax("bcrypt.js", bcryptjs); @@ -41,20 +41,19 @@ testMax("bcrypt.js", bcryptjs); console.log("## Comparing bcryptjs with bcrypt\n"); function next() { - if (testRounds.length === 0) - return; - (function(rounds) { - var salt = bcryptjs.genSaltSync(rounds); - console.log("#### Using "+rounds+" rounds"); - console.log("Salt: `"+salt+"` "); - testSync("* **bcrypt** sync", salt, bcrypt); - testSync("* **bcrypt.js** sync", salt, bcryptjs); - testAsync("* **bcrypt** async", salt, bcrypt, function() { - testAsync("* **bcrypt.js** async", salt, bcryptjs, function() { - console.log(""); - next(); - }); - }); - })(testRounds.shift()); + if (testRounds.length === 0) return; + (function (rounds) { + var salt = bcryptjs.genSaltSync(rounds); + console.log("#### Using " + rounds + " rounds"); + console.log("Salt: `" + salt + "` "); + testSync("* **bcrypt** sync", salt, bcrypt); + testSync("* **bcrypt.js** sync", salt, bcryptjs); + testAsync("* **bcrypt** async", salt, bcrypt, function () { + testAsync("* **bcrypt.js** async", salt, bcryptjs, function () { + console.log(""); + next(); + }); + }); + })(testRounds.shift()); } next(); diff --git a/tests/index.js b/tests/index.js index e87bd64..f7a16e6 100644 --- a/tests/index.js +++ b/tests/index.js @@ -1,189 +1,214 @@ import path from "node:path"; import fs from "node:fs"; import assert from "node:assert"; -import { fileURLToPath } from 'node:url'; - +import { fileURLToPath } from "node:url"; + import binding from "bcrypt"; import bcrypt from "../index.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const tests = [ - function encodeBase64(done) { - var str = bcrypt.encodeBase64([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10], 16); - assert.strictEqual(str, "..CA.uOD/eaGAOmJB.yMBu"); - done() - }, - function decodeBase64(done) { - var bytes = bcrypt.decodeBase64("..CA.uOD/eaGAOmJB.yMBv.", 16); - assert.deepEqual(bytes, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F]); - done() - }, - function genSaltSync(done) { - var salt = bcrypt.genSaltSync(10); - assert(salt); - assert(typeof salt === 'string'); - assert(salt.length > 0); - done() - }, - function genSalt(done) { - bcrypt.genSalt(10, function(err, salt) { - assert(!err); - assert(salt); - assert(typeof salt === 'string'); - assert(salt.length > 0); - done(); - }); - }, - function hashSync(done) { - assert.doesNotThrow(function() { - bcrypt.hashSync("hello", 10); - }); - assert.notEqual(bcrypt.hashSync("hello", 10), bcrypt.hashSync("hello", 10)); - done(); - }, - function hash(done) { - bcrypt.hash("hello", 10, function(err, hash) { - assert(!err); - assert(hash); - done(); - }); - }, - function compareSync(done) { - var salt1 = bcrypt.genSaltSync(), - hash1 = bcrypt.hashSync("hello", salt1); // $2b$ - var salt2 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2y$"), - hash2 = bcrypt.hashSync("world", salt2); - var salt3 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2a$"), - hash3 = bcrypt.hashSync("hello world", salt3); + function encodeBase64(done) { + var str = bcrypt.encodeBase64( + [ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + ], + 16, + ); + assert.strictEqual(str, "..CA.uOD/eaGAOmJB.yMBu"); + done(); + }, + function decodeBase64(done) { + var bytes = bcrypt.decodeBase64("..CA.uOD/eaGAOmJB.yMBv.", 16); + assert.deepEqual( + bytes, + [ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, + ], + ); + done(); + }, + function genSaltSync(done) { + var salt = bcrypt.genSaltSync(10); + assert(salt); + assert(typeof salt === "string"); + assert(salt.length > 0); + done(); + }, + function genSalt(done) { + bcrypt.genSalt(10, function (err, salt) { + assert(!err); + assert(salt); + assert(typeof salt === "string"); + assert(salt.length > 0); + done(); + }); + }, + function hashSync(done) { + assert.doesNotThrow(function () { + bcrypt.hashSync("hello", 10); + }); + assert.notEqual(bcrypt.hashSync("hello", 10), bcrypt.hashSync("hello", 10)); + done(); + }, + function hash(done) { + bcrypt.hash("hello", 10, function (err, hash) { + assert(!err); + assert(hash); + done(); + }); + }, + function compareSync(done) { + var salt1 = bcrypt.genSaltSync(), + hash1 = bcrypt.hashSync("hello", salt1); // $2b$ + var salt2 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2y$"), + hash2 = bcrypt.hashSync("world", salt2); + var salt3 = bcrypt.genSaltSync().replace(/\$2b\$/, "$2a$"), + hash3 = bcrypt.hashSync("hello world", salt3); - assert.strictEqual(hash1.substring(0,4), "$2b$"); - assert(bcrypt.compareSync("hello", hash1)); - assert(!bcrypt.compareSync("hello", hash2)); - assert(!bcrypt.compareSync("hello", hash3)); + assert.strictEqual(hash1.substring(0, 4), "$2b$"); + assert(bcrypt.compareSync("hello", hash1)); + assert(!bcrypt.compareSync("hello", hash2)); + assert(!bcrypt.compareSync("hello", hash3)); - assert.strictEqual(hash2.substring(0,4), "$2y$"); - assert(bcrypt.compareSync("world", hash2)); - assert(!bcrypt.compareSync("world", hash1)); - assert(!bcrypt.compareSync("world", hash3)); + assert.strictEqual(hash2.substring(0, 4), "$2y$"); + assert(bcrypt.compareSync("world", hash2)); + assert(!bcrypt.compareSync("world", hash1)); + assert(!bcrypt.compareSync("world", hash3)); - assert.strictEqual(hash3.substring(0,4), "$2a$"); - assert(bcrypt.compareSync("hello world", hash3)); - assert(!bcrypt.compareSync("hello world", hash1)); - assert(!bcrypt.compareSync("hello world", hash2)); + assert.strictEqual(hash3.substring(0, 4), "$2a$"); + assert(bcrypt.compareSync("hello world", hash3)); + assert(!bcrypt.compareSync("hello world", hash1)); + assert(!bcrypt.compareSync("hello world", hash2)); - done(); - }, - function compare(done) { - var salt1 = bcrypt.genSaltSync(), - hash1 = bcrypt.hashSync("hello", salt1); // $2a$ - var salt2 = bcrypt.genSaltSync(); - salt2 = salt2.substring(0,2)+'y'+salt2.substring(3); // $2y$ - var hash2 = bcrypt.hashSync("world", salt2); - bcrypt.compare("hello", hash1, function(err, same) { - assert(!err); - assert(same); - bcrypt.compare("hello", hash2, function(err, same) { - assert(!err); - assert(!same); - bcrypt.compare("world", hash2, function(err, same) { - assert(!err); - assert(same); - bcrypt.compare("world", hash1, function(err, same) { - assert(!err); - assert(!same); - done(); - }); - }); - }); - }); - }, - function getSalt(done) { - var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); - var salt = bcrypt.getSalt(hash1); - var hash2 = bcrypt.hashSync("hello", salt); - assert.equal(hash1, hash2); - done(); - }, - function getRounds(done) { - var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); - assert.equal(bcrypt.getRounds(hash1), 10); - done(); - }, - function progress(done) { - bcrypt.genSalt(12, function(err, salt) { + done(); + }, + function compare(done) { + var salt1 = bcrypt.genSaltSync(), + hash1 = bcrypt.hashSync("hello", salt1); // $2a$ + var salt2 = bcrypt.genSaltSync(); + salt2 = salt2.substring(0, 2) + "y" + salt2.substring(3); // $2y$ + var hash2 = bcrypt.hashSync("world", salt2); + bcrypt.compare("hello", hash1, function (err, same) { + assert(!err); + assert(same); + bcrypt.compare("hello", hash2, function (err, same) { + assert(!err); + assert(!same); + bcrypt.compare("world", hash2, function (err, same) { + assert(!err); + assert(same); + bcrypt.compare("world", hash1, function (err, same) { assert(!err); - var progress = []; - bcrypt.hash("hello world", salt, function(err, hash) { - assert(!err); - assert(typeof hash === 'string'); - assert(progress.length >= 2); - assert.strictEqual(progress[0], 0); - assert.strictEqual(progress[progress.length-1], 1); - done(); - }, function(n) { - progress.push(n); - }); + assert(!same); + done(); + }); }); - }, - function promise(done) { - bcrypt.genSalt(10) - .then(function(salt) { - bcrypt.hash("hello", salt) - .then(function(hash) { - assert(hash); - bcrypt.compare("hello", hash) - .then(function(result) { - assert(result); - bcrypt.genSalt(/* no args */) - .then(function(salt) { - assert(salt); - done(); - }, function(err) { - assert(false); - }); - }, function(err) { - assert(false); - }); - }, function(err) { - assert(false); - }); - }, function(err) { + }); + }); + }, + function getSalt(done) { + var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); + var salt = bcrypt.getSalt(hash1); + var hash2 = bcrypt.hashSync("hello", salt); + assert.equal(hash1, hash2); + done(); + }, + function getRounds(done) { + var hash1 = bcrypt.hashSync("hello", bcrypt.genSaltSync()); + assert.equal(bcrypt.getRounds(hash1), 10); + done(); + }, + function progress(done) { + bcrypt.genSalt(12, function (err, salt) { + assert(!err); + var progress = []; + bcrypt.hash( + "hello world", + salt, + function (err, hash) { + assert(!err); + assert(typeof hash === "string"); + assert(progress.length >= 2); + assert.strictEqual(progress[0], 0); + assert.strictEqual(progress[progress.length - 1], 1); + done(); + }, + function (n) { + progress.push(n); + }, + ); + }); + }, + function promise(done) { + bcrypt.genSalt(10).then( + function (salt) { + bcrypt.hash("hello", salt).then( + function (hash) { + assert(hash); + bcrypt.compare("hello", hash).then( + function (result) { + assert(result); + bcrypt.genSalt(/* no args */).then( + function (salt) { + assert(salt); + done(); + }, + function (err) { + assert(false); + }, + ); + }, + function (err) { assert(false); - }); - }, - function compat_quickbrown(done) { - var pass = fs.readFileSync(path.join(__dirname, "quickbrown.txt"))+"", - salt = bcrypt.genSaltSync(), - hash1 = binding.hashSync(pass, salt), - hash2 = bcrypt.hashSync(pass, salt); - assert.equal(hash1, hash2); - done(); - }, - function compat_roundsOOB(done) { - var salt1 = bcrypt.genSaltSync(0), // $10$ like not set - salt2 = binding.genSaltSync(0); - assert.strictEqual(salt1.substring(0, 7), "$2b$10$"); - assert.strictEqual(salt2.substring(0, 7), "$2b$10$"); + }, + ); + }, + function (err) { + assert(false); + }, + ); + }, + function (err) { + assert(false); + }, + ); + }, + function compat_quickbrown(done) { + var pass = fs.readFileSync(path.join(__dirname, "quickbrown.txt")) + "", + salt = bcrypt.genSaltSync(), + hash1 = binding.hashSync(pass, salt), + hash2 = bcrypt.hashSync(pass, salt); + assert.equal(hash1, hash2); + done(); + }, + function compat_roundsOOB(done) { + var salt1 = bcrypt.genSaltSync(0), // $10$ like not set + salt2 = binding.genSaltSync(0); + assert.strictEqual(salt1.substring(0, 7), "$2b$10$"); + assert.strictEqual(salt2.substring(0, 7), "$2b$10$"); - salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap - salt2 = bcrypt.genSaltSync(3); - assert.strictEqual(salt1.substring(0, 7), "$2b$04$"); - assert.strictEqual(salt2.substring(0, 7), "$2b$04$"); + salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap + salt2 = bcrypt.genSaltSync(3); + assert.strictEqual(salt1.substring(0, 7), "$2b$04$"); + assert.strictEqual(salt2.substring(0, 7), "$2b$04$"); - salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap - salt2 = bcrypt.genSaltSync(32); - assert.strictEqual(salt1.substring(0, 7), "$2b$31$"); - assert.strictEqual(salt2.substring(0, 7), "$2b$31$"); + salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap + salt2 = bcrypt.genSaltSync(32); + assert.strictEqual(salt1.substring(0, 7), "$2b$31$"); + assert.strictEqual(salt2.substring(0, 7), "$2b$31$"); - done(); - } -] + done(); + }, +]; function next() { - if (!tests.length) return - var test = tests.shift(); - console.log(test.name); - test(next); + if (!tests.length) return; + var test = tests.shift(); + console.log(test.name); + test(next); } next(); diff --git a/tests/typescript/test-import.ts b/tests/typescript/test-import.ts index fab9502..bc6ef0f 100644 --- a/tests/typescript/test-import.ts +++ b/tests/typescript/test-import.ts @@ -1,6 +1,6 @@ -import bcrypt, { hashSync } from '../../index.js'; +import bcrypt, { hashSync } from "../../index.js"; -bcrypt.hashSync('test'); -hashSync('test'); +bcrypt.hashSync("test"); +hashSync("test"); export default bcrypt; diff --git a/tests/typescript/test-require.ts b/tests/typescript/test-require.ts index 76a3ed1..6f594d7 100644 --- a/tests/typescript/test-require.ts +++ b/tests/typescript/test-require.ts @@ -1,5 +1,5 @@ import bcrypt = require("../../umd/index.js"); -bcrypt.hashSync('test'); +bcrypt.hashSync("test"); export = bcrypt; diff --git a/tests/typescript/tsconfig.esnext.json b/tests/typescript/tsconfig.esnext.json index d4d907b..2cccf2e 100644 --- a/tests/typescript/tsconfig.esnext.json +++ b/tests/typescript/tsconfig.esnext.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { - "module": "ESNext", + "module": "ESNext" }, "include": ["./test-import.ts"] } diff --git a/tests/typescript/tsconfig.nodenext.json b/tests/typescript/tsconfig.nodenext.json index 823d527..de7fc60 100644 --- a/tests/typescript/tsconfig.nodenext.json +++ b/tests/typescript/tsconfig.nodenext.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.base.json", "compilerOptions": { "module": "NodeNext", - "moduleResolution": "nodenext", + "moduleResolution": "nodenext" }, "include": ["./test-import.ts"] } diff --git a/types.d.ts b/types.d.ts index 742048c..07aaeb7 100644 --- a/types.d.ts +++ b/types.d.ts @@ -29,7 +29,9 @@ SOFTWARE * Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! * @param random Function taking the number of bytes to generate as its sole argument, returning the corresponding array of cryptographically secure random byte values. */ -export declare function setRandomFallback(random: (random: number) => number[]): void; +export declare function setRandomFallback( + random: (random: number) => number[], +): void; /** * Synchronously generates a salt. @@ -50,14 +52,19 @@ export declare function genSalt(rounds?: number): Promise; * Asynchronously generates a salt. * @param callback Callback receiving the error, if any, and the resulting salt */ -export declare function genSalt(callback: (err: Error | null, salt: string) => void): void; +export declare function genSalt( + callback: (err: Error | null, salt: string) => void, +): void; /** * Asynchronously generates a salt. * @param rounds Number of rounds to use, defaults to 10 if omitted * @param callback Callback receiving the error, if any, and the resulting salt */ -export declare function genSalt(rounds: number, callback: (err: Error | null, salt: string) => void): void; +export declare function genSalt( + rounds: number, + callback: (err: Error | null, salt: string) => void, +): void; /** * Synchronously generates a hash for the given string. @@ -83,10 +90,10 @@ export declare function hash(s: string, salt: number | string): Promise; * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. */ export declare function hash( - s: string, - salt: number | string, - callback?: (err: Error | null, hash: string) => void, - progressCallback?: (percent: number) => void, + s: string, + salt: number | string, + callback?: (err: Error | null, hash: string) => void, + progressCallback?: (percent: number) => void, ): void; /** @@ -113,10 +120,10 @@ export declare function compare(s: string, hash: string): Promise; * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. */ export declare function compare( - s: string, - hash: string, - callback?: (err: Error | null, success: boolean) => void, - progressCallback?: (percent: number) => void, + s: string, + hash: string, + callback?: (err: Error | null, success: boolean) => void, + progressCallback?: (percent: number) => void, ): void; /** @@ -139,7 +146,10 @@ export declare function getSalt(hash: string): string; * @param b Byte array * @param len Maximum input length */ -export declare function encodeBase64(b: Readonly>, len: number): string; +export declare function encodeBase64( + b: Readonly>, + len: number, +): string; /** * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. diff --git a/umd/index.d.ts b/umd/index.d.ts index 9de5a20..6fd7795 100644 --- a/umd/index.d.ts +++ b/umd/index.d.ts @@ -1,2 +1,2 @@ -import * as bcrypt from '../types.js'; +import * as bcrypt from "../types.js"; export = bcrypt; From 574d690d4972bcebbd5ca07880a62abab9ae3c0b Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 21:34:37 +0100 Subject: [PATCH 15/25] Adapt crypto module usage for ESM environments --- index.js | 23 +++++++++++++---------- package.json | 3 +++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index f959e18..cb0f626 100644 --- a/index.js +++ b/index.js @@ -26,6 +26,11 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +// The Node.js crypto module is used as a fallback for the Web Crypto API. When +// building for the browser, inclusion of the crypto module should be disabled, +// which the package hints at in its package.json for bundlers that support it. +import nodeCrypto from "crypto"; + /** * The random implementation to use as a fallback. * @type {?function(number):!Array.} @@ -41,18 +46,16 @@ var randomFallback = null; * @throws {Error} If no random implementation is available * @inner */ -function random(len) { - // Web Crypto API +function randomBytes(len) { + // Web Crypto API. Globally available in the browser and in Node.js >=23. try { return crypto.getRandomValues(new Uint8Array(len)); } catch {} - // Node.js crypto - if (typeof require === "function") { - try { - return require("crypto").randomBytes(len); - } catch {} - } - // Fallback + // Node.js crypto module for non-browser environments. + try { + return nodeCrypto.randomBytes(len); + } catch {} + // Custom fallback specified with `setRandomFallback`. if (!randomFallback) { throw Error( "Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative", @@ -97,7 +100,7 @@ export function genSaltSync(rounds, seed_length) { if (rounds < 10) salt.push("0"); salt.push(rounds.toString()); salt.push("$"); - salt.push(base64_encode(random(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw + salt.push(base64_encode(randomBytes(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw return salt.join(""); } diff --git a/package.json b/package.json index 6454159..2f199d9 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,9 @@ "LICENSE", "README.md" ], + "browser": { + "crypto": false + }, "devDependencies": { "bcrypt": "^5.1.1", "esm2umd": "^0.2.2", From ac70ac57c2f99ad5639eddf54578e5fdd07b9c4c Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 11 Feb 2025 21:38:53 +0100 Subject: [PATCH 16/25] Update lint workflow title --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b9cc9a7..57db73d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,4 +1,4 @@ -name: Test +name: Lint on: push: branches: From 9db275fa10b1b40da4a6844480d7f8ae8df27fb8 Mon Sep 17 00:00:00 2001 From: dcode Date: Wed, 12 Feb 2025 15:32:11 +0100 Subject: [PATCH 17/25] Update legacy fallback to handle crypto dependency --- package-lock.json | 28 ++++++--------------------- package.json | 4 ++-- tests/typescript/test-global.ts | 3 +++ tests/typescript/tsconfig.global.json | 7 +++++++ umd/index.d.ts | 1 + 5 files changed, 19 insertions(+), 24 deletions(-) create mode 100644 tests/typescript/test-global.ts create mode 100644 tests/typescript/tsconfig.global.json diff --git a/package-lock.json b/package-lock.json index f655e1d..743f383 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ }, "devDependencies": { "bcrypt": "^5.1.1", - "esm2umd": "^0.2.2", + "esm2umd": "^0.3.0", "prettier": "^3.5.0", "typescript": "^5.7.3" } @@ -245,23 +245,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/template": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", @@ -631,13 +614,14 @@ } }, "node_modules/esm2umd": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/esm2umd/-/esm2umd-0.2.2.tgz", - "integrity": "sha512-boNmWNAUIyir6V0V5XGJDQ79vHQgYdagXxVHdG2ArVkQ/e6daZ1PAqPLXdSepV+ehYPTsqdv6KPSejogORP68A==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/esm2umd/-/esm2umd-0.3.0.tgz", + "integrity": "sha512-dHcmK+4D2thL27HUz8UazgPqIIJARj+whPF/Wr5zraqlCe54UpPIFsg1wKRJEZK/BCmq6jPMqTtYBTXHz9j01A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.26.8", - "@babel/plugin-transform-modules-commonjs": "^7.26.3" + "@babel/helper-plugin-utils": "^7.26.5" }, "bin": { "esm2umd": "bin/esm2umd.js" diff --git a/package.json b/package.json index 2f199d9..8b1af6a 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "format": "prettier --write .", "test": "npm run test:unit && npm run test:typescript", "test:unit": "node tests", - "test:typescript": "tsc --project tests/typescript/tsconfig.esnext.json && tsc --project tests/typescript/tsconfig.nodenext.json && tsc --project tests/typescript/tsconfig.commonjs.json" + "test:typescript": "tsc --project tests/typescript/tsconfig.esnext.json && tsc --project tests/typescript/tsconfig.nodenext.json && tsc --project tests/typescript/tsconfig.commonjs.json && tsc --project tests/typescript/tsconfig.global.json" }, "files": [ "index.js", @@ -68,7 +68,7 @@ }, "devDependencies": { "bcrypt": "^5.1.1", - "esm2umd": "^0.2.2", + "esm2umd": "^0.3.0", "prettier": "^3.5.0", "typescript": "^5.7.3" } diff --git a/tests/typescript/test-global.ts b/tests/typescript/test-global.ts new file mode 100644 index 0000000..7cebe7e --- /dev/null +++ b/tests/typescript/test-global.ts @@ -0,0 +1,3 @@ +/// + +bcrypt.hashSync("test"); diff --git a/tests/typescript/tsconfig.global.json b/tests/typescript/tsconfig.global.json new file mode 100644 index 0000000..d3ce870 --- /dev/null +++ b/tests/typescript/tsconfig.global.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "None" + }, + "include": ["./test-global.ts"] +} diff --git a/umd/index.d.ts b/umd/index.d.ts index 6fd7795..8d29409 100644 --- a/umd/index.d.ts +++ b/umd/index.d.ts @@ -1,2 +1,3 @@ import * as bcrypt from "../types.js"; export = bcrypt; +export as namespace bcrypt; From ec02e8a0ada7a8f6c71a91df164db8c25bbbb7b4 Mon Sep 17 00:00:00 2001 From: dcode Date: Wed, 12 Feb 2025 15:48:48 +0100 Subject: [PATCH 18/25] Fix tests --- tests/index.js | 44 ++++++++----- tests/quickbrown.txt | 150 ------------------------------------------- 2 files changed, 28 insertions(+), 166 deletions(-) delete mode 100644 tests/quickbrown.txt diff --git a/tests/index.js b/tests/index.js index f7a16e6..15d9099 100644 --- a/tests/index.js +++ b/tests/index.js @@ -1,13 +1,7 @@ -import path from "node:path"; -import fs from "node:fs"; import assert from "node:assert"; -import { fileURLToPath } from "node:url"; - -import binding from "bcrypt"; +import bcryptcpp from "bcrypt"; import bcrypt from "../index.js"; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - const tests = [ function encodeBase64(done) { var str = bcrypt.encodeBase64( @@ -177,27 +171,45 @@ const tests = [ }, ); }, - function compat_quickbrown(done) { - var pass = fs.readFileSync(path.join(__dirname, "quickbrown.txt")) + "", - salt = bcrypt.genSaltSync(), - hash1 = binding.hashSync(pass, salt), - hash2 = bcrypt.hashSync(pass, salt); - assert.equal(hash1, hash2); + function compat_hash(done) { + var pass = [ + " space ", + "Heizölrückstoßabdämpfung", + "Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία", + "El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y ", + "Où l'obèse jury mûr", + "Úrmhac na hÓighe Beannaithe", + "Árvíztűrő tükörfúrógép", + "Sævör grét áðan því úlpan var ónýt", + "わかよたれそつねならむ", + "ケフコエテ アサキユメミシ", + "דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה", + "Pchnąć w tę łódź jeża lub ośm skrzyń fig", + "В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!", + "๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า", + "Pijamalı hasta, yağız şoföre çabucak güvendi.", + ]; + for (var i = 0; i < pass.length; i++) { + var salt = bcrypt.genSaltSync(), + hash1 = bcryptcpp.hashSync(pass[i], salt), + hash2 = bcrypt.hashSync(pass[i], salt); + assert.equal(hash1, hash2); + } done(); }, function compat_roundsOOB(done) { var salt1 = bcrypt.genSaltSync(0), // $10$ like not set - salt2 = binding.genSaltSync(0); + salt2 = bcryptcpp.genSaltSync(0); assert.strictEqual(salt1.substring(0, 7), "$2b$10$"); assert.strictEqual(salt2.substring(0, 7), "$2b$10$"); salt1 = bcrypt.genSaltSync(3); // $04$ is lower cap - salt2 = bcrypt.genSaltSync(3); + salt2 = bcryptcpp.genSaltSync(3); assert.strictEqual(salt1.substring(0, 7), "$2b$04$"); assert.strictEqual(salt2.substring(0, 7), "$2b$04$"); salt1 = bcrypt.genSaltSync(32); // $31$ is upper cap - salt2 = bcrypt.genSaltSync(32); + salt2 = bcryptcpp.genSaltSync(32); assert.strictEqual(salt1.substring(0, 7), "$2b$31$"); assert.strictEqual(salt2.substring(0, 7), "$2b$31$"); diff --git a/tests/quickbrown.txt b/tests/quickbrown.txt deleted file mode 100644 index 81e850f..0000000 --- a/tests/quickbrown.txt +++ /dev/null @@ -1,150 +0,0 @@ -Sentences that contain all letters commonly used in a language --------------------------------------------------------------- - -Markus Kuhn -- 2012-04-11 - -This is an example of a plain-text file encoded in UTF-8. - - -Danish (da) ---------- - - Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen - Wolther spillede på xylofon. - (= Quiz contestants were eating strawbery with cream while Wolther - the circus clown played on xylophone.) - -German (de) ------------ - - Falsches Üben von Xylophonmusik quält jeden größeren Zwerg - (= Wrongful practicing of xylophone music tortures every larger dwarf) - - Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich - (= Twelve boxing fighters hunted Eva across the dike of Sylt) - - Heizölrückstoßabdämpfung - (= fuel oil recoil absorber) - (jqvwxy missing, but all non-ASCII letters in one word) - -Greek (el) ----------- - - Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο - (= No more shall I see acacias or myrtles in the golden clearing) - - Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία - (= I uncover the soul-destroying abhorrence) - -English (en) ------------- - - The quick brown fox jumps over the lazy dog - -Spanish (es) ------------- - - El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y - frío, añoraba a su querido cachorro. - (Contains every letter and every accent, but not every combination - of vowel + acute.) - -French (fr) ------------ - - Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à - côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce - qui lui permet de penser à la cænogenèse de l'être dont il est question - dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, - pense-t-il, diminue çà et là la qualité de son œuvre. - - l'île exiguë - Où l'obèse jury mûr - Fête l'haï volapük, - Âne ex aéquo au whist, - Ôtez ce vœu déçu. - - Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en - canoë au delà des îles, près du mälström où brûlent les novæ. - -Irish Gaelic (ga) ------------------ - - D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh - -Hungarian (hu) --------------- - - Árvíztűrő tükörfúrógép - (= flood-proof mirror-drilling machine, only all non-ASCII letters) - -Icelandic (is) --------------- - - Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa - - Sævör grét áðan því úlpan var ónýt - (some ASCII letters missing) - -Japanese (jp) -------------- - - Hiragana: (Iroha) - - いろはにほへとちりぬるを - わかよたれそつねならむ - うゐのおくやまけふこえて - あさきゆめみしゑひもせす - - Katakana: - - イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム - ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン - -Hebrew (iw) ------------ - - ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה - -Polish (pl) ------------ - - Pchnąć w tę łódź jeża lub ośm skrzyń fig - (= To push a hedgehog or eight bins of figs in this boat) - -Russian (ru) ------------- - - В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! - (= Would a citrus live in the bushes of south? Yes, but only a fake one!) - - Съешь же ещё этих мягких французских булок да выпей чаю - (= Eat some more of these fresh French loafs and have some tea) - -Thai (th) ---------- - - [--------------------------|------------------------] - ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน - จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร - ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย - ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ - - [The copyright for the Thai example is owned by The Computer - Association of Thailand under the Royal Patronage of His Majesty the - King.] - -Turkish (tr) ------------- - - Pijamalı hasta, yağız şoföre çabucak güvendi. - (=Patient with pajamas, trusted swarthy driver quickly) - - -Special thanks to the people from all over the world who contributed -these sentences since 1999. - -A much larger collection of such pangrams is now available at - - http://en.wikipedia.org/wiki/List_of_pangrams - From 2e3b17659e8856696acfe3015631ce2989eb3084 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 13 Feb 2025 10:34:27 +0100 Subject: [PATCH 19/25] Merge lint and test workflows --- .github/workflows/lint.yml | 23 ----------------------- .github/workflows/test.yml | 12 +++++++++++- 2 files changed, 11 insertions(+), 24 deletions(-) delete mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 57db73d..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Lint -on: - push: - branches: - - main - pull_request: - workflow_dispatch: -jobs: - test: - name: Test - runs-on: ubuntu-latest - strategy: - matrix: - node_version: ["current"] - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node_version }} - - name: Install dependencies - run: npm ci --no-audit - - name: Lint - run: npm run lint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2fbc75e..dba6bb3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,8 +6,18 @@ on: pull_request: workflow_dispatch: jobs: + lint: + name: Check formatting + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - name: Install dependencies + run: npm ci --no-audit + - name: Lint + run: npm run lint test: - name: Test + name: Build and test runs-on: ubuntu-latest strategy: matrix: From 58333a1533dd53838e2697628f84b98d54a5c079 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 13 Feb 2025 11:57:23 +0100 Subject: [PATCH 20/25] Update types --- README.md | 33 ++++++++++++++++++++++----------- types.d.ts | 50 +++++++++++++++----------------------------------- 2 files changed, 37 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index a9f747a..f87dc4d 100644 --- a/README.md +++ b/README.md @@ -127,36 +127,44 @@ Usage: bcrypt [rounds|salt] ### Callback types -- type **Callback<`T`>**: `(err: Error | null, result?: T) => void` +- **Callback<`T`>**: `(err: Error | null, result?: T) => void`
+ Called with an error on failure or a value of type `T` upon success. -- type **ProgressCallback**: `(percentage: number) => void` +- **ProgressCallback**: `(percentage: number) => void`
+ Called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. -### Functions +- **RandomFallback**: `(length: number) => number[]`
+ Called to obtain random bytes when both [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) and Node.js + [crypto](http://nodejs.org/api/crypto.html) are not available. -- bcrypt.**setRandomFallback**(random: `(length: number) => number[]`): `void`
- Sets the pseudo random number generator to use as a fallback if neither Node's [crypto](http://nodejs.org/api/crypto.html) module nor the [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! +### Functions - bcrypt.**genSaltSync**(rounds?: `number`): `string`
Synchronously generates a salt. Number of rounds defaults to 10 when omitted. - bcrypt.**genSalt**(rounds?: `number`): `Promise`
- bcrypt.**genSalt**(rounds: `number`, callback: `Callback`): `void`
- bcrypt.**genSalt**(callback: `Callback`): `void`
+ Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. + +- bcrypt.**genSalt**([rounds: `number`, ]callback: `Callback`): `void`
Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. - bcrypt.**hashSync**(s: `string`, salt?: `number | string`): `string` Synchronously generates a hash for the given string. Number of rounds defaults to 10 when omitted. - bcrypt.**hash**(s: `string`, salt: `number | string`): `Promise`
- bcrypt.**hash**(s: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
- Asynchronously generates a hash for the given string. Optionally calls a progress callback with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. + Asynchronously generates a hash for the given string. + +- bcrypt.**hash**(s: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
+ Asynchronously generates a hash for the given string. - bcrypt.**compareSync**(s: `string`, hash: `string`): `boolean`
Synchronously tests a string against a hash. - bcrypt.**compare**(s: `string`, hash: `string`): `Promise`
- bcrypt.**compare**(s: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
- Asynchronously compares a string against a hash. Optionally calls a progress callback with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. + Asynchronously compares a string against a hash. + +- bcrypt.**compare**(s: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
+ Asynchronously compares a string against a hash. - bcrypt.**getRounds**(hash: `string`): `number`
Gets the number of rounds used to encrypt the specified hash. @@ -164,6 +172,9 @@ Usage: bcrypt [rounds|salt] - bcrypt.**getSalt**(hash: `string`): `string`
Gets the salt portion from a hash. Does not validate the hash. +- bcrypt.**setRandomFallback**(random: `RandomFallback`): `void`
+ Sets the pseudo random number generator to use as a fallback if neither [Web Crypto API](http://www.w3.org/TR/WebCryptoAPI/) nor Node.js [crypto](http://nodejs.org/api/crypto.html) are available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! + ## Building Building the UMD fallback: diff --git a/types.d.ts b/types.d.ts index 07aaeb7..7dc6e77 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1,37 +1,19 @@ -// imported from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/bcryptjs/index.d.ts +// Originally imported from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8b36dbdf95b624b8a7cd7f8416f06c15d274f9e6/types/bcryptjs/index.d.ts +// MIT license. -/* -MIT License - -Copyright (c) Microsoft Corporation. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE -*/ +/** Called with an error on failure or a value of type `T` upon success. */ +type Callback = (err: Error | null, result?: T) => void; +/** Called with the percentage of rounds completed (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. */ +type ProgressCallback = (percentage: number) => void; +/** Called to obtain random bytes when both Web Crypto API and Node.js crypto are not available. */ +type RandomFallback = (length: number) => number[]; /** * Sets the pseudo random number generator to use as a fallback if neither node's crypto module nor the Web Crypto API is available. * Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly! * @param random Function taking the number of bytes to generate as its sole argument, returning the corresponding array of cryptographically secure random byte values. */ -export declare function setRandomFallback( - random: (random: number) => number[], -): void; +export declare function setRandomFallback(random: RandomFallback): void; /** * Synchronously generates a salt. @@ -52,9 +34,7 @@ export declare function genSalt(rounds?: number): Promise; * Asynchronously generates a salt. * @param callback Callback receiving the error, if any, and the resulting salt */ -export declare function genSalt( - callback: (err: Error | null, salt: string) => void, -): void; +export declare function genSalt(callback: Callback): void; /** * Asynchronously generates a salt. @@ -63,7 +43,7 @@ export declare function genSalt( */ export declare function genSalt( rounds: number, - callback: (err: Error | null, salt: string) => void, + callback: Callback, ): void; /** @@ -92,8 +72,8 @@ export declare function hash(s: string, salt: number | string): Promise; export declare function hash( s: string, salt: number | string, - callback?: (err: Error | null, hash: string) => void, - progressCallback?: (percent: number) => void, + callback?: Callback, + progressCallback?: ProgressCallback, ): void; /** @@ -122,8 +102,8 @@ export declare function compare(s: string, hash: string): Promise; export declare function compare( s: string, hash: string, - callback?: (err: Error | null, success: boolean) => void, - progressCallback?: (percent: number) => void, + callback?: Callback, + progressCallback?: ProgressCallback, ): void; /** From e09eb9afb14170069aaea19631b763307ee7b480 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 13 Feb 2025 12:06:25 +0100 Subject: [PATCH 21/25] Add note on using the ESM variant in the browser --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f87dc4d..c8747a5 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,8 @@ import bcrypt from "bcryptjs"; Replace `TAG` respectively `VERSION` with a [specific version](https://github.com/dcodeIO/bcrypt.js/releases) or omit it (not recommended in production) to use latest. +When using the ESM variant in a browser, the `crypto` import needs to be stubbed out, for example using an [import map](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap). Bundlers should omit it automatically. + ### Usage - Sync To hash a password: From d5656b39e2e368c87724a312e4e454456a4e5d1b Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 13 Feb 2025 17:24:16 +0100 Subject: [PATCH 22/25] Add helper to check for password input length --- README.md | 32 +++++++++------- index.js | 99 +++++++++++++++++++++++++++++--------------------- tests/index.js | 15 +++++++- types.d.ts | 61 ++++++++++++++++++++----------- 4 files changed, 127 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index c8747a5..15546c4 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,9 @@ increasing computation power. ([see](http://en.wikipedia.org/wiki/Bcrypt)) While bcrypt.js is compatible to the C++ bcrypt binding, it is written in pure JavaScript and thus slower ([about 30%](https://github.com/dcodeIO/bcrypt.js/wiki/Benchmark)), effectively reducing the number of iterations that can be processed in an equal time span. -The maximum input length is 72 bytes (note that UTF8 encoded characters use up to 4 bytes) and the length of generated -hashes is 60 characters. +The maximum input length is 72 bytes (note that UTF-8 encoded characters use up to 4 bytes) and the length of generated +hashes is 60 characters. Note that maximum input length is not implicitly checked by the library for compatibility with +the C++ binding on Node.js, but should be checked with `bcrypt.truncates(password)` where necessary. ## Usage @@ -150,23 +151,26 @@ Usage: bcrypt [rounds|salt] - bcrypt.**genSalt**([rounds: `number`, ]callback: `Callback`): `void`
Asynchronously generates a salt. Number of rounds defaults to 10 when omitted. -- bcrypt.**hashSync**(s: `string`, salt?: `number | string`): `string` - Synchronously generates a hash for the given string. Number of rounds defaults to 10 when omitted. +- bcrypt.**truncates**(password: `string`): `boolean`
+ Tests if a password will be truncated when hashed, that is its length is greater than 72 bytes when converted to UTF-8. -- bcrypt.**hash**(s: `string`, salt: `number | string`): `Promise`
- Asynchronously generates a hash for the given string. +- bcrypt.**hashSync**(password: `string`, salt?: `number | string`): `string` + Synchronously generates a hash for the given password. Number of rounds defaults to 10 when omitted. -- bcrypt.**hash**(s: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
- Asynchronously generates a hash for the given string. +- bcrypt.**hash**(password: `string`, salt: `number | string`): `Promise`
+ Asynchronously generates a hash for the given password. -- bcrypt.**compareSync**(s: `string`, hash: `string`): `boolean`
- Synchronously tests a string against a hash. +- bcrypt.**hash**(password: `string`, salt: `number | string`, callback: `Callback`, progressCallback?: `ProgressCallback`): `void`
+ Asynchronously generates a hash for the given password. -- bcrypt.**compare**(s: `string`, hash: `string`): `Promise`
- Asynchronously compares a string against a hash. +- bcrypt.**compareSync**(password: `string`, hash: `string`): `boolean`
+ Synchronously tests a password against a hash. -- bcrypt.**compare**(s: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
- Asynchronously compares a string against a hash. +- bcrypt.**compare**(password: `string`, hash: `string`): `Promise`
+ Asynchronously compares a password against a hash. + +- bcrypt.**compare**(password: `string`, hash: `string`, callback: `Callback`, progressCallback?: `ProgressCallback`)
+ Asynchronously compares a password against a hash. - bcrypt.**getRounds**(hash: `string`): `number`
Gets the number of rounds used to encrypt the specified hash. diff --git a/index.js b/index.js index cb0f626..764ce77 100644 --- a/index.js +++ b/index.js @@ -148,22 +148,22 @@ export function genSalt(rounds, seed_length, callback) { } /** - * Synchronously generates a hash for the given string. - * @param {string} s String to hash + * Synchronously generates a hash for the given password. + * @param {string} password Password to hash * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10 * @returns {string} Resulting hash */ -export function hashSync(s, salt) { +export function hashSync(password, salt) { if (typeof salt === "undefined") salt = GENSALT_DEFAULT_LOG2_ROUNDS; if (typeof salt === "number") salt = genSaltSync(salt); - if (typeof s !== "string" || typeof salt !== "string") - throw Error("Illegal arguments: " + typeof s + ", " + typeof salt); - return _hash(s, salt); + if (typeof password !== "string" || typeof salt !== "string") + throw Error("Illegal arguments: " + typeof password + ", " + typeof salt); + return _hash(password, salt); } /** - * Asynchronously generates a hash for the given string. - * @param {string} s String to hash + * Asynchronously generates a hash for the given password. + * @param {string} password Password to hash * @param {number|string} salt Salt length to generate or salt to use * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed @@ -171,19 +171,19 @@ export function hashSync(s, salt) { * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function */ -export function hash(s, salt, callback, progressCallback) { +export function hash(password, salt, callback, progressCallback) { function _async(callback) { - if (typeof s === "string" && typeof salt === "number") + if (typeof password === "string" && typeof salt === "number") genSalt(salt, function (err, salt) { - _hash(s, salt, callback, progressCallback); + _hash(password, salt, callback, progressCallback); }); - else if (typeof s === "string" && typeof salt === "string") - _hash(s, salt, callback, progressCallback); + else if (typeof password === "string" && typeof salt === "string") + _hash(password, salt, callback, progressCallback); else nextTick( callback.bind( this, - Error("Illegal arguments: " + typeof s + ", " + typeof salt), + Error("Illegal arguments: " + typeof password + ", " + typeof salt), ), ); } @@ -220,39 +220,41 @@ function safeStringCompare(known, unknown) { } /** - * Synchronously tests a string against a hash. - * @param {string} s String to compare + * Synchronously tests a password against a hash. + * @param {string} password Password to compare * @param {string} hash Hash to test against * @returns {boolean} true if matching, otherwise false * @throws {Error} If an argument is illegal */ -export function compareSync(s, hash) { - if (typeof s !== "string" || typeof hash !== "string") - throw Error("Illegal arguments: " + typeof s + ", " + typeof hash); +export function compareSync(password, hash) { + if (typeof password !== "string" || typeof hash !== "string") + throw Error("Illegal arguments: " + typeof password + ", " + typeof hash); if (hash.length !== 60) return false; return safeStringCompare( - hashSync(s, hash.substring(0, hash.length - 31)), + hashSync(password, hash.substring(0, hash.length - 31)), hash, ); } /** - * Asynchronously compares the given data against the given hash. - * @param {string} s Data to compare - * @param {string} hashValue Data to be compared to + * Asynchronously tests a password against a hash. + * @param {string} password Password to compare + * @param {string} hashValue Hash to test against * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms. * @returns {!Promise} If `callback` has been omitted * @throws {Error} If `callback` is present but not a function */ -export function compare(s, hashValue, callback, progressCallback) { +export function compare(password, hashValue, callback, progressCallback) { function _async(callback) { - if (typeof s !== "string" || typeof hashValue !== "string") { + if (typeof password !== "string" || typeof hashValue !== "string") { nextTick( callback.bind( this, - Error("Illegal arguments: " + typeof s + ", " + typeof hashValue), + Error( + "Illegal arguments: " + typeof password + ", " + typeof hashValue, + ), ), ); return; @@ -262,7 +264,7 @@ export function compare(s, hashValue, callback, progressCallback) { return; } hash( - s, + password, hashValue.substring(0, 29), function (err, comp) { if (err) callback(err); @@ -314,6 +316,18 @@ export function getSalt(hash) { return hash.substring(0, 29); } +/** + * Tests if a password will be truncated when hashed, that is its length is + * greater than 72 bytes when converted to UTF-8. + * @param {string} password The password to test + * @returns {boolean} `true` if truncated, otherwise `false` + */ +export function truncates(password) { + if (typeof password !== "string") + throw Error("Illegal arguments: " + typeof password); + return utf8Length(password) > 72; +} + /** * Continues with the callback on the next tick. * @function @@ -960,7 +974,7 @@ function _crypt(b, salt, rounds, callback, progressCallback) { j; //Use typed arrays when available - huge speedup! - if (Int32Array) { + if (typeof Int32Array === "function") { P = new Int32Array(P_ORIG); S = new Int32Array(S_ORIG); } else { @@ -1014,8 +1028,8 @@ function _crypt(b, salt, rounds, callback, progressCallback) { } /** - * Internally hashes a string. - * @param {string} s String to hash + * Internally hashes a password. + * @param {string} password Password to hash * @param {?string} salt Salt to use, actually never null * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted, * hashing is performed synchronously. @@ -1023,9 +1037,9 @@ function _crypt(b, salt, rounds, callback, progressCallback) { * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined` * @inner */ -function _hash(s, salt, callback, progressCallback) { +function _hash(password, salt, callback, progressCallback) { var err; - if (typeof s !== "string" || typeof salt !== "string") { + if (typeof password !== "string" || typeof salt !== "string") { err = Error("Invalid string / salt: Not a string"); if (callback) { nextTick(callback.bind(this, err)); @@ -1070,9 +1084,9 @@ function _hash(s, salt, callback, progressCallback) { r2 = parseInt(salt.substring(offset + 1, offset + 2), 10), rounds = r1 + r2, real_salt = salt.substring(offset + 3, offset + 25); - s += minor >= "a" ? "\x00" : ""; + password += minor >= "a" ? "\x00" : ""; - var passwordb = utf8Array(s), + var passwordb = utf8Array(password), saltb = base64_decode(real_salt, BCRYPT_SALT_LEN); /** @@ -1115,23 +1129,23 @@ function _hash(s, salt, callback, progressCallback) { /** * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. * @function - * @param {!Array.} b Byte array - * @param {number} len Maximum input length + * @param {!Array.} bytes Byte array + * @param {number} length Maximum input length * @returns {string} */ -export function encodeBase64(b, len) { - return base64_encode(b, len); +export function encodeBase64(bytes, length) { + return base64_encode(bytes, length); } /** * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet. * @function - * @param {string} s String to decode - * @param {number} len Maximum output length + * @param {string} string String to decode + * @param {number} length Maximum output length * @returns {!Array.} */ -export function decodeBase64(s, len) { - return base64_decode(s, len); +export function decodeBase64(string, length) { + return base64_decode(string, length); } export default { @@ -1144,6 +1158,7 @@ export default { compare, getRounds, getSalt, + truncates, encodeBase64, decodeBase64, }; diff --git a/tests/index.js b/tests/index.js index 15d9099..4a83d2d 100644 --- a/tests/index.js +++ b/tests/index.js @@ -116,6 +116,13 @@ const tests = [ assert.equal(bcrypt.getRounds(hash1), 10); done(); }, + function truncates(done) { + assert(!bcrypt.truncates("")); + assert(!bcrypt.truncates("a".repeat(72))); + assert(bcrypt.truncates("a".repeat(73))); + assert(bcrypt.truncates("๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า")); + done(); + }, function progress(done) { bcrypt.genSalt(12, function (err, salt) { assert(!err); @@ -173,7 +180,11 @@ const tests = [ }, function compat_hash(done) { var pass = [ - " space ", + "", + " ", + " a ", + "a".repeat(72), + "a".repeat(73), "Heizölrückstoßabdämpfung", "Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία", "El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y ", @@ -197,7 +208,7 @@ const tests = [ } done(); }, - function compat_roundsOOB(done) { + function compat_rounds(done) { var salt1 = bcrypt.genSaltSync(0), // $10$ like not set salt2 = bcryptcpp.genSaltSync(0); assert.strictEqual(salt1.substring(0, 7), "$2b$10$"); diff --git a/types.d.ts b/types.d.ts index 7dc6e77..3cbe5b1 100644 --- a/types.d.ts +++ b/types.d.ts @@ -47,60 +47,69 @@ export declare function genSalt( ): void; /** - * Synchronously generates a hash for the given string. - * @param s String to hash + * Synchronously generates a hash for the given password. + * @param password Password to hash * @param salt Salt length to generate or salt to use, default to 10 * @return Resulting hash */ -export declare function hashSync(s: string, salt?: number | string): string; +export declare function hashSync( + password: string, + salt?: number | string, +): string; /** - * Asynchronously generates a hash for the given string. - * @param s String to hash - * @param salt Salt length to generate or salt to use + * Asynchronously generates a hash for the given password. + * @param password Password to hash + * @param salt Salt length to generate or salt to use * @return Promise with resulting hash, if callback has been omitted */ -export declare function hash(s: string, salt: number | string): Promise; +export declare function hash( + password: string, + salt: number | string, +): Promise; /** - * Asynchronously generates a hash for the given string. - * @param s String to hash + * Asynchronously generates a hash for the given password. + * @param password Password to hash * @param salt Salt length to generate or salt to use * @param callback Callback receiving the error, if any, and the resulting hash * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. */ export declare function hash( - s: string, + password: string, salt: number | string, callback?: Callback, progressCallback?: ProgressCallback, ): void; /** - * Synchronously tests a string against a hash. - * @param s String to compare - * @param hash Hash to test against + * Synchronously tests a password against a hash. + * @param password Password to test + * @param hash Hash to test against * @return true if matching, otherwise false */ -export declare function compareSync(s: string, hash: string): boolean; +export declare function compareSync(password: string, hash: string): boolean; /** - * Asynchronously compares the given data against the given hash. - * @param s Data to compare - * @param hash Data to be compared to + * Asynchronously tests a password against a hash. + * @param password Password to test + * @param hash Hash to test against * @return Promise, if callback has been omitted */ -export declare function compare(s: string, hash: string): Promise; +export declare function compare( + password: string, + hash: string, +): Promise; /** - * Asynchronously compares the given data against the given hash. - * @param s Data to compare - * @param hash Data to be compared to + * Asynchronously tests a password against a hash. + * @param password Password to test + * @param hash Hash to test against * @param callback Callback receiving the error, if any, otherwise the result * @param progressCallback Callback successively called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms. */ export declare function compare( - s: string, + password: string, hash: string, callback?: Callback, progressCallback?: ProgressCallback, @@ -120,6 +129,14 @@ export declare function getRounds(hash: string): number; */ export declare function getSalt(hash: string): string; +/** + * Tests if a password will be truncated when hashed, that is its length is + * greater than 72 bytes when converted to UTF-8. + * @param password The password to test + * @returns `true` if truncated, otherwise `false` + */ +export declare function truncates(password: string): boolean; + /** * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet. * @function From 2a9bea9e276e6be04dbd403f9695937788b3b10a Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 13 Feb 2025 19:22:45 +0100 Subject: [PATCH 23/25] Update publish workflow --- .github/workflows/publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 86a8c06..0fd5e48 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,6 +10,7 @@ jobs: - uses: actions/checkout@v4 with: ref: main + fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: current From e7055caf0c723cbcf8bc3f0784b8c30ee332380f Mon Sep 17 00:00:00 2001 From: dcode Date: Mon, 17 Feb 2025 17:00:02 +0100 Subject: [PATCH 24/25] fix: Separate ESM and UMD type definitions --- .gitignore | 1 + package.json | 5 +++-- scripts/build.js | 26 ++++++++++++++++++++++++++ umd/index.d.ts | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 scripts/build.js diff --git a/.gitignore b/.gitignore index d838984..7928a65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ npm-debug.* umd/index.js +umd/types.d.ts diff --git a/package.json b/package.json index 8b1af6a..e69e715 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "license": "BSD-3-Clause", "scripts": { - "build": "esm2umd bcrypt index.js > umd/index.js && prettier --write umd/index.js", + "build": "node scripts/build.js", "lint": "prettier --check .", "format": "prettier --write .", "test": "npm run test:unit && npm run test:typescript", @@ -56,10 +56,11 @@ "files": [ "index.js", "index.d.ts", + "types.d.ts", "umd/index.js", "umd/index.d.ts", + "umd/types.d.ts", "umd/package.json", - "types.d.ts", "LICENSE", "README.md" ], diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 0000000..393927c --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,26 @@ +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; +import esm2umd from "esm2umd"; +import prettier from "prettier"; + +const basePath = path.join(path.dirname(fileURLToPath(import.meta.url)), ".."); +const esmPath = path.join(basePath, "index.js"); +const umdPath = path.join(basePath, "umd", "index.js"); + +const esmSource = fs.readFileSync(esmPath, "utf8"); +const umdSource = esm2umd("bcrypt", esmSource); + +async function formatWithPrettier(source, filepath) { + const options = await prettier.resolveConfig(filepath); + return await prettier.format(source, { ...options, filepath }); +} + +const prettierUmdSource = await formatWithPrettier(umdSource, umdPath); + +fs.writeFileSync(umdPath, prettierUmdSource); + +fs.copyFileSync( + path.join(basePath, "types.d.ts"), + path.join(basePath, "umd", "types.d.ts"), +); diff --git a/umd/index.d.ts b/umd/index.d.ts index 8d29409..8c2eb07 100644 --- a/umd/index.d.ts +++ b/umd/index.d.ts @@ -1,3 +1,3 @@ -import * as bcrypt from "../types.js"; +import * as bcrypt from "./types.js"; export = bcrypt; export as namespace bcrypt; From 28e510389374f5736c447395443d4a6687325048 Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 18 Feb 2025 20:51:34 +0100 Subject: [PATCH 25/25] fix: Use upstream fix to emit interop helpers --- index.js | 3 --- package-lock.json | 8 ++++---- package.json | 2 +- tests/index.js | 7 +++++++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 764ce77..f91fff4 100644 --- a/index.js +++ b/index.js @@ -64,9 +64,6 @@ function randomBytes(len) { return randomFallback(len); } -// Default fallback, if any -randomFallback = null; - /** * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it diff --git a/package-lock.json b/package-lock.json index 743f383..2f8928e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ }, "devDependencies": { "bcrypt": "^5.1.1", - "esm2umd": "^0.3.0", + "esm2umd": "^0.3.1", "prettier": "^3.5.0", "typescript": "^5.7.3" } @@ -614,9 +614,9 @@ } }, "node_modules/esm2umd": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/esm2umd/-/esm2umd-0.3.0.tgz", - "integrity": "sha512-dHcmK+4D2thL27HUz8UazgPqIIJARj+whPF/Wr5zraqlCe54UpPIFsg1wKRJEZK/BCmq6jPMqTtYBTXHz9j01A==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/esm2umd/-/esm2umd-0.3.1.tgz", + "integrity": "sha512-5WcGtkITdTHoLSkM/ZGWgsieCvlPUJLJdGOAmnmXPjjNBU/lwMGg3D4Tx/FWe32pY0ZhhAwoM8Oy+1hBI7BKQg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e69e715..c5fd74d 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ }, "devDependencies": { "bcrypt": "^5.1.1", - "esm2umd": "^0.3.0", + "esm2umd": "^0.3.1", "prettier": "^3.5.0", "typescript": "^5.7.3" } diff --git a/tests/index.js b/tests/index.js index 4a83d2d..525a44d 100644 --- a/tests/index.js +++ b/tests/index.js @@ -1,7 +1,10 @@ import assert from "node:assert"; +import { createRequire } from "node:module"; import bcryptcpp from "bcrypt"; import bcrypt from "../index.js"; +const require = createRequire(import.meta.url); + const tests = [ function encodeBase64(done) { var str = bcrypt.encodeBase64( @@ -226,6 +229,10 @@ const tests = [ done(); }, + function commonJS(done) { + var umd = require("../umd/index.js"); + umd.genSalt().then(done); + }, ]; function next() { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy