SPB Git forge

spb/admin-ka

Public
41commits 1branches 0releases
172.9 MBsize
maindefault branch
19 days agolast push
JavaScript 65.5% Python 17.8% CSS 13% HTML 3.7%
32.0 KB · 535 lines javascript
Raw Blame History
1"use strict";23Object.defineProperty(exports, "__esModule", {4  value: true5});6exports["default"] = void 0;7var _strings = require("./util/strings.js");8var _eventtarget = _interopRequireDefault(require("./util/eventtarget.js"));9var _crypto = _interopRequireDefault(require("./crypto/crypto.js"));10function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }11function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }12function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }13function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }14function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }15function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }16function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }17function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }18function _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); }19function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }20function 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); }21function _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); }); }; }22function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }23function _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); } }24function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }25function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }26function _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); }27var RA2Cipher = /*#__PURE__*/function () {28  function RA2Cipher() {29    _classCallCheck(this, RA2Cipher);30    this._cipher = null;31    this._counter = new Uint8Array(16);32  }33  return _createClass(RA2Cipher, [{34    key: "setKey",35    value: function () {36      var _setKey = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(key) {37        return _regeneratorRuntime().wrap(function _callee$(_context) {38          while (1) switch (_context.prev = _context.next) {39            case 0:40              _context.next = 2;41              return _crypto["default"].importKey("raw", key, {42                name: "AES-EAX"43              }, false, ["encrypt, decrypt"]);44            case 2:45              this._cipher = _context.sent;46            case 3:47            case "end":48              return _context.stop();49          }50        }, _callee, this);51      }));52      function setKey(_x) {53        return _setKey.apply(this, arguments);54      }55      return setKey;56    }()57  }, {58    key: "makeMessage",59    value: function () {60      var _makeMessage = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(message) {61        var ad, encrypted, i, res;62        return _regeneratorRuntime().wrap(function _callee2$(_context2) {63          while (1) switch (_context2.prev = _context2.next) {64            case 0:65              ad = new Uint8Array([(message.length & 0xff00) >>> 8, message.length & 0xff]);66              _context2.next = 3;67              return _crypto["default"].encrypt({68                name: "AES-EAX",69                iv: this._counter,70                additionalData: ad71              }, this._cipher, message);72            case 3:73              encrypted = _context2.sent;74              for (i = 0; i < 16 && this._counter[i]++ === 255; i++);75              res = new Uint8Array(message.length + 2 + 16);76              res.set(ad);77              res.set(encrypted, 2);78              return _context2.abrupt("return", res);79            case 9:80            case "end":81              return _context2.stop();82          }83        }, _callee2, this);84      }));85      function makeMessage(_x2) {86        return _makeMessage.apply(this, arguments);87      }88      return makeMessage;89    }()90  }, {91    key: "receiveMessage",92    value: function () {93      var _receiveMessage = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(length, encrypted) {94        var ad, res, i;95        return _regeneratorRuntime().wrap(function _callee3$(_context3) {96          while (1) switch (_context3.prev = _context3.next) {97            case 0:98              ad = new Uint8Array([(length & 0xff00) >>> 8, length & 0xff]);99              _context3.next = 3;100              return _crypto["default"].decrypt({101                name: "AES-EAX",102                iv: this._counter,103                additionalData: ad104              }, this._cipher, encrypted);105            case 3:106              res = _context3.sent;107              for (i = 0; i < 16 && this._counter[i]++ === 255; i++);108              return _context3.abrupt("return", res);109            case 6:110            case "end":111              return _context3.stop();112          }113        }, _callee3, this);114      }));115      function receiveMessage(_x3, _x4) {116        return _receiveMessage.apply(this, arguments);117      }118      return receiveMessage;119    }()120  }]);121}();122var RSAAESAuthenticationState = exports["default"] = /*#__PURE__*/function (_EventTargetMixin) {123  function RSAAESAuthenticationState(sock, getCredentials) {124    var _this;125    _classCallCheck(this, RSAAESAuthenticationState);126    _this = _callSuper(this, RSAAESAuthenticationState);127    _this._hasStarted = false;128    _this._checkSock = null;129    _this._checkCredentials = null;130    _this._approveServerResolve = null;131    _this._sockReject = null;132    _this._credentialsReject = null;133    _this._approveServerReject = null;134    _this._sock = sock;135    _this._getCredentials = getCredentials;136    return _this;137  }138  _inherits(RSAAESAuthenticationState, _EventTargetMixin);139  return _createClass(RSAAESAuthenticationState, [{140    key: "_waitSockAsync",141    value: function _waitSockAsync(len) {142      var _this2 = this;143      return new Promise(function (resolve, reject) {144        var hasData = function hasData() {145          return !_this2._sock.rQwait('RA2', len);146        };147        if (hasData()) {148          resolve();149        } else {150          _this2._checkSock = function () {151            if (hasData()) {152              resolve();153              _this2._checkSock = null;154              _this2._sockReject = null;155            }156          };157          _this2._sockReject = reject;158        }159      });160    }161  }, {162    key: "_waitApproveKeyAsync",163    value: function _waitApproveKeyAsync() {164      var _this3 = this;165      return new Promise(function (resolve, reject) {166        _this3._approveServerResolve = resolve;167        _this3._approveServerReject = reject;168      });169    }170  }, {171    key: "_waitCredentialsAsync",172    value: function _waitCredentialsAsync(subtype) {173      var _this4 = this;174      var hasCredentials = function hasCredentials() {175        if (subtype === 1 && _this4._getCredentials().username !== undefined && _this4._getCredentials().password !== undefined) {176          return true;177        } else if (subtype === 2 && _this4._getCredentials().password !== undefined) {178          return true;179        }180        return false;181      };182      return new Promise(function (resolve, reject) {183        if (hasCredentials()) {184          resolve();185        } else {186          _this4._checkCredentials = function () {187            if (hasCredentials()) {188              resolve();189              _this4._checkCredentials = null;190              _this4._credentialsReject = null;191            }192          };193          _this4._credentialsReject = reject;194        }195      });196    }197  }, {198    key: "checkInternalEvents",199    value: function checkInternalEvents() {200      if (this._checkSock !== null) {201        this._checkSock();202      }203      if (this._checkCredentials !== null) {204        this._checkCredentials();205      }206    }207  }, {208    key: "approveServer",209    value: function approveServer() {210      if (this._approveServerResolve !== null) {211        this._approveServerResolve();212        this._approveServerResolve = null;213      }214    }215  }, {216    key: "disconnect",217    value: function disconnect() {218      if (this._sockReject !== null) {219        this._sockReject(new Error("disconnect normally"));220        this._sockReject = null;221      }222      if (this._credentialsReject !== null) {223        this._credentialsReject(new Error("disconnect normally"));224        this._credentialsReject = null;225      }226      if (this._approveServerReject !== null) {227        this._approveServerReject(new Error("disconnect normally"));228        this._approveServerReject = null;229      }230    }231  }, {232    key: "negotiateRA2neAuthAsync",233    value: function () {234      var _negotiateRA2neAuthAsync = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {235        var serverKeyLengthBuffer, serverKeyLength, serverKeyBytes, serverN, serverE, serverRSACipher, serverPublickey, approveKey, clientKeyLength, clientKeyBytes, clientRSACipher, clientExportedRSAKey, clientN, clientE, clientPublicKey, clientRandom, clientEncryptedRandom, clientRandomMessage, serverEncryptedRandom, serverRandom, clientSessionKey, serverSessionKey, clientCipher, serverCipher, serverHash, clientHash, serverHashReceived, i, subtype, waitCredentials, username, password, credentials, _i, _i2;236        return _regeneratorRuntime().wrap(function _callee4$(_context4) {237          while (1) switch (_context4.prev = _context4.next) {238            case 0:239              this._hasStarted = true;240              // 1: Receive server public key241              _context4.next = 3;242              return this._waitSockAsync(4);243            case 3:244              serverKeyLengthBuffer = this._sock.rQpeekBytes(4);245              serverKeyLength = this._sock.rQshift32();246              if (!(serverKeyLength < 1024)) {247                _context4.next = 9;248                break;249              }250              throw new Error("RA2: server public key is too short: " + serverKeyLength);251            case 9:252              if (!(serverKeyLength > 8192)) {253                _context4.next = 11;254                break;255              }256              throw new Error("RA2: server public key is too long: " + serverKeyLength);257            case 11:258              serverKeyBytes = Math.ceil(serverKeyLength / 8);259              _context4.next = 14;260              return this._waitSockAsync(serverKeyBytes * 2);261            case 14:262              serverN = this._sock.rQshiftBytes(serverKeyBytes);263              serverE = this._sock.rQshiftBytes(serverKeyBytes);264              _context4.next = 18;265              return _crypto["default"].importKey("raw", {266                n: serverN,267                e: serverE268              }, {269                name: "RSA-PKCS1-v1_5"270              }, false, ["encrypt"]);271            case 18:272              serverRSACipher = _context4.sent;273              serverPublickey = new Uint8Array(4 + serverKeyBytes * 2);274              serverPublickey.set(serverKeyLengthBuffer);275              serverPublickey.set(serverN, 4);276              serverPublickey.set(serverE, 4 + serverKeyBytes);277278              // verify server public key279              approveKey = this._waitApproveKeyAsync();280              this.dispatchEvent(new CustomEvent("serververification", {281                detail: {282                  type: "RSA",283                  publickey: serverPublickey284                }285              }));286              _context4.next = 27;287              return approveKey;288            case 27:289              // 2: Send client public key290              clientKeyLength = 2048;291              clientKeyBytes = Math.ceil(clientKeyLength / 8);292              _context4.next = 31;293              return _crypto["default"].generateKey({294                name: "RSA-PKCS1-v1_5",295                modulusLength: clientKeyLength,296                publicExponent: new Uint8Array([1, 0, 1])297              }, true, ["encrypt"]);298            case 31:299              clientRSACipher = _context4.sent.privateKey;300              _context4.next = 34;301              return _crypto["default"].exportKey("raw", clientRSACipher);302            case 34:303              clientExportedRSAKey = _context4.sent;304              clientN = clientExportedRSAKey.n;305              clientE = clientExportedRSAKey.e;306              clientPublicKey = new Uint8Array(4 + clientKeyBytes * 2);307              clientPublicKey[0] = (clientKeyLength & 0xff000000) >>> 24;308              clientPublicKey[1] = (clientKeyLength & 0xff0000) >>> 16;309              clientPublicKey[2] = (clientKeyLength & 0xff00) >>> 8;310              clientPublicKey[3] = clientKeyLength & 0xff;311              clientPublicKey.set(clientN, 4);312              clientPublicKey.set(clientE, 4 + clientKeyBytes);313              this._sock.sQpushBytes(clientPublicKey);314              this._sock.flush();315316              // 3: Send client random317              clientRandom = new Uint8Array(16);318              window.crypto.getRandomValues(clientRandom);319              _context4.next = 50;320              return _crypto["default"].encrypt({321                name: "RSA-PKCS1-v1_5"322              }, serverRSACipher, clientRandom);323            case 50:324              clientEncryptedRandom = _context4.sent;325              clientRandomMessage = new Uint8Array(2 + serverKeyBytes);326              clientRandomMessage[0] = (serverKeyBytes & 0xff00) >>> 8;327              clientRandomMessage[1] = serverKeyBytes & 0xff;328              clientRandomMessage.set(clientEncryptedRandom, 2);329              this._sock.sQpushBytes(clientRandomMessage);330              this._sock.flush();331332              // 4: Receive server random333              _context4.next = 59;334              return this._waitSockAsync(2);335            case 59:336              if (!(this._sock.rQshift16() !== clientKeyBytes)) {337                _context4.next = 61;338                break;339              }340              throw new Error("RA2: wrong encrypted message length");341            case 61:342              serverEncryptedRandom = this._sock.rQshiftBytes(clientKeyBytes);343              _context4.next = 64;344              return _crypto["default"].decrypt({345                name: "RSA-PKCS1-v1_5"346              }, clientRSACipher, serverEncryptedRandom);347            case 64:348              serverRandom = _context4.sent;349              if (!(serverRandom === null || serverRandom.length !== 16)) {350                _context4.next = 67;351                break;352              }353              throw new Error("RA2: corrupted server encrypted random");354            case 67:355              // 5: Compute session keys and set ciphers356              clientSessionKey = new Uint8Array(32);357              serverSessionKey = new Uint8Array(32);358              clientSessionKey.set(serverRandom);359              clientSessionKey.set(clientRandom, 16);360              serverSessionKey.set(clientRandom);361              serverSessionKey.set(serverRandom, 16);362              _context4.next = 75;363              return window.crypto.subtle.digest("SHA-1", clientSessionKey);364            case 75:365              clientSessionKey = _context4.sent;366              clientSessionKey = new Uint8Array(clientSessionKey).slice(0, 16);367              _context4.next = 79;368              return window.crypto.subtle.digest("SHA-1", serverSessionKey);369            case 79:370              serverSessionKey = _context4.sent;371              serverSessionKey = new Uint8Array(serverSessionKey).slice(0, 16);372              clientCipher = new RA2Cipher();373              _context4.next = 84;374              return clientCipher.setKey(clientSessionKey);375            case 84:376              serverCipher = new RA2Cipher();377              _context4.next = 87;378              return serverCipher.setKey(serverSessionKey);379            case 87:380              // 6: Compute and exchange hashes381              serverHash = new Uint8Array(8 + serverKeyBytes * 2 + clientKeyBytes * 2);382              clientHash = new Uint8Array(8 + serverKeyBytes * 2 + clientKeyBytes * 2);383              serverHash.set(serverPublickey);384              serverHash.set(clientPublicKey, 4 + serverKeyBytes * 2);385              clientHash.set(clientPublicKey);386              clientHash.set(serverPublickey, 4 + clientKeyBytes * 2);387              _context4.next = 95;388              return window.crypto.subtle.digest("SHA-1", serverHash);389            case 95:390              serverHash = _context4.sent;391              _context4.next = 98;392              return window.crypto.subtle.digest("SHA-1", clientHash);393            case 98:394              clientHash = _context4.sent;395              serverHash = new Uint8Array(serverHash);396              clientHash = new Uint8Array(clientHash);397              _context4.t0 = this._sock;398              _context4.next = 104;399              return clientCipher.makeMessage(clientHash);400            case 104:401              _context4.t1 = _context4.sent;402              _context4.t0.sQpushBytes.call(_context4.t0, _context4.t1);403              this._sock.flush();404              _context4.next = 109;405              return this._waitSockAsync(2 + 20 + 16);406            case 109:407              if (!(this._sock.rQshift16() !== 20)) {408                _context4.next = 111;409                break;410              }411              throw new Error("RA2: wrong server hash");412            case 111:413              _context4.next = 113;414              return serverCipher.receiveMessage(20, this._sock.rQshiftBytes(20 + 16));415            case 113:416              serverHashReceived = _context4.sent;417              if (!(serverHashReceived === null)) {418                _context4.next = 116;419                break;420              }421              throw new Error("RA2: failed to authenticate the message");422            case 116:423              i = 0;424            case 117:425              if (!(i < 20)) {426                _context4.next = 123;427                break;428              }429              if (!(serverHashReceived[i] !== serverHash[i])) {430                _context4.next = 120;431                break;432              }433              throw new Error("RA2: wrong server hash");434            case 120:435              i++;436              _context4.next = 117;437              break;438            case 123:439              _context4.next = 125;440              return this._waitSockAsync(2 + 1 + 16);441            case 125:442              if (!(this._sock.rQshift16() !== 1)) {443                _context4.next = 127;444                break;445              }446              throw new Error("RA2: wrong subtype");447            case 127:448              _context4.next = 129;449              return serverCipher.receiveMessage(1, this._sock.rQshiftBytes(1 + 16));450            case 129:451              subtype = _context4.sent;452              if (!(subtype === null)) {453                _context4.next = 132;454                break;455              }456              throw new Error("RA2: failed to authenticate the message");457            case 132:458              subtype = subtype[0];459              waitCredentials = this._waitCredentialsAsync(subtype);460              if (!(subtype === 1)) {461                _context4.next = 138;462                break;463              }464              if (this._getCredentials().username === undefined || this._getCredentials().password === undefined) {465                this.dispatchEvent(new CustomEvent("credentialsrequired", {466                  detail: {467                    types: ["username", "password"]468                  }469                }));470              }471              _context4.next = 143;472              break;473            case 138:474              if (!(subtype === 2)) {475                _context4.next = 142;476                break;477              }478              if (this._getCredentials().password === undefined) {479                this.dispatchEvent(new CustomEvent("credentialsrequired", {480                  detail: {481                    types: ["password"]482                  }483                }));484              }485              _context4.next = 143;486              break;487            case 142:488              throw new Error("RA2: wrong subtype");489            case 143:490              _context4.next = 145;491              return waitCredentials;492            case 145:493              if (subtype === 1) {494                username = (0, _strings.encodeUTF8)(this._getCredentials().username).slice(0, 255);495              } else {496                username = "";497              }498              password = (0, _strings.encodeUTF8)(this._getCredentials().password).slice(0, 255);499              credentials = new Uint8Array(username.length + password.length + 2);500              credentials[0] = username.length;501              credentials[username.length + 1] = password.length;502              for (_i = 0; _i < username.length; _i++) {503                credentials[_i + 1] = username.charCodeAt(_i);504              }505              for (_i2 = 0; _i2 < password.length; _i2++) {506                credentials[username.length + 2 + _i2] = password.charCodeAt(_i2);507              }508              _context4.t2 = this._sock;509              _context4.next = 155;510              return clientCipher.makeMessage(credentials);511            case 155:512              _context4.t3 = _context4.sent;513              _context4.t2.sQpushBytes.call(_context4.t2, _context4.t3);514              this._sock.flush();515            case 158:516            case "end":517              return _context4.stop();518          }519        }, _callee4, this);520      }));521      function negotiateRA2neAuthAsync() {522        return _negotiateRA2neAuthAsync.apply(this, arguments);523      }524      return negotiateRA2neAuthAsync;525    }()526  }, {527    key: "hasStarted",528    get: function get() {529      return this._hasStarted;530    },531    set: function set(s) {532      this._hasStarted = s;533    }534  }]);535}(_eventtarget["default"]);