UNPKG

@gandlaf21/bc-ur

Version:

A JS implementation of the Uniform Resources (UR) specification from Blockchain Commons

61 lines (60 loc) 3.55 kB
"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;