@ton/crypto
Version:
[](https://www.npmjs.com/package/@ton/crypto)
44 lines (43 loc) • 1.54 kB
JavaScript
/**
* Copyright (c) Whales Corp.
* All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSecureRandomNumber = exports.getSecureRandomWords = exports.getSecureRandomBytes = void 0;
const crypto_primitives_1 = require("@ton/crypto-primitives");
async function getSecureRandomBytes(size) {
return (0, crypto_primitives_1.getSecureRandomBytes)(size);
}
exports.getSecureRandomBytes = getSecureRandomBytes;
async function getSecureRandomWords(size) {
return getSecureRandomWords(size);
}
exports.getSecureRandomWords = getSecureRandomWords;
async function getSecureRandomNumber(min, max) {
let range = max - min;
var bitsNeeded = Math.ceil(Math.log2(range));
if (bitsNeeded > 53) {
throw new Error('Range is too large');
}
var bytesNeeded = Math.ceil(bitsNeeded / 8);
var mask = Math.pow(2, bitsNeeded) - 1;
while (true) {
let res = await getSecureRandomBytes(bitsNeeded);
let power = (bytesNeeded - 1) * 8;
let numberValue = 0;
for (var i = 0; i < bytesNeeded; i++) {
numberValue += res[i] * Math.pow(2, power);
power -= 8;
}
numberValue = numberValue & mask; // Truncate
if (numberValue >= range) {
continue;
}
return min + numberValue;
}
}
exports.getSecureRandomNumber = getSecureRandomNumber;
;