index.js 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221
  1. // GENERATED FILE. DO NOT EDIT.
  2. (function (global, factory) {
  3. function preferDefault(exports) {
  4. return exports.default || exports;
  5. }
  6. if (typeof define === "function" && define.amd) {
  7. define(["crypto"], function (_crypto) {
  8. var exports = {};
  9. factory(exports, _crypto);
  10. return preferDefault(exports);
  11. });
  12. } else if (typeof exports === "object") {
  13. factory(exports, require("crypto"));
  14. if (typeof module === "object") module.exports = preferDefault(exports);
  15. } else {
  16. (function () {
  17. var exports = {};
  18. factory(exports, global.crypto);
  19. global.bcrypt = preferDefault(exports);
  20. })();
  21. }
  22. })(
  23. typeof globalThis !== "undefined"
  24. ? globalThis
  25. : typeof self !== "undefined"
  26. ? self
  27. : this,
  28. function (_exports, _crypto) {
  29. "use strict";
  30. Object.defineProperty(_exports, "__esModule", {
  31. value: true,
  32. });
  33. _exports.compare = compare;
  34. _exports.compareSync = compareSync;
  35. _exports.decodeBase64 = decodeBase64;
  36. _exports.default = void 0;
  37. _exports.encodeBase64 = encodeBase64;
  38. _exports.genSalt = genSalt;
  39. _exports.genSaltSync = genSaltSync;
  40. _exports.getRounds = getRounds;
  41. _exports.getSalt = getSalt;
  42. _exports.hash = hash;
  43. _exports.hashSync = hashSync;
  44. _exports.setRandomFallback = setRandomFallback;
  45. _exports.truncates = truncates;
  46. _crypto = _interopRequireDefault(_crypto);
  47. function _interopRequireDefault(e) {
  48. return e && e.__esModule ? e : { default: e };
  49. }
  50. /*
  51. Copyright (c) 2012 Nevins Bartolomeo <nevins.bartolomeo@gmail.com>
  52. Copyright (c) 2012 Shane Girish <shaneGirish@gmail.com>
  53. Copyright (c) 2025 Daniel Wirtz <dcode@dcode.io>
  54. Redistribution and use in source and binary forms, with or without
  55. modification, are permitted provided that the following conditions
  56. are met:
  57. 1. Redistributions of source code must retain the above copyright
  58. notice, this list of conditions and the following disclaimer.
  59. 2. Redistributions in binary form must reproduce the above copyright
  60. notice, this list of conditions and the following disclaimer in the
  61. documentation and/or other materials provided with the distribution.
  62. 3. The name of the author may not be used to endorse or promote products
  63. derived from this software without specific prior written permission.
  64. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  65. IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  66. OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  67. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  68. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  69. NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  70. DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  71. THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  72. (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  73. THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  74. */
  75. // The Node.js crypto module is used as a fallback for the Web Crypto API. When
  76. // building for the browser, inclusion of the crypto module should be disabled,
  77. // which the package hints at in its package.json for bundlers that support it.
  78. /**
  79. * The random implementation to use as a fallback.
  80. * @type {?function(number):!Array.<number>}
  81. * @inner
  82. */
  83. var randomFallback = null;
  84. /**
  85. * Generates cryptographically secure random bytes.
  86. * @function
  87. * @param {number} len Bytes length
  88. * @returns {!Array.<number>} Random bytes
  89. * @throws {Error} If no random implementation is available
  90. * @inner
  91. */
  92. function randomBytes(len) {
  93. // Web Crypto API. Globally available in the browser and in Node.js >=23.
  94. try {
  95. return crypto.getRandomValues(new Uint8Array(len));
  96. } catch {}
  97. // Node.js crypto module for non-browser environments.
  98. try {
  99. return _crypto.default.randomBytes(len);
  100. } catch {}
  101. // Custom fallback specified with `setRandomFallback`.
  102. if (!randomFallback) {
  103. throw Error(
  104. "Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative",
  105. );
  106. }
  107. return randomFallback(len);
  108. }
  109. /**
  110. * Sets the pseudo random number generator to use as a fallback if neither node's `crypto` module nor the Web Crypto
  111. * API is available. Please note: It is highly important that the PRNG used is cryptographically secure and that it
  112. * is seeded properly!
  113. * @param {?function(number):!Array.<number>} random Function taking the number of bytes to generate as its
  114. * sole argument, returning the corresponding array of cryptographically secure random byte values.
  115. * @see http://nodejs.org/api/crypto.html
  116. * @see http://www.w3.org/TR/WebCryptoAPI/
  117. */
  118. function setRandomFallback(random) {
  119. randomFallback = random;
  120. }
  121. /**
  122. * Synchronously generates a salt.
  123. * @param {number=} rounds Number of rounds to use, defaults to 10 if omitted
  124. * @param {number=} seed_length Not supported.
  125. * @returns {string} Resulting salt
  126. * @throws {Error} If a random fallback is required but not set
  127. */
  128. function genSaltSync(rounds, seed_length) {
  129. rounds = rounds || GENSALT_DEFAULT_LOG2_ROUNDS;
  130. if (typeof rounds !== "number")
  131. throw Error(
  132. "Illegal arguments: " + typeof rounds + ", " + typeof seed_length,
  133. );
  134. if (rounds < 4) rounds = 4;
  135. else if (rounds > 31) rounds = 31;
  136. var salt = [];
  137. salt.push("$2b$");
  138. if (rounds < 10) salt.push("0");
  139. salt.push(rounds.toString());
  140. salt.push("$");
  141. salt.push(base64_encode(randomBytes(BCRYPT_SALT_LEN), BCRYPT_SALT_LEN)); // May throw
  142. return salt.join("");
  143. }
  144. /**
  145. * Asynchronously generates a salt.
  146. * @param {(number|function(Error, string=))=} rounds Number of rounds to use, defaults to 10 if omitted
  147. * @param {(number|function(Error, string=))=} seed_length Not supported.
  148. * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting salt
  149. * @returns {!Promise} If `callback` has been omitted
  150. * @throws {Error} If `callback` is present but not a function
  151. */
  152. function genSalt(rounds, seed_length, callback) {
  153. if (typeof seed_length === "function")
  154. (callback = seed_length), (seed_length = undefined); // Not supported.
  155. if (typeof rounds === "function")
  156. (callback = rounds), (rounds = undefined);
  157. if (typeof rounds === "undefined") rounds = GENSALT_DEFAULT_LOG2_ROUNDS;
  158. else if (typeof rounds !== "number")
  159. throw Error("illegal arguments: " + typeof rounds);
  160. function _async(callback) {
  161. nextTick(function () {
  162. // Pretty thin, but salting is fast enough
  163. try {
  164. callback(null, genSaltSync(rounds));
  165. } catch (err) {
  166. callback(err);
  167. }
  168. });
  169. }
  170. if (callback) {
  171. if (typeof callback !== "function")
  172. throw Error("Illegal callback: " + typeof callback);
  173. _async(callback);
  174. } else
  175. return new Promise(function (resolve, reject) {
  176. _async(function (err, res) {
  177. if (err) {
  178. reject(err);
  179. return;
  180. }
  181. resolve(res);
  182. });
  183. });
  184. }
  185. /**
  186. * Synchronously generates a hash for the given password.
  187. * @param {string} password Password to hash
  188. * @param {(number|string)=} salt Salt length to generate or salt to use, default to 10
  189. * @returns {string} Resulting hash
  190. */
  191. function hashSync(password, salt) {
  192. if (typeof salt === "undefined") salt = GENSALT_DEFAULT_LOG2_ROUNDS;
  193. if (typeof salt === "number") salt = genSaltSync(salt);
  194. if (typeof password !== "string" || typeof salt !== "string")
  195. throw Error(
  196. "Illegal arguments: " + typeof password + ", " + typeof salt,
  197. );
  198. return _hash(password, salt);
  199. }
  200. /**
  201. * Asynchronously generates a hash for the given password.
  202. * @param {string} password Password to hash
  203. * @param {number|string} salt Salt length to generate or salt to use
  204. * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash
  205. * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
  206. * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
  207. * @returns {!Promise} If `callback` has been omitted
  208. * @throws {Error} If `callback` is present but not a function
  209. */
  210. function hash(password, salt, callback, progressCallback) {
  211. function _async(callback) {
  212. if (typeof password === "string" && typeof salt === "number")
  213. genSalt(salt, function (err, salt) {
  214. _hash(password, salt, callback, progressCallback);
  215. });
  216. else if (typeof password === "string" && typeof salt === "string")
  217. _hash(password, salt, callback, progressCallback);
  218. else
  219. nextTick(
  220. callback.bind(
  221. this,
  222. Error(
  223. "Illegal arguments: " + typeof password + ", " + typeof salt,
  224. ),
  225. ),
  226. );
  227. }
  228. if (callback) {
  229. if (typeof callback !== "function")
  230. throw Error("Illegal callback: " + typeof callback);
  231. _async(callback);
  232. } else
  233. return new Promise(function (resolve, reject) {
  234. _async(function (err, res) {
  235. if (err) {
  236. reject(err);
  237. return;
  238. }
  239. resolve(res);
  240. });
  241. });
  242. }
  243. /**
  244. * Compares two strings of the same length in constant time.
  245. * @param {string} known Must be of the correct length
  246. * @param {string} unknown Must be the same length as `known`
  247. * @returns {boolean}
  248. * @inner
  249. */
  250. function safeStringCompare(known, unknown) {
  251. var diff = known.length ^ unknown.length;
  252. for (var i = 0; i < known.length; ++i) {
  253. diff |= known.charCodeAt(i) ^ unknown.charCodeAt(i);
  254. }
  255. return diff === 0;
  256. }
  257. /**
  258. * Synchronously tests a password against a hash.
  259. * @param {string} password Password to compare
  260. * @param {string} hash Hash to test against
  261. * @returns {boolean} true if matching, otherwise false
  262. * @throws {Error} If an argument is illegal
  263. */
  264. function compareSync(password, hash) {
  265. if (typeof password !== "string" || typeof hash !== "string")
  266. throw Error(
  267. "Illegal arguments: " + typeof password + ", " + typeof hash,
  268. );
  269. if (hash.length !== 60) return false;
  270. return safeStringCompare(
  271. hashSync(password, hash.substring(0, hash.length - 31)),
  272. hash,
  273. );
  274. }
  275. /**
  276. * Asynchronously tests a password against a hash.
  277. * @param {string} password Password to compare
  278. * @param {string} hashValue Hash to test against
  279. * @param {function(Error, boolean)=} callback Callback receiving the error, if any, otherwise the result
  280. * @param {function(number)=} progressCallback Callback successively called with the percentage of rounds completed
  281. * (0.0 - 1.0), maximally once per `MAX_EXECUTION_TIME = 100` ms.
  282. * @returns {!Promise} If `callback` has been omitted
  283. * @throws {Error} If `callback` is present but not a function
  284. */
  285. function compare(password, hashValue, callback, progressCallback) {
  286. function _async(callback) {
  287. if (typeof password !== "string" || typeof hashValue !== "string") {
  288. nextTick(
  289. callback.bind(
  290. this,
  291. Error(
  292. "Illegal arguments: " +
  293. typeof password +
  294. ", " +
  295. typeof hashValue,
  296. ),
  297. ),
  298. );
  299. return;
  300. }
  301. if (hashValue.length !== 60) {
  302. nextTick(callback.bind(this, null, false));
  303. return;
  304. }
  305. hash(
  306. password,
  307. hashValue.substring(0, 29),
  308. function (err, comp) {
  309. if (err) callback(err);
  310. else callback(null, safeStringCompare(comp, hashValue));
  311. },
  312. progressCallback,
  313. );
  314. }
  315. if (callback) {
  316. if (typeof callback !== "function")
  317. throw Error("Illegal callback: " + typeof callback);
  318. _async(callback);
  319. } else
  320. return new Promise(function (resolve, reject) {
  321. _async(function (err, res) {
  322. if (err) {
  323. reject(err);
  324. return;
  325. }
  326. resolve(res);
  327. });
  328. });
  329. }
  330. /**
  331. * Gets the number of rounds used to encrypt the specified hash.
  332. * @param {string} hash Hash to extract the used number of rounds from
  333. * @returns {number} Number of rounds used
  334. * @throws {Error} If `hash` is not a string
  335. */
  336. function getRounds(hash) {
  337. if (typeof hash !== "string")
  338. throw Error("Illegal arguments: " + typeof hash);
  339. return parseInt(hash.split("$")[2], 10);
  340. }
  341. /**
  342. * Gets the salt portion from a hash. Does not validate the hash.
  343. * @param {string} hash Hash to extract the salt from
  344. * @returns {string} Extracted salt part
  345. * @throws {Error} If `hash` is not a string or otherwise invalid
  346. */
  347. function getSalt(hash) {
  348. if (typeof hash !== "string")
  349. throw Error("Illegal arguments: " + typeof hash);
  350. if (hash.length !== 60)
  351. throw Error("Illegal hash length: " + hash.length + " != 60");
  352. return hash.substring(0, 29);
  353. }
  354. /**
  355. * Tests if a password will be truncated when hashed, that is its length is
  356. * greater than 72 bytes when converted to UTF-8.
  357. * @param {string} password The password to test
  358. * @returns {boolean} `true` if truncated, otherwise `false`
  359. */
  360. function truncates(password) {
  361. if (typeof password !== "string")
  362. throw Error("Illegal arguments: " + typeof password);
  363. return utf8Length(password) > 72;
  364. }
  365. /**
  366. * Continues with the callback on the next tick.
  367. * @function
  368. * @param {function(...[*])} callback Callback to execute
  369. * @inner
  370. */
  371. var nextTick =
  372. typeof process !== "undefined" &&
  373. process &&
  374. typeof process.nextTick === "function"
  375. ? typeof setImmediate === "function"
  376. ? setImmediate
  377. : process.nextTick
  378. : setTimeout;
  379. /** Calculates the byte length of a string encoded as UTF8. */
  380. function utf8Length(string) {
  381. var len = 0,
  382. c = 0;
  383. for (var i = 0; i < string.length; ++i) {
  384. c = string.charCodeAt(i);
  385. if (c < 128) len += 1;
  386. else if (c < 2048) len += 2;
  387. else if (
  388. (c & 0xfc00) === 0xd800 &&
  389. (string.charCodeAt(i + 1) & 0xfc00) === 0xdc00
  390. ) {
  391. ++i;
  392. len += 4;
  393. } else len += 3;
  394. }
  395. return len;
  396. }
  397. /** Converts a string to an array of UTF8 bytes. */
  398. function utf8Array(string) {
  399. var offset = 0,
  400. c1,
  401. c2;
  402. var buffer = new Array(utf8Length(string));
  403. for (var i = 0, k = string.length; i < k; ++i) {
  404. c1 = string.charCodeAt(i);
  405. if (c1 < 128) {
  406. buffer[offset++] = c1;
  407. } else if (c1 < 2048) {
  408. buffer[offset++] = (c1 >> 6) | 192;
  409. buffer[offset++] = (c1 & 63) | 128;
  410. } else if (
  411. (c1 & 0xfc00) === 0xd800 &&
  412. ((c2 = string.charCodeAt(i + 1)) & 0xfc00) === 0xdc00
  413. ) {
  414. c1 = 0x10000 + ((c1 & 0x03ff) << 10) + (c2 & 0x03ff);
  415. ++i;
  416. buffer[offset++] = (c1 >> 18) | 240;
  417. buffer[offset++] = ((c1 >> 12) & 63) | 128;
  418. buffer[offset++] = ((c1 >> 6) & 63) | 128;
  419. buffer[offset++] = (c1 & 63) | 128;
  420. } else {
  421. buffer[offset++] = (c1 >> 12) | 224;
  422. buffer[offset++] = ((c1 >> 6) & 63) | 128;
  423. buffer[offset++] = (c1 & 63) | 128;
  424. }
  425. }
  426. return buffer;
  427. }
  428. // A base64 implementation for the bcrypt algorithm. This is partly non-standard.
  429. /**
  430. * bcrypt's own non-standard base64 dictionary.
  431. * @type {!Array.<string>}
  432. * @const
  433. * @inner
  434. **/
  435. var BASE64_CODE =
  436. "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(
  437. "",
  438. );
  439. /**
  440. * @type {!Array.<number>}
  441. * @const
  442. * @inner
  443. **/
  444. var BASE64_INDEX = [
  445. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  446. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  447. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60,
  448. 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  449. 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
  450. -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
  451. 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1,
  452. ];
  453. /**
  454. * Encodes a byte array to base64 with up to len bytes of input.
  455. * @param {!Array.<number>} b Byte array
  456. * @param {number} len Maximum input length
  457. * @returns {string}
  458. * @inner
  459. */
  460. function base64_encode(b, len) {
  461. var off = 0,
  462. rs = [],
  463. c1,
  464. c2;
  465. if (len <= 0 || len > b.length) throw Error("Illegal len: " + len);
  466. while (off < len) {
  467. c1 = b[off++] & 0xff;
  468. rs.push(BASE64_CODE[(c1 >> 2) & 0x3f]);
  469. c1 = (c1 & 0x03) << 4;
  470. if (off >= len) {
  471. rs.push(BASE64_CODE[c1 & 0x3f]);
  472. break;
  473. }
  474. c2 = b[off++] & 0xff;
  475. c1 |= (c2 >> 4) & 0x0f;
  476. rs.push(BASE64_CODE[c1 & 0x3f]);
  477. c1 = (c2 & 0x0f) << 2;
  478. if (off >= len) {
  479. rs.push(BASE64_CODE[c1 & 0x3f]);
  480. break;
  481. }
  482. c2 = b[off++] & 0xff;
  483. c1 |= (c2 >> 6) & 0x03;
  484. rs.push(BASE64_CODE[c1 & 0x3f]);
  485. rs.push(BASE64_CODE[c2 & 0x3f]);
  486. }
  487. return rs.join("");
  488. }
  489. /**
  490. * Decodes a base64 encoded string to up to len bytes of output.
  491. * @param {string} s String to decode
  492. * @param {number} len Maximum output length
  493. * @returns {!Array.<number>}
  494. * @inner
  495. */
  496. function base64_decode(s, len) {
  497. var off = 0,
  498. slen = s.length,
  499. olen = 0,
  500. rs = [],
  501. c1,
  502. c2,
  503. c3,
  504. c4,
  505. o,
  506. code;
  507. if (len <= 0) throw Error("Illegal len: " + len);
  508. while (off < slen - 1 && olen < len) {
  509. code = s.charCodeAt(off++);
  510. c1 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
  511. code = s.charCodeAt(off++);
  512. c2 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
  513. if (c1 == -1 || c2 == -1) break;
  514. o = (c1 << 2) >>> 0;
  515. o |= (c2 & 0x30) >> 4;
  516. rs.push(String.fromCharCode(o));
  517. if (++olen >= len || off >= slen) break;
  518. code = s.charCodeAt(off++);
  519. c3 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
  520. if (c3 == -1) break;
  521. o = ((c2 & 0x0f) << 4) >>> 0;
  522. o |= (c3 & 0x3c) >> 2;
  523. rs.push(String.fromCharCode(o));
  524. if (++olen >= len || off >= slen) break;
  525. code = s.charCodeAt(off++);
  526. c4 = code < BASE64_INDEX.length ? BASE64_INDEX[code] : -1;
  527. o = ((c3 & 0x03) << 6) >>> 0;
  528. o |= c4;
  529. rs.push(String.fromCharCode(o));
  530. ++olen;
  531. }
  532. var res = [];
  533. for (off = 0; off < olen; off++) res.push(rs[off].charCodeAt(0));
  534. return res;
  535. }
  536. /**
  537. * @type {number}
  538. * @const
  539. * @inner
  540. */
  541. var BCRYPT_SALT_LEN = 16;
  542. /**
  543. * @type {number}
  544. * @const
  545. * @inner
  546. */
  547. var GENSALT_DEFAULT_LOG2_ROUNDS = 10;
  548. /**
  549. * @type {number}
  550. * @const
  551. * @inner
  552. */
  553. var BLOWFISH_NUM_ROUNDS = 16;
  554. /**
  555. * @type {number}
  556. * @const
  557. * @inner
  558. */
  559. var MAX_EXECUTION_TIME = 100;
  560. /**
  561. * @type {Array.<number>}
  562. * @const
  563. * @inner
  564. */
  565. var P_ORIG = [
  566. 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
  567. 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
  568. 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b,
  569. ];
  570. /**
  571. * @type {Array.<number>}
  572. * @const
  573. * @inner
  574. */
  575. var S_ORIG = [
  576. 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
  577. 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
  578. 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
  579. 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
  580. 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
  581. 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
  582. 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
  583. 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
  584. 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
  585. 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
  586. 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
  587. 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
  588. 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
  589. 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
  590. 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
  591. 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
  592. 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
  593. 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
  594. 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
  595. 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
  596. 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
  597. 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
  598. 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
  599. 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
  600. 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
  601. 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
  602. 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
  603. 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
  604. 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
  605. 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
  606. 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
  607. 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
  608. 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
  609. 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
  610. 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
  611. 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
  612. 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
  613. 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
  614. 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
  615. 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
  616. 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
  617. 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
  618. 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944,
  619. 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
  620. 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
  621. 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
  622. 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26,
  623. 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
  624. 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c,
  625. 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
  626. 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6,
  627. 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
  628. 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f,
  629. 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
  630. 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
  631. 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
  632. 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa,
  633. 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
  634. 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55,
  635. 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
  636. 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1,
  637. 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
  638. 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78,
  639. 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
  640. 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
  641. 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
  642. 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170,
  643. 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
  644. 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7,
  645. 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
  646. 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099,
  647. 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
  648. 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263,
  649. 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
  650. 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
  651. 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
  652. 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7,
  653. 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
  654. 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d,
  655. 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
  656. 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460,
  657. 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
  658. 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484,
  659. 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
  660. 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
  661. 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
  662. 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a,
  663. 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
  664. 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785,
  665. 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
  666. 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900,
  667. 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
  668. 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9,
  669. 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
  670. 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
  671. 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
  672. 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9,
  673. 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
  674. 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f,
  675. 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
  676. 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e,
  677. 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
  678. 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd,
  679. 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
  680. 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
  681. 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
  682. 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c,
  683. 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
  684. 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b,
  685. 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
  686. 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386,
  687. 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
  688. 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0,
  689. 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
  690. 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
  691. 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
  692. 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770,
  693. 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
  694. 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c,
  695. 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
  696. 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa,
  697. 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
  698. 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63,
  699. 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
  700. 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
  701. 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
  702. 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4,
  703. 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
  704. 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
  705. 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
  706. 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
  707. 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
  708. 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
  709. 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
  710. 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
  711. 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
  712. 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
  713. 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
  714. 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
  715. 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
  716. 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
  717. 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
  718. 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
  719. 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
  720. 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
  721. 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
  722. 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
  723. 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
  724. 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
  725. 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
  726. 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
  727. 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
  728. 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
  729. 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
  730. 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
  731. 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
  732. 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
  733. 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
  734. 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
  735. 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
  736. 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
  737. 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
  738. 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
  739. 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
  740. 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
  741. 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
  742. 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
  743. 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
  744. 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
  745. 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
  746. 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
  747. ];
  748. /**
  749. * @type {Array.<number>}
  750. * @const
  751. * @inner
  752. */
  753. var C_ORIG = [
  754. 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274,
  755. ];
  756. /**
  757. * @param {Array.<number>} lr
  758. * @param {number} off
  759. * @param {Array.<number>} P
  760. * @param {Array.<number>} S
  761. * @returns {Array.<number>}
  762. * @inner
  763. */
  764. function _encipher(lr, off, P, S) {
  765. // This is our bottleneck: 1714/1905 ticks / 90% - see profile.txt
  766. var n,
  767. l = lr[off],
  768. r = lr[off + 1];
  769. l ^= P[0];
  770. /*
  771. for (var i=0, k=BLOWFISH_NUM_ROUNDS-2; i<=k;)
  772. // Feistel substitution on left word
  773. n = S[l >>> 24],
  774. n += S[0x100 | ((l >> 16) & 0xff)],
  775. n ^= S[0x200 | ((l >> 8) & 0xff)],
  776. n += S[0x300 | (l & 0xff)],
  777. r ^= n ^ P[++i],
  778. // Feistel substitution on right word
  779. n = S[r >>> 24],
  780. n += S[0x100 | ((r >> 16) & 0xff)],
  781. n ^= S[0x200 | ((r >> 8) & 0xff)],
  782. n += S[0x300 | (r & 0xff)],
  783. l ^= n ^ P[++i];
  784. */
  785. //The following is an unrolled version of the above loop.
  786. //Iteration 0
  787. n = S[l >>> 24];
  788. n += S[0x100 | ((l >> 16) & 0xff)];
  789. n ^= S[0x200 | ((l >> 8) & 0xff)];
  790. n += S[0x300 | (l & 0xff)];
  791. r ^= n ^ P[1];
  792. n = S[r >>> 24];
  793. n += S[0x100 | ((r >> 16) & 0xff)];
  794. n ^= S[0x200 | ((r >> 8) & 0xff)];
  795. n += S[0x300 | (r & 0xff)];
  796. l ^= n ^ P[2];
  797. //Iteration 1
  798. n = S[l >>> 24];
  799. n += S[0x100 | ((l >> 16) & 0xff)];
  800. n ^= S[0x200 | ((l >> 8) & 0xff)];
  801. n += S[0x300 | (l & 0xff)];
  802. r ^= n ^ P[3];
  803. n = S[r >>> 24];
  804. n += S[0x100 | ((r >> 16) & 0xff)];
  805. n ^= S[0x200 | ((r >> 8) & 0xff)];
  806. n += S[0x300 | (r & 0xff)];
  807. l ^= n ^ P[4];
  808. //Iteration 2
  809. n = S[l >>> 24];
  810. n += S[0x100 | ((l >> 16) & 0xff)];
  811. n ^= S[0x200 | ((l >> 8) & 0xff)];
  812. n += S[0x300 | (l & 0xff)];
  813. r ^= n ^ P[5];
  814. n = S[r >>> 24];
  815. n += S[0x100 | ((r >> 16) & 0xff)];
  816. n ^= S[0x200 | ((r >> 8) & 0xff)];
  817. n += S[0x300 | (r & 0xff)];
  818. l ^= n ^ P[6];
  819. //Iteration 3
  820. n = S[l >>> 24];
  821. n += S[0x100 | ((l >> 16) & 0xff)];
  822. n ^= S[0x200 | ((l >> 8) & 0xff)];
  823. n += S[0x300 | (l & 0xff)];
  824. r ^= n ^ P[7];
  825. n = S[r >>> 24];
  826. n += S[0x100 | ((r >> 16) & 0xff)];
  827. n ^= S[0x200 | ((r >> 8) & 0xff)];
  828. n += S[0x300 | (r & 0xff)];
  829. l ^= n ^ P[8];
  830. //Iteration 4
  831. n = S[l >>> 24];
  832. n += S[0x100 | ((l >> 16) & 0xff)];
  833. n ^= S[0x200 | ((l >> 8) & 0xff)];
  834. n += S[0x300 | (l & 0xff)];
  835. r ^= n ^ P[9];
  836. n = S[r >>> 24];
  837. n += S[0x100 | ((r >> 16) & 0xff)];
  838. n ^= S[0x200 | ((r >> 8) & 0xff)];
  839. n += S[0x300 | (r & 0xff)];
  840. l ^= n ^ P[10];
  841. //Iteration 5
  842. n = S[l >>> 24];
  843. n += S[0x100 | ((l >> 16) & 0xff)];
  844. n ^= S[0x200 | ((l >> 8) & 0xff)];
  845. n += S[0x300 | (l & 0xff)];
  846. r ^= n ^ P[11];
  847. n = S[r >>> 24];
  848. n += S[0x100 | ((r >> 16) & 0xff)];
  849. n ^= S[0x200 | ((r >> 8) & 0xff)];
  850. n += S[0x300 | (r & 0xff)];
  851. l ^= n ^ P[12];
  852. //Iteration 6
  853. n = S[l >>> 24];
  854. n += S[0x100 | ((l >> 16) & 0xff)];
  855. n ^= S[0x200 | ((l >> 8) & 0xff)];
  856. n += S[0x300 | (l & 0xff)];
  857. r ^= n ^ P[13];
  858. n = S[r >>> 24];
  859. n += S[0x100 | ((r >> 16) & 0xff)];
  860. n ^= S[0x200 | ((r >> 8) & 0xff)];
  861. n += S[0x300 | (r & 0xff)];
  862. l ^= n ^ P[14];
  863. //Iteration 7
  864. n = S[l >>> 24];
  865. n += S[0x100 | ((l >> 16) & 0xff)];
  866. n ^= S[0x200 | ((l >> 8) & 0xff)];
  867. n += S[0x300 | (l & 0xff)];
  868. r ^= n ^ P[15];
  869. n = S[r >>> 24];
  870. n += S[0x100 | ((r >> 16) & 0xff)];
  871. n ^= S[0x200 | ((r >> 8) & 0xff)];
  872. n += S[0x300 | (r & 0xff)];
  873. l ^= n ^ P[16];
  874. lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
  875. lr[off + 1] = l;
  876. return lr;
  877. }
  878. /**
  879. * @param {Array.<number>} data
  880. * @param {number} offp
  881. * @returns {{key: number, offp: number}}
  882. * @inner
  883. */
  884. function _streamtoword(data, offp) {
  885. for (var i = 0, word = 0; i < 4; ++i)
  886. (word = (word << 8) | (data[offp] & 0xff)),
  887. (offp = (offp + 1) % data.length);
  888. return {
  889. key: word,
  890. offp: offp,
  891. };
  892. }
  893. /**
  894. * @param {Array.<number>} key
  895. * @param {Array.<number>} P
  896. * @param {Array.<number>} S
  897. * @inner
  898. */
  899. function _key(key, P, S) {
  900. var offset = 0,
  901. lr = [0, 0],
  902. plen = P.length,
  903. slen = S.length,
  904. sw;
  905. for (var i = 0; i < plen; i++)
  906. (sw = _streamtoword(key, offset)),
  907. (offset = sw.offp),
  908. (P[i] = P[i] ^ sw.key);
  909. for (i = 0; i < plen; i += 2)
  910. (lr = _encipher(lr, 0, P, S)), (P[i] = lr[0]), (P[i + 1] = lr[1]);
  911. for (i = 0; i < slen; i += 2)
  912. (lr = _encipher(lr, 0, P, S)), (S[i] = lr[0]), (S[i + 1] = lr[1]);
  913. }
  914. /**
  915. * Expensive key schedule Blowfish.
  916. * @param {Array.<number>} data
  917. * @param {Array.<number>} key
  918. * @param {Array.<number>} P
  919. * @param {Array.<number>} S
  920. * @inner
  921. */
  922. function _ekskey(data, key, P, S) {
  923. var offp = 0,
  924. lr = [0, 0],
  925. plen = P.length,
  926. slen = S.length,
  927. sw;
  928. for (var i = 0; i < plen; i++)
  929. (sw = _streamtoword(key, offp)),
  930. (offp = sw.offp),
  931. (P[i] = P[i] ^ sw.key);
  932. offp = 0;
  933. for (i = 0; i < plen; i += 2)
  934. (sw = _streamtoword(data, offp)),
  935. (offp = sw.offp),
  936. (lr[0] ^= sw.key),
  937. (sw = _streamtoword(data, offp)),
  938. (offp = sw.offp),
  939. (lr[1] ^= sw.key),
  940. (lr = _encipher(lr, 0, P, S)),
  941. (P[i] = lr[0]),
  942. (P[i + 1] = lr[1]);
  943. for (i = 0; i < slen; i += 2)
  944. (sw = _streamtoword(data, offp)),
  945. (offp = sw.offp),
  946. (lr[0] ^= sw.key),
  947. (sw = _streamtoword(data, offp)),
  948. (offp = sw.offp),
  949. (lr[1] ^= sw.key),
  950. (lr = _encipher(lr, 0, P, S)),
  951. (S[i] = lr[0]),
  952. (S[i + 1] = lr[1]);
  953. }
  954. /**
  955. * Internaly crypts a string.
  956. * @param {Array.<number>} b Bytes to crypt
  957. * @param {Array.<number>} salt Salt bytes to use
  958. * @param {number} rounds Number of rounds
  959. * @param {function(Error, Array.<number>=)=} callback Callback receiving the error, if any, and the resulting bytes. If
  960. * omitted, the operation will be performed synchronously.
  961. * @param {function(number)=} progressCallback Callback called with the current progress
  962. * @returns {!Array.<number>|undefined} Resulting bytes if callback has been omitted, otherwise `undefined`
  963. * @inner
  964. */
  965. function _crypt(b, salt, rounds, callback, progressCallback) {
  966. var cdata = C_ORIG.slice(),
  967. clen = cdata.length,
  968. err;
  969. // Validate
  970. if (rounds < 4 || rounds > 31) {
  971. err = Error("Illegal number of rounds (4-31): " + rounds);
  972. if (callback) {
  973. nextTick(callback.bind(this, err));
  974. return;
  975. } else throw err;
  976. }
  977. if (salt.length !== BCRYPT_SALT_LEN) {
  978. err = Error(
  979. "Illegal salt length: " + salt.length + " != " + BCRYPT_SALT_LEN,
  980. );
  981. if (callback) {
  982. nextTick(callback.bind(this, err));
  983. return;
  984. } else throw err;
  985. }
  986. rounds = (1 << rounds) >>> 0;
  987. var P,
  988. S,
  989. i = 0,
  990. j;
  991. //Use typed arrays when available - huge speedup!
  992. if (typeof Int32Array === "function") {
  993. P = new Int32Array(P_ORIG);
  994. S = new Int32Array(S_ORIG);
  995. } else {
  996. P = P_ORIG.slice();
  997. S = S_ORIG.slice();
  998. }
  999. _ekskey(salt, b, P, S);
  1000. /**
  1001. * Calcualtes the next round.
  1002. * @returns {Array.<number>|undefined} Resulting array if callback has been omitted, otherwise `undefined`
  1003. * @inner
  1004. */
  1005. function next() {
  1006. if (progressCallback) progressCallback(i / rounds);
  1007. if (i < rounds) {
  1008. var start = Date.now();
  1009. for (; i < rounds; ) {
  1010. i = i + 1;
  1011. _key(b, P, S);
  1012. _key(salt, P, S);
  1013. if (Date.now() - start > MAX_EXECUTION_TIME) break;
  1014. }
  1015. } else {
  1016. for (i = 0; i < 64; i++)
  1017. for (j = 0; j < clen >> 1; j++) _encipher(cdata, j << 1, P, S);
  1018. var ret = [];
  1019. for (i = 0; i < clen; i++)
  1020. ret.push(((cdata[i] >> 24) & 0xff) >>> 0),
  1021. ret.push(((cdata[i] >> 16) & 0xff) >>> 0),
  1022. ret.push(((cdata[i] >> 8) & 0xff) >>> 0),
  1023. ret.push((cdata[i] & 0xff) >>> 0);
  1024. if (callback) {
  1025. callback(null, ret);
  1026. return;
  1027. } else return ret;
  1028. }
  1029. if (callback) nextTick(next);
  1030. }
  1031. // Async
  1032. if (typeof callback !== "undefined") {
  1033. next();
  1034. // Sync
  1035. } else {
  1036. var res;
  1037. while (true)
  1038. if (typeof (res = next()) !== "undefined") return res || [];
  1039. }
  1040. }
  1041. /**
  1042. * Internally hashes a password.
  1043. * @param {string} password Password to hash
  1044. * @param {?string} salt Salt to use, actually never null
  1045. * @param {function(Error, string=)=} callback Callback receiving the error, if any, and the resulting hash. If omitted,
  1046. * hashing is performed synchronously.
  1047. * @param {function(number)=} progressCallback Callback called with the current progress
  1048. * @returns {string|undefined} Resulting hash if callback has been omitted, otherwise `undefined`
  1049. * @inner
  1050. */
  1051. function _hash(password, salt, callback, progressCallback) {
  1052. var err;
  1053. if (typeof password !== "string" || typeof salt !== "string") {
  1054. err = Error("Invalid string / salt: Not a string");
  1055. if (callback) {
  1056. nextTick(callback.bind(this, err));
  1057. return;
  1058. } else throw err;
  1059. }
  1060. // Validate the salt
  1061. var minor, offset;
  1062. if (salt.charAt(0) !== "$" || salt.charAt(1) !== "2") {
  1063. err = Error("Invalid salt version: " + salt.substring(0, 2));
  1064. if (callback) {
  1065. nextTick(callback.bind(this, err));
  1066. return;
  1067. } else throw err;
  1068. }
  1069. if (salt.charAt(2) === "$")
  1070. (minor = String.fromCharCode(0)), (offset = 3);
  1071. else {
  1072. minor = salt.charAt(2);
  1073. if (
  1074. (minor !== "a" && minor !== "b" && minor !== "y") ||
  1075. salt.charAt(3) !== "$"
  1076. ) {
  1077. err = Error("Invalid salt revision: " + salt.substring(2, 4));
  1078. if (callback) {
  1079. nextTick(callback.bind(this, err));
  1080. return;
  1081. } else throw err;
  1082. }
  1083. offset = 4;
  1084. }
  1085. // Extract number of rounds
  1086. if (salt.charAt(offset + 2) > "$") {
  1087. err = Error("Missing salt rounds");
  1088. if (callback) {
  1089. nextTick(callback.bind(this, err));
  1090. return;
  1091. } else throw err;
  1092. }
  1093. var r1 = parseInt(salt.substring(offset, offset + 1), 10) * 10,
  1094. r2 = parseInt(salt.substring(offset + 1, offset + 2), 10),
  1095. rounds = r1 + r2,
  1096. real_salt = salt.substring(offset + 3, offset + 25);
  1097. password += minor >= "a" ? "\x00" : "";
  1098. var passwordb = utf8Array(password),
  1099. saltb = base64_decode(real_salt, BCRYPT_SALT_LEN);
  1100. /**
  1101. * Finishes hashing.
  1102. * @param {Array.<number>} bytes Byte array
  1103. * @returns {string}
  1104. * @inner
  1105. */
  1106. function finish(bytes) {
  1107. var res = [];
  1108. res.push("$2");
  1109. if (minor >= "a") res.push(minor);
  1110. res.push("$");
  1111. if (rounds < 10) res.push("0");
  1112. res.push(rounds.toString());
  1113. res.push("$");
  1114. res.push(base64_encode(saltb, saltb.length));
  1115. res.push(base64_encode(bytes, C_ORIG.length * 4 - 1));
  1116. return res.join("");
  1117. }
  1118. // Sync
  1119. if (typeof callback == "undefined")
  1120. return finish(_crypt(passwordb, saltb, rounds));
  1121. // Async
  1122. else {
  1123. _crypt(
  1124. passwordb,
  1125. saltb,
  1126. rounds,
  1127. function (err, bytes) {
  1128. if (err) callback(err, null);
  1129. else callback(null, finish(bytes));
  1130. },
  1131. progressCallback,
  1132. );
  1133. }
  1134. }
  1135. /**
  1136. * Encodes a byte array to base64 with up to len bytes of input, using the custom bcrypt alphabet.
  1137. * @function
  1138. * @param {!Array.<number>} bytes Byte array
  1139. * @param {number} length Maximum input length
  1140. * @returns {string}
  1141. */
  1142. function encodeBase64(bytes, length) {
  1143. return base64_encode(bytes, length);
  1144. }
  1145. /**
  1146. * Decodes a base64 encoded string to up to len bytes of output, using the custom bcrypt alphabet.
  1147. * @function
  1148. * @param {string} string String to decode
  1149. * @param {number} length Maximum output length
  1150. * @returns {!Array.<number>}
  1151. */
  1152. function decodeBase64(string, length) {
  1153. return base64_decode(string, length);
  1154. }
  1155. var _default = (_exports.default = {
  1156. setRandomFallback,
  1157. genSaltSync,
  1158. genSalt,
  1159. hashSync,
  1160. hash,
  1161. compareSync,
  1162. compare,
  1163. getRounds,
  1164. getSalt,
  1165. truncates,
  1166. encodeBase64,
  1167. decodeBase64,
  1168. });
  1169. },
  1170. );