@gandlaf21/bc-ur
Version:
A JS implementation of the Uniform Resources (UR) specification from Blockchain Commons
61 lines (60 loc) • 3.55 kB
JavaScript
"use strict";
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("./utils");
var bignumber_js_1 = __importDefault(require("bignumber.js"));
var jsbi_1 = __importDefault(require("jsbi"));
var MAX_UINT64 = 0xFFFFFFFFFFFFFFFF;
var rotl = function (x, k) { return jsbi_1.default.bitwiseXor(jsbi_1.default.asUintN(64, jsbi_1.default.leftShift(x, jsbi_1.default.BigInt(k))), jsbi_1.default.BigInt(jsbi_1.default.asUintN(64, jsbi_1.default.signedRightShift(x, (jsbi_1.default.subtract(jsbi_1.default.BigInt(64), jsbi_1.default.BigInt(k))))))); };
var Xoshiro = /** @class */ (function () {
function Xoshiro(seed) {
var _this = this;
this.next = function () {
return new bignumber_js_1.default(_this.roll().toString());
};
this.nextDouble = function () {
return new bignumber_js_1.default(_this.roll().toString()).div(MAX_UINT64 + 1);
};
this.nextInt = function (low, high) {
return Math.floor((_this.nextDouble().toNumber() * (high - low + 1)) + low);
};
this.nextByte = function () { return _this.nextInt(0, 255); };
this.nextData = function (count) { return (__spreadArrays(new Array(count)).map(function () { return _this.nextByte(); })); };
var digest = utils_1.sha256Hash(seed);
this.s = [jsbi_1.default.BigInt(0), jsbi_1.default.BigInt(0), jsbi_1.default.BigInt(0), jsbi_1.default.BigInt(0)];
this.setS(digest);
}
Xoshiro.prototype.setS = function (digest) {
for (var i = 0; i < 4; i++) {
var o = i * 8;
var v = jsbi_1.default.BigInt(0);
for (var n = 0; n < 8; n++) {
v = jsbi_1.default.asUintN(64, jsbi_1.default.leftShift(v, jsbi_1.default.BigInt(8)));
v = jsbi_1.default.asUintN(64, jsbi_1.default.bitwiseOr(v, jsbi_1.default.BigInt(digest[o + n])));
}
this.s[i] = jsbi_1.default.asUintN(64, v);
}
};
Xoshiro.prototype.roll = function () {
var result = jsbi_1.default.asUintN(64, jsbi_1.default.multiply(rotl(jsbi_1.default.asUintN(64, jsbi_1.default.multiply(this.s[1], jsbi_1.default.BigInt(5))), 7), jsbi_1.default.BigInt(9)));
var t = jsbi_1.default.asUintN(64, jsbi_1.default.leftShift(this.s[1], jsbi_1.default.BigInt(17)));
this.s[2] = jsbi_1.default.asUintN(64, jsbi_1.default.bitwiseXor(this.s[2], jsbi_1.default.BigInt(this.s[0])));
this.s[3] = jsbi_1.default.asUintN(64, jsbi_1.default.bitwiseXor(this.s[3], jsbi_1.default.BigInt(this.s[1])));
this.s[1] = jsbi_1.default.asUintN(64, jsbi_1.default.bitwiseXor(this.s[1], jsbi_1.default.BigInt(this.s[2])));
this.s[0] = jsbi_1.default.asUintN(64, jsbi_1.default.bitwiseXor(this.s[0], jsbi_1.default.BigInt(this.s[3])));
this.s[2] = jsbi_1.default.asUintN(64, jsbi_1.default.bitwiseXor(this.s[2], jsbi_1.default.BigInt(t)));
this.s[3] = jsbi_1.default.asUintN(64, rotl(this.s[3], 45));
return result;
};
return Xoshiro;
}());
exports.default = Xoshiro;