"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getRandomBytes = exports.getRandomSampledString = exports.getRandomAsciiString = exports.getRandomString = void 0; var util = _interopRequireWildcard(require("js-crypto-env")); /** * random.js */ /** * Secure random string generator based on getRandomBytes, * which is composed of uppercase or lowercase alphanumeric characters; * @param {Number} len - Length of string. * @return {String} - Generated random ASCII string. */ var getRandomString = function getRandomString(len) { var array = getRandomBytes(len); var types = getRandomBytes(len); // indicating alphanumeric, upper, lower var finalString = ''; // Ascii code // 1-0: 0x30 -- 0x39, 10 chars // A-Z: 0x41 -- 0x5a, // a-z: 0x61 -- 0x7a for (var i = 0; i < len; i++) { types[i] = types[i] % 3; array[i] = types[i] === 0 ? array[i] % 10 + 0x30 : array[i] % 26 + (types[i] === 1 ? 0x41 : 0x61); finalString += String.fromCharCode(array[i]); } return finalString; }; /** * Secure random 'ASCII' string generator based on getRandomBytes; * @param {Number} len - Length of ASCII string. * @return {String} - Generated random ASCII string. */ exports.getRandomString = getRandomString; var getRandomAsciiString = function getRandomAsciiString(len) { var array = getRandomBytes(len); var finalString = ''; // Ascii code excluding control characters are in 0x20 -- 0x7e for (var i = 0; i < len; i++) { array[i] = array[i] % 0x5e + 0x20; finalString += String.fromCharCode(array[i]); } return finalString; }; /** * Secure random string generator based on getRandomBytes, * which is composed of givin character candidates; * @param {Number} len - Length of string. * @param {String} candidates - Candidates string to sample randomly. * @return {String} - Generated random string. */ exports.getRandomAsciiString = getRandomAsciiString; var getRandomSampledString = function getRandomSampledString(len, candidates) { var candidate_len = candidates.length; if (candidate_len === 0) return ''; var array = getRandomBytes(len); var finalString = ''; for (var i = 0; i < len; i++) { finalString += candidates[array[i] % candidate_len]; } return finalString; }; /** * Secure random generator that returns a byte array filled with cryptographically secure random bytes * @param {Number} len - Byte length of random sequence. * @return {Uint8Array} - Generated random sequence. * @throws {Error} - Throws if UnsupportedEnvironment. */ exports.getRandomSampledString = getRandomSampledString; var getRandomBytes = function getRandomBytes(len) { var webCrypto = util.getRootWebCryptoAll(); // web crypto api or ms crypto var nodeCrypto = util.getNodeCrypto(); // implementation on node.js var array; if (typeof webCrypto !== 'undefined' && typeof webCrypto.getRandomValues === 'function') { array = new Uint8Array(len); webCrypto.getRandomValues(array); // for modern browsers or legacy ie 11 } else if (typeof nodeCrypto !== 'undefined') { // for node array = new Uint8Array(nodeCrypto.randomBytes(len)); } else { throw new Error('UnsupportedEnvironment'); } return array; }; exports.getRandomBytes = getRandomBytes;