112 lines
3.3 KiB
JavaScript
112 lines
3.3 KiB
JavaScript
"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; |