UNPKG

js-ecutils

Version:

JavaScript Library for Elliptic Curve Cryptography: key exchanges (Diffie-Hellman, Massey-Omura), ECDSA signatures, and Koblitz encoding. Suitable for crypto education and secure systems.

320 lines (313 loc) 53.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DigitalSignature = void 0; var _registry = require("../curves/registry.js"); var _math = require("../utils/math.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); } function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); } function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; } function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); } function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); } function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); } function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); } function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } function _OverloadYield(e, d) { this.v = e, this.k = d; } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * Elliptic Curve Digital Signature Algorithm (ECDSA). * * ECDSA provides authentication and integrity through digital signatures * based on elliptic curve cryptography. * * Signing (private key d, generator G of order n): * 1. Choose random k ∈ [1, n-1] * 2. R = k·G, r = R.x mod n * 3. s = (hash + r·d) · k⁻¹ mod n * * Verification (public key Q = d·G): * 1. w = s⁻¹ mod n * 2. u₁ = hash·w mod n, u₂ = r·w mod n * 3. R' = u₁·G + u₂·Q * 4. Accept iff R'.x mod n = r * * Usage: * * const signer = new DigitalSignature(123456n, 'secp256k1') * const [r, s] = signer.sign(messageHash) * signer.verify(signer.publicKey, messageHash, r, s) // true */ /** * Get the crypto module (works in both Node.js and browsers). * Uses globalThis.crypto (Web Crypto API) when available, with * a dynamic require fallback for Node.js environments. */ /* istanbul ignore next -- environment-specific crypto detection */ function getCrypto() { if (typeof globalThis.crypto !== 'undefined') return globalThis.crypto; var mod = 'crypto'; return typeof require !== 'undefined' ? require(mod) : null; // eslint-disable-line no-undef } /** * Generate a cryptographically secure random BigInt in [1, max-1]. * * Uses crypto.getRandomValues() (CSPRNG) instead of Math.random() * to prevent nonce prediction attacks. */ function secureRandBelow(max) { if (max <= 1n) return 1n; var byteLen = max.toString(16).length + 1 >> 1; var bytes = new Uint8Array(byteLen); var result; do { var cryptoMod = getCrypto(); if (cryptoMod && cryptoMod.getRandomValues) { cryptoMod.getRandomValues(bytes); } /* istanbul ignore next -- Node.js without Web Crypto */else if (cryptoMod && cryptoMod.randomBytes) { var buf = cryptoMod.randomBytes(byteLen); bytes.set(buf); } else { /* istanbul ignore next */ throw new Error('No secure random number generator available.'); } var hex = ''; for (var i = 0; i < bytes.length; i++) { hex += bytes[i].toString(16).padStart(2, '0'); } result = BigInt('0x' + hex) % max; } while (result === 0n); return result; } /** * ECDSA signature generation and verification. */ var DigitalSignature = exports.DigitalSignature = /*#__PURE__*/function () { /** * @param {BigInt} privateKey - The private scalar d. * @param {string} [curveName='secp256k1'] - Name of the curve. */ function DigitalSignature(privateKey) { var curveName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'secp256k1'; _classCallCheck(this, DigitalSignature); this.privateKey = privateKey; this.curveName = curveName; Object.freeze(this); } return _createClass(DigitalSignature, [{ key: "_curve", get: function get() { return (0, _registry.getCurve)(this.curveName); } }, { key: "_G", get: function get() { return (0, _registry.getGenerator)(this.curveName); } /** * Compute the public key: Q = d · G. */ }, { key: "publicKey", get: function get() { return this._G.mul(this.privateKey); } /** * Generate an ECDSA signature for a message hash. * * Algorithm: * 1. Choose random k ∈ [1, n-1] * 2. R = k·G, r = R.x mod n * 3. s = (m + r·d) · k⁻¹ mod n (d = private key, m = hash) * * Warning: the nonce k must NEVER be reused across different messages. * Reusing k leaks the private key (as demonstrated in the 2010 Sony * PS3 ECDSA attack). * * @param {BigInt} messageHash - Integer hash of the message (e.g. SHA-256). * @returns {[BigInt, BigInt]} [r, s] */ }, { key: "sign", value: function sign(messageHash) { var n = this._curve.n; var G = this._G; var r = 0n, s = 0n; while (r === 0n || s === 0n) { var k = secureRandBelow(n); var R = G.mul(k); r = (0, _math.modulus)(R.x, n); s = (0, _math.modulus)((messageHash + r * this.privateKey) * (0, _math.modInverse)(k, n), n); } return [r, s]; } /** * Verify an ECDSA signature. * * Algorithm: * 1. w = s⁻¹ mod n * 2. u₁ = m·w mod n, u₂ = r·w mod n * 3. R' = u₁·G + u₂·Q (Q = public key) * 4. Accept iff R'.x mod n = r * * @param {Point} publicKey - The signer's public key Q. * @param {BigInt} messageHash - Integer hash of the signed message. * @param {BigInt} r - First component of the signature. * @param {BigInt} s - Second component of the signature. * @returns {boolean} * @throws {Error} If r or s are outside [1, n-1]. */ }, { key: "verify", value: function verify(publicKey, messageHash, r, s) { var n = this._curve.n; if (!(1n <= r && r < n && 1n <= s && s < n)) { throw new Error('r or s are not in the valid range [1, n-1].'); } var G = this._G; var w = (0, _math.modInverse)(s, n); var u1 = (0, _math.modulus)(messageHash * w, n); var u2 = (0, _math.modulus)(r * w, n); var R = G.mul(u1).add(publicKey.mul(u2)); return (0, _math.modulus)(R.x, n) === r; } /** * Hash a message and sign it. * * Computes SHA-256(message) and converts the hex digest to an integer * before signing. * * @param {Uint8Array|string} message - The raw message to sign. * @param {Function} [hashFunc] - Optional async hash function * returning a hex string. Defaults to SHA-256. * @returns {Promise<[BigInt, BigInt]>} [r, s] */ }, { key: "signMessage", value: (function () { var _signMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(message, hashFunc) { var messageHash; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return defaultHash(message, hashFunc); case 2: messageHash = _context.sent; return _context.abrupt("return", this.sign(messageHash)); case 4: case "end": return _context.stop(); } }, _callee, this); })); function signMessage(_x, _x2) { return _signMessage.apply(this, arguments); } return signMessage; }() /** * Hash a message and verify its ECDSA signature. * * @param {Point} publicKey - The signer's public key. * @param {Uint8Array|string} message - The raw message. * @param {BigInt} r - First component of the signature. * @param {BigInt} s - Second component of the signature. * @param {Function} [hashFunc] - Optional async hash function. * @returns {Promise<boolean>} */ ) }, { key: "verifyMessage", value: (function () { var _verifyMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(publicKey, message, r, s, hashFunc) { var messageHash; return _regeneratorRuntime().wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return defaultHash(message, hashFunc); case 2: messageHash = _context2.sent; return _context2.abrupt("return", this.verify(publicKey, messageHash, r, s)); case 4: case "end": return _context2.stop(); } }, _callee2, this); })); function verifyMessage(_x3, _x4, _x5, _x6, _x7) { return _verifyMessage.apply(this, arguments); } return verifyMessage; }()) }]); }(); /** * Default hash: SHA-256 via Web Crypto or Node.js crypto. * Returns the digest as a BigInt. */ function defaultHash(_x8, _x9) { return _defaultHash.apply(this, arguments); } function _defaultHash() { _defaultHash = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(message, hashFunc) { var hex, bytes, cryptoMod, digest, arr, _hex, i, hash; return _regeneratorRuntime().wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (!hashFunc) { _context3.next = 5; break; } _context3.next = 3; return hashFunc(message); case 3: hex = _context3.sent; return _context3.abrupt("return", BigInt('0x' + hex)); case 5: if (typeof message === 'string') { bytes = new TextEncoder().encode(message); } else { bytes = message; } cryptoMod = getCrypto(); if (!(cryptoMod && cryptoMod.subtle)) { _context3.next = 15; break; } _context3.next = 10; return cryptoMod.subtle.digest('SHA-256', bytes); case 10: digest = _context3.sent; arr = new Uint8Array(digest); _hex = ''; for (i = 0; i < arr.length; i++) { _hex += arr[i].toString(16).padStart(2, '0'); } return _context3.abrupt("return", BigInt('0x' + _hex)); case 15: if (!(cryptoMod && cryptoMod.createHash)) { _context3.next = 18; break; } hash = cryptoMod.createHash('sha256').update(bytes).digest('hex'); return _context3.abrupt("return", BigInt('0x' + hash)); case 18: throw new Error('No hash function available.'); case 19: case "end": return _context3.stop(); } }, _callee3); })); return _defaultHash.apply(this, arguments); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVnaXN0cnkiLCJyZXF1aXJlIiwiX21hdGgiLCJfdHlwZW9mIiwibyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwiciIsIl9yZWdlbmVyYXRvciIsImUiLCJtIiwidCIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwibiIsImRpc3BsYXlOYW1lIiwibmFtZSIsImEiLCJzdG9wIiwiX2NhdGNoIiwidiIsImFicnVwdCIsImRlbGVnYXRlWWllbGQiLCJyZXN1bHROYW1lIiwiZCIsIl9yZWdlbmVyYXRvclZhbHVlcyIsImZpbmlzaCIsImYiLCJfdCIsInAiLCJwcmV2IiwibmV4dCIsInNlbnQiLCJjYWxsIiwid3JhcCIsInciLCJyZXZlcnNlIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsIm1hcmsiLCJhd3JhcCIsIl9PdmVybG9hZFlpZWxkIiwiQXN5bmNJdGVyYXRvciIsIl9yZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IiLCJhc3luYyIsInUiLCJfcmVnZW5lcmF0b3JBc3luY0dlbiIsIl9yZWdlbmVyYXRvckFzeW5jIiwia2V5cyIsIl9yZWdlbmVyYXRvcktleXMiLCJ2YWx1ZXMiLCJpc05hTiIsImxlbmd0aCIsInZhbHVlIiwiZG9uZSIsIlR5cGVFcnJvciIsInVuc2hpZnQiLCJwb3AiLCJ0aGVuIiwiUHJvbWlzZSIsImkiLCJjIiwicmVzb2x2ZSIsIl9yZWdlbmVyYXRvckRlZmluZTIiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWciLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJ5IiwiRyIsImJpbmQiLCJsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInNldFByb3RvdHlwZU9mIiwiZGVmaW5lUHJvcGVydHkiLCJfcmVnZW5lcmF0b3JEZWZpbmUiLCJfaW52b2tlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiayIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsIl9jbGFzc0NhbGxDaGVjayIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJvcGVydHlLZXkiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsImdldENyeXB0byIsImdsb2JhbFRoaXMiLCJjcnlwdG8iLCJtb2QiLCJzZWN1cmVSYW5kQmVsb3ciLCJtYXgiLCJieXRlTGVuIiwidG9TdHJpbmciLCJieXRlcyIsIlVpbnQ4QXJyYXkiLCJyZXN1bHQiLCJjcnlwdG9Nb2QiLCJnZXRSYW5kb21WYWx1ZXMiLCJyYW5kb21CeXRlcyIsImJ1ZiIsInNldCIsIkVycm9yIiwiaGV4IiwicGFkU3RhcnQiLCJCaWdJbnQiLCJEaWdpdGFsU2lnbmF0dXJlIiwiZXhwb3J0cyIsInByaXZhdGVLZXkiLCJjdXJ2ZU5hbWUiLCJ1bmRlZmluZWQiLCJmcmVlemUiLCJnZXQiLCJnZXRDdXJ2ZSIsImdldEdlbmVyYXRvciIsIl9HIiwibXVsIiwic2lnbiIsIm1lc3NhZ2VIYXNoIiwiX2N1cnZlIiwicyIsIlIiLCJtb2R1bHVzIiwieCIsIm1vZEludmVyc2UiLCJ2ZXJpZnkiLCJwdWJsaWNLZXkiLCJ1MSIsInUyIiwiYWRkIiwiX3NpZ25NZXNzYWdlIiwiX2NhbGxlZSIsIm1lc3NhZ2UiLCJoYXNoRnVuYyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJkZWZhdWx0SGFzaCIsInNpZ25NZXNzYWdlIiwiX3giLCJfeDIiLCJfdmVyaWZ5TWVzc2FnZSIsIl9jYWxsZWUyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwidmVyaWZ5TWVzc2FnZSIsIl94MyIsIl94NCIsIl94NSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl9kZWZhdWx0SGFzaCIsIl9jYWxsZWUzIiwiZGlnZXN0IiwiYXJyIiwiX2hleCIsImhhc2giLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJUZXh0RW5jb2RlciIsImVuY29kZSIsInN1YnRsZSIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWxnb3JpdGhtcy9kaWdpdGFsX3NpZ25hdHVyZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsbGlwdGljIEN1cnZlIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSAoRUNEU0EpLlxuICpcbiAqIEVDRFNBIHByb3ZpZGVzIGF1dGhlbnRpY2F0aW9uIGFuZCBpbnRlZ3JpdHkgdGhyb3VnaCBkaWdpdGFsIHNpZ25hdHVyZXNcbiAqIGJhc2VkIG9uIGVsbGlwdGljIGN1cnZlIGNyeXB0b2dyYXBoeS5cbiAqXG4gKiBTaWduaW5nIChwcml2YXRlIGtleSBkLCBnZW5lcmF0b3IgRyBvZiBvcmRlciBuKTpcbiAqICAgICAxLiBDaG9vc2UgcmFuZG9tIGsg4oiIIFsxLCBuLTFdXG4gKiAgICAgMi4gUiA9IGvCt0csICByID0gUi54IG1vZCBuXG4gKiAgICAgMy4gcyA9IChoYXNoICsgcsK3ZCkgwrcga+KBu8K5ICBtb2QgblxuICpcbiAqIFZlcmlmaWNhdGlvbiAocHVibGljIGtleSBRID0gZMK3Ryk6XG4gKiAgICAgMS4gdyAgPSBz4oG7wrkgIG1vZCBuXG4gKiAgICAgMi4gdeKCgSA9IGhhc2jCt3cgbW9kIG4sICB14oKCID0gcsK3dyBtb2QgblxuICogICAgIDMuIFInID0gdeKCgcK3RyArIHXigoLCt1FcbiAqICAgICA0LiBBY2NlcHQgaWZmIFInLnggbW9kIG4gPSByXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAgIGNvbnN0IHNpZ25lciA9IG5ldyBEaWdpdGFsU2lnbmF0dXJlKDEyMzQ1Nm4sICdzZWNwMjU2azEnKVxuICogICAgIGNvbnN0IFtyLCBzXSA9IHNpZ25lci5zaWduKG1lc3NhZ2VIYXNoKVxuICogICAgIHNpZ25lci52ZXJpZnkoc2lnbmVyLnB1YmxpY0tleSwgbWVzc2FnZUhhc2gsIHIsIHMpICAvLyB0cnVlXG4gKi9cblxuaW1wb3J0IHsgZ2V0Q3VydmUsIGdldEdlbmVyYXRvciB9IGZyb20gJy4uL2N1cnZlcy9yZWdpc3RyeS5qcydcbmltcG9ydCB7IG1vZHVsdXMsIG1vZEludmVyc2UgfSBmcm9tICcuLi91dGlscy9tYXRoLmpzJ1xuXG4vKipcbiAqIEdldCB0aGUgY3J5cHRvIG1vZHVsZSAod29ya3MgaW4gYm90aCBOb2RlLmpzIGFuZCBicm93c2VycykuXG4gKiBVc2VzIGdsb2JhbFRoaXMuY3J5cHRvIChXZWIgQ3J5cHRvIEFQSSkgd2hlbiBhdmFpbGFibGUsIHdpdGhcbiAqIGEgZHluYW1pYyByZXF1aXJlIGZhbGxiYWNrIGZvciBOb2RlLmpzIGVudmlyb25tZW50cy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLS0gZW52aXJvbm1lbnQtc3BlY2lmaWMgY3J5cHRvIGRldGVjdGlvbiAqL1xuZnVuY3Rpb24gZ2V0Q3J5cHRvKCkge1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvXG4gIGNvbnN0IG1vZCA9ICdjcnlwdG8nXG4gIHJldHVybiB0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgPyByZXF1aXJlKG1vZCkgOiBudWxsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGNyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSByYW5kb20gQmlnSW50IGluIFsxLCBtYXgtMV0uXG4gKlxuICogVXNlcyBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgKENTUFJORykgaW5zdGVhZCBvZiBNYXRoLnJhbmRvbSgpXG4gKiB0byBwcmV2ZW50IG5vbmNlIHByZWRpY3Rpb24gYXR0YWNrcy5cbiAqL1xuZnVuY3Rpb24gc2VjdXJlUmFuZEJlbG93KG1heCkge1xuICBpZiAobWF4IDw9IDFuKSByZXR1cm4gMW5cbiAgY29uc3QgYnl0ZUxlbiA9IChtYXgudG9TdHJpbmcoMTYpLmxlbmd0aCArIDEpID4+IDFcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShieXRlTGVuKVxuICBsZXQgcmVzdWx0XG4gIGRvIHtcbiAgICBjb25zdCBjcnlwdG9Nb2QgPSBnZXRDcnlwdG8oKVxuICAgIGlmIChjcnlwdG9Nb2QgJiYgY3J5cHRvTW9kLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgY3J5cHRvTW9kLmdldFJhbmRvbVZhbHVlcyhieXRlcylcbiAgICB9IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0tIE5vZGUuanMgd2l0aG91dCBXZWIgQ3J5cHRvICovIGVsc2UgaWYgKFxuICAgICAgY3J5cHRvTW9kICYmXG4gICAgICBjcnlwdG9Nb2QucmFuZG9tQnl0ZXNcbiAgICApIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGNyeXB0b01vZC5yYW5kb21CeXRlcyhieXRlTGVuKVxuICAgICAgYnl0ZXMuc2V0KGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGF2YWlsYWJsZS4nKVxuICAgIH1cbiAgICBsZXQgaGV4ID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZXggKz0gYnl0ZXNbaV0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgICB9XG4gICAgcmVzdWx0ID0gQmlnSW50KCcweCcgKyBoZXgpICUgbWF4XG4gIH0gd2hpbGUgKHJlc3VsdCA9PT0gMG4pXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBFQ0RTQSBzaWduYXR1cmUgZ2VuZXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRGlnaXRhbFNpZ25hdHVyZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0JpZ0ludH0gcHJpdmF0ZUtleSAgICAgICAtIFRoZSBwcml2YXRlIHNjYWxhciBkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2N1cnZlTmFtZT0nc2VjcDI1NmsxJ10gLSBOYW1lIG9mIHRoZSBjdXJ2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGVLZXksIGN1cnZlTmFtZSA9ICdzZWNwMjU2azEnKSB7XG4gICAgdGhpcy5wcml2YXRlS2V5ID0gcHJpdmF0ZUtleVxuICAgIHRoaXMuY3VydmVOYW1lID0gY3VydmVOYW1lXG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKVxuICB9XG5cbiAgZ2V0IF9jdXJ2ZSgpIHtcbiAgICByZXR1cm4gZ2V0Q3VydmUodGhpcy5jdXJ2ZU5hbWUpXG4gIH1cblxuICBnZXQgX0coKSB7XG4gICAgcmV0dXJuIGdldEdlbmVyYXRvcih0aGlzLmN1cnZlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIHRoZSBwdWJsaWMga2V5OiBRID0gZCDCtyBHLlxuICAgKi9cbiAgZ2V0IHB1YmxpY0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5fRy5tdWwodGhpcy5wcml2YXRlS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIEVDRFNBIHNpZ25hdHVyZSBmb3IgYSBtZXNzYWdlIGhhc2guXG4gICAqXG4gICAqIEFsZ29yaXRobTpcbiAgICogICAgIDEuIENob29zZSByYW5kb20gayDiiIggWzEsIG4tMV1cbiAgICogICAgIDIuIFIgPSBrwrdHLCAgciA9IFIueCBtb2QgblxuICAgKiAgICAgMy4gcyA9IChtICsgcsK3ZCkgwrcga+KBu8K5ICBtb2QgbiAgIChkID0gcHJpdmF0ZSBrZXksIG0gPSBoYXNoKVxuICAgKlxuICAgKiBXYXJuaW5nOiB0aGUgbm9uY2UgayBtdXN0IE5FVkVSIGJlIHJldXNlZCBhY3Jvc3MgZGlmZmVyZW50IG1lc3NhZ2VzLlxuICAgKiBSZXVzaW5nIGsgbGVha3MgdGhlIHByaXZhdGUga2V5IChhcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIDIwMTAgU29ueVxuICAgKiBQUzMgRUNEU0EgYXR0YWNrKS5cbiAgICpcbiAgICogQHBhcmFtIHtCaWdJbnR9IG1lc3NhZ2VIYXNoIC0gSW50ZWdlciBoYXNoIG9mIHRoZSBtZXNzYWdlIChlLmcuIFNIQS0yNTYpLlxuICAgKiBAcmV0dXJucyB7W0JpZ0ludCwgQmlnSW50XX0gW3IsIHNdXG4gICAqL1xuICBzaWduKG1lc3NhZ2VIYXNoKSB7XG4gICAgY29uc3QgbiA9IHRoaXMuX2N1cnZlLm5cbiAgICBjb25zdCBHID0gdGhpcy5fR1xuICAgIGxldCByID0gMG4sXG4gICAgICBzID0gMG5cbiAgICB3aGlsZSAociA9PT0gMG4gfHwgcyA9PT0gMG4pIHtcbiAgICAgIGNvbnN0IGsgPSBzZWN1cmVSYW5kQmVsb3cobilcbiAgICAgIGNvbnN0IFIgPSBHLm11bChrKVxuICAgICAgciA9IG1vZHVsdXMoUi54LCBuKVxuICAgICAgcyA9IG1vZHVsdXMoKG1lc3NhZ2VIYXNoICsgciAqIHRoaXMucHJpdmF0ZUtleSkgKiBtb2RJbnZlcnNlKGssIG4pLCBuKVxuICAgIH1cbiAgICByZXR1cm4gW3IsIHNdXG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGFuIEVDRFNBIHNpZ25hdHVyZS5cbiAgICpcbiAgICogQWxnb3JpdGhtOlxuICAgKiAgICAgMS4gdyAgPSBz4oG7wrkgbW9kIG5cbiAgICogICAgIDIuIHXigoEgPSBtwrd3IG1vZCBuLCAgdeKCgiA9IHLCt3cgbW9kIG5cbiAgICogICAgIDMuIFInID0gdeKCgcK3RyArIHXigoLCt1EgICAoUSA9IHB1YmxpYyBrZXkpXG4gICAqICAgICA0LiBBY2NlcHQgaWZmIFInLnggbW9kIG4gPSByXG4gICAqXG4gICAqIEBwYXJhbSB7UG9pbnR9IHB1YmxpY0tleSAgIC0gVGhlIHNpZ25lcidzIHB1YmxpYyBrZXkgUS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IG1lc3NhZ2VIYXNoIC0gSW50ZWdlciBoYXNoIG9mIHRoZSBzaWduZWQgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IHIgICAgICAgICAgLSBGaXJzdCBjb21wb25lbnQgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IHMgICAgICAgICAgLSBTZWNvbmQgY29tcG9uZW50IG9mIHRoZSBzaWduYXR1cmUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgciBvciBzIGFyZSBvdXRzaWRlIFsxLCBuLTFdLlxuICAgKi9cbiAgdmVyaWZ5KHB1YmxpY0tleSwgbWVzc2FnZUhhc2gsIHIsIHMpIHtcbiAgICBjb25zdCBuID0gdGhpcy5fY3VydmUublxuICAgIGlmICghKDFuIDw9IHIgJiYgciA8IG4gJiYgMW4gPD0gcyAmJiBzIDwgbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignciBvciBzIGFyZSBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIFsxLCBuLTFdLicpXG4gICAgfVxuICAgIGNvbnN0IEcgPSB0aGlzLl9HXG4gICAgY29uc3QgdyA9IG1vZEludmVyc2UocywgbilcbiAgICBjb25zdCB1MSA9IG1vZHVsdXMobWVzc2FnZUhhc2ggKiB3LCBuKVxuICAgIGNvbnN0IHUyID0gbW9kdWx1cyhyICogdywgbilcbiAgICBjb25zdCBSID0gRy5tdWwodTEpLmFkZChwdWJsaWNLZXkubXVsKHUyKSlcbiAgICByZXR1cm4gbW9kdWx1cyhSLngsIG4pID09PSByXG4gIH1cblxuICAvKipcbiAgICogSGFzaCBhIG1lc3NhZ2UgYW5kIHNpZ24gaXQuXG4gICAqXG4gICAqIENvbXB1dGVzIFNIQS0yNTYobWVzc2FnZSkgYW5kIGNvbnZlcnRzIHRoZSBoZXggZGlnZXN0IHRvIGFuIGludGVnZXJcbiAgICogYmVmb3JlIHNpZ25pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheXxzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgcmF3IG1lc3NhZ2UgdG8gc2lnbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhc2hGdW5jXSAgICAgICAtIE9wdGlvbmFsIGFzeW5jIGhhc2ggZnVuY3Rpb25cbiAgICogICByZXR1cm5pbmcgYSBoZXggc3RyaW5nLiAgRGVmYXVsdHMgdG8gU0hBLTI1Ni5cbiAgICogQHJldHVybnMge1Byb21pc2U8W0JpZ0ludCwgQmlnSW50XT59IFtyLCBzXVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2UobWVzc2FnZSwgaGFzaEZ1bmMpIHtcbiAgICBjb25zdCBtZXNzYWdlSGFzaCA9IGF3YWl0IGRlZmF1bHRIYXNoKG1lc3NhZ2UsIGhhc2hGdW5jKVxuICAgIHJldHVybiB0aGlzLnNpZ24obWVzc2FnZUhhc2gpXG4gIH1cblxuICAvKipcbiAgICogSGFzaCBhIG1lc3NhZ2UgYW5kIHZlcmlmeSBpdHMgRUNEU0Egc2lnbmF0dXJlLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvaW50fSBwdWJsaWNLZXkgICAgICAgICAgIC0gVGhlIHNpZ25lcidzIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSB7VWludDhBcnJheXxzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgcmF3IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7QmlnSW50fSByICAgICAgICAgICAgICAgICAgLSBGaXJzdCBjb21wb25lbnQgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIHtCaWdJbnR9IHMgICAgICAgICAgICAgICAgICAtIFNlY29uZCBjb21wb25lbnQgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhc2hGdW5jXSAgICAgICAtIE9wdGlvbmFsIGFzeW5jIGhhc2ggZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5TWVzc2FnZShwdWJsaWNLZXksIG1lc3NhZ2UsIHIsIHMsIGhhc2hGdW5jKSB7XG4gICAgY29uc3QgbWVzc2FnZUhhc2ggPSBhd2FpdCBkZWZhdWx0SGFzaChtZXNzYWdlLCBoYXNoRnVuYylcbiAgICByZXR1cm4gdGhpcy52ZXJpZnkocHVibGljS2V5LCBtZXNzYWdlSGFzaCwgciwgcylcbiAgfVxufVxuXG4vKipcbiAqIERlZmF1bHQgaGFzaDogU0hBLTI1NiB2aWEgV2ViIENyeXB0byBvciBOb2RlLmpzIGNyeXB0by5cbiAqIFJldHVybnMgdGhlIGRpZ2VzdCBhcyBhIEJpZ0ludC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdEhhc2gobWVzc2FnZSwgaGFzaEZ1bmMpIHtcbiAgaWYgKGhhc2hGdW5jKSB7XG4gICAgY29uc3QgaGV4ID0gYXdhaXQgaGFzaEZ1bmMobWVzc2FnZSlcbiAgICByZXR1cm4gQmlnSW50KCcweCcgKyBoZXgpXG4gIH1cblxuICBsZXQgYnl0ZXNcbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpXG4gIH0gZWxzZSB7XG4gICAgYnl0ZXMgPSBtZXNzYWdlXG4gIH1cblxuICBjb25zdCBjcnlwdG9Nb2QgPSBnZXRDcnlwdG8oKVxuICBpZiAoY3J5cHRvTW9kICYmIGNyeXB0b01vZC5zdWJ0bGUpIHtcbiAgICBjb25zdCBkaWdlc3QgPSBhd2FpdCBjcnlwdG9Nb2Quc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ5dGVzKVxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGRpZ2VzdClcbiAgICBsZXQgaGV4ID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaGV4ICs9IGFycltpXS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KCcweCcgKyBoZXgpXG4gIH1cblxuICAvLyBOb2RlLmpzIGZhbGxiYWNrXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0tIE5vZGUuanMgd2l0aG91dCBXZWIgQ3J5cHRvICovXG4gIGlmIChjcnlwdG9Nb2QgJiYgY3J5cHRvTW9kLmNyZWF0ZUhhc2gpIHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvTW9kLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShieXRlcykuZGlnZXN0KCdoZXgnKVxuICAgIHJldHVybiBCaWdJbnQoJzB4JyArIGhhc2gpXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhhc2ggZnVuY3Rpb24gYXZhaWxhYmxlLicpXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdCQSxJQUFBQSxTQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFELE9BQUE7QUFBc0QsU0FBQUUsUUFBQUMsQ0FBQSxzQ0FBQUQsT0FBQSx3QkFBQUUsTUFBQSx1QkFBQUEsTUFBQSxDQUFBQyxRQUFBLGFBQUFGLENBQUEsa0JBQUFBLENBQUEsZ0JBQUFBLENBQUEsV0FBQUEsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRCxDQUFBLENBQUFHLFdBQUEsS0FBQUYsTUFBQSxJQUFBRCxDQUFBLEtBQUFDLE1BQUEsQ0FBQUcsU0FBQSxxQkFBQUosQ0FBQSxLQUFBRCxPQUFBLENBQUFDLENBQUE7QUFBQSxTQUFBSyxvQkFBQSxzQkFBQUMsQ0FBQSxHQUFBQyxZQUFBLElBQUFDLENBQUEsR0FBQUYsQ0FBQSxDQUFBRyxDQUFBLENBQUFKLG1CQUFBLEdBQUFLLENBQUEsSUFBQUMsTUFBQSxDQUFBQyxjQUFBLEdBQUFELE1BQUEsQ0FBQUMsY0FBQSxDQUFBSixDQUFBLElBQUFBLENBQUEsQ0FBQUssU0FBQSxFQUFBVixXQUFBLFdBQUFXLEVBQUFSLENBQUEsUUFBQUUsQ0FBQSx3QkFBQUYsQ0FBQSxJQUFBQSxDQUFBLENBQUFILFdBQUEsV0FBQUssQ0FBQSxLQUFBQSxDQUFBLEtBQUFFLENBQUEsNkJBQUFGLENBQUEsQ0FBQU8sV0FBQSxJQUFBUCxDQUFBLENBQUFRLElBQUEsVUFBQWhCLENBQUEsb0VBQUFpQixFQUFBWCxDQUFBLFFBQUFFLENBQUEsRUFBQUUsQ0FBQSxtQkFBQUksQ0FBQSxJQUFBTixDQUFBLEtB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