UNPKG

androidtv-remote-slstn

Version:
126 lines (125 loc) 5.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PairingManager = void 0; require("core-js/modules/es.error.cause.js"); require("core-js/modules/es.json.stringify.js"); require("core-js/modules/es.parse-int.js"); require("core-js/modules/es.promise.js"); require("core-js/modules/es.regexp.to-string.js"); var _tls = _interopRequireDefault(require("tls")); var _PairingMessageManager = require("./PairingMessageManager.js"); var _cryptoJs = _interopRequireDefault(require("crypto-js")); var _events = _interopRequireDefault(require("events")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } 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); }); }; } class PairingManager extends _events.default { constructor(host, port, certs, service_name) { super(); this.host = host; this.port = port; this.chunks = Buffer.from([]); this.certs = certs; this.service_name = service_name; } sendCode(code) { console.debug("Sending code : ", code); var code_bytes = this.hexStringToBytes(code); var client_certificate = this.client.getCertificate(); var server_certificate = this.client.getPeerCertificate(); var sha256 = _cryptoJs.default.algo.SHA256.create(); sha256.update(_cryptoJs.default.enc.Hex.parse(client_certificate.modulus)); sha256.update(_cryptoJs.default.enc.Hex.parse("0" + client_certificate.exponent.slice(2))); sha256.update(_cryptoJs.default.enc.Hex.parse(server_certificate.modulus)); sha256.update(_cryptoJs.default.enc.Hex.parse("0" + server_certificate.exponent.slice(2))); sha256.update(_cryptoJs.default.enc.Hex.parse(code.slice(2))); var hash = sha256.finalize(); var hash_array = this.hexStringToBytes(hash.toString()); var check = hash_array[0]; if (check !== code_bytes[0]) { this.client.destroy(new Error("Bad Code")); return false; } else { this.client.write(_PairingMessageManager.pairingMessageManager.createPairingSecret(hash_array)); return true; } } start() { var _this = this; return _asyncToGenerator(function* () { return new Promise((resolve, reject) => { var options = { key: _this.certs.key, cert: _this.certs.cert, port: _this.port, host: _this.host, rejectUnauthorized: false }; console.debug("Start Pairing Connect"); _this.client = _tls.default.connect(options, () => { console.debug(_this.host + " Pairing connected"); }); _this.client.pairingManager = _this; _this.client.on("secureConnect", () => { console.debug(_this.host + " Pairing secure connected "); _this.client.write(_PairingMessageManager.pairingMessageManager.createPairingRequest(_this.service_name)); }); _this.client.on('data', data => { var buffer = Buffer.from(data); _this.chunks = Buffer.concat([_this.chunks, buffer]); if (_this.chunks.length > 0 && _this.chunks.readInt8(0) === _this.chunks.length - 1) { var message = _PairingMessageManager.pairingMessageManager.parse(_this.chunks); console.debug("Receive : " + Array.from(_this.chunks)); console.debug("Receive : " + JSON.stringify(message.toJSON())); if (message.status !== _PairingMessageManager.pairingMessageManager.Status.STATUS_OK) { _this.client.destroy(new Error(message.status)); } else { if (message.pairingRequestAck) { _this.client.write(_PairingMessageManager.pairingMessageManager.createPairingOption()); } else if (message.pairingOption) { _this.client.write(_PairingMessageManager.pairingMessageManager.createPairingConfiguration()); } else if (message.pairingConfigurationAck) { _this.emit('secret'); } else if (message.pairingSecretAck) { console.debug(_this.host + " Paired!"); _this.client.destroy(); } else { console.debug(_this.host + " What Else ?"); } } _this.chunks = Buffer.from([]); } }); _this.client.on('close', hasError => { console.debug(_this.host + " Pairing Connection closed", hasError); if (hasError) { reject(false); } else { resolve(true); } }); _this.client.on('error', error => { console.error(error); resolve({ state: "error", msg: error.message }); }); }); })(); } hexStringToBytes(q) { var bytes = []; for (var i = 0; i < q.length; i += 2) { var byte = parseInt(q.substring(i, i + 2), 16); if (byte > 127) { byte = -(~byte & 0xFF) - 1; } bytes.push(byte); } return bytes; } } exports.PairingManager = PairingManager;