UNPKG

@microsoft/dev-tunnels-ssh

Version:
128 lines 6.17 kB
"use strict"; // // Copyright (c) Microsoft Corporation. All rights reserved. // Object.defineProperty(exports, "__esModule", { value: true }); exports.NewKeysMessage = exports.KeyExchangeDhReplyMessage = exports.KeyExchangeDhInitMessage = exports.KeyExchangeInitMessage = exports.KeyExchangeMessage = void 0; const buffer_1 = require("buffer"); const sshMessage_1 = require("./sshMessage"); const sshAlgorithms_1 = require("../algorithms/sshAlgorithms"); class KeyExchangeMessage extends sshMessage_1.SshMessage { } exports.KeyExchangeMessage = KeyExchangeMessage; const keyExchangeInitCookieLength = 16; class KeyExchangeInitMessage extends KeyExchangeMessage { get messageType() { return 20; } onRead(reader) { this.cookie = reader.read(keyExchangeInitCookieLength); this.keyExchangeAlgorithms = reader.readList('ascii'); this.serverHostKeyAlgorithms = reader.readList('ascii'); this.encryptionAlgorithmsClientToServer = reader.readList('ascii'); this.encryptionAlgorithmsServerToClient = reader.readList('ascii'); this.macAlgorithmsClientToServer = reader.readList('ascii'); this.macAlgorithmsServerToClient = reader.readList('ascii'); this.compressionAlgorithmsClientToServer = reader.readList('ascii'); this.compressionAlgorithmsServerToClient = reader.readList('ascii'); this.languagesClientToServer = reader.readList('ascii'); this.languagesServerToClient = reader.readList('ascii'); this.firstKexPacketFollows = reader.readBoolean(); this.reserved = reader.readUInt32(); } onWrite(writer) { var _a; if (!this.cookie) { this.cookie = buffer_1.Buffer.alloc(keyExchangeInitCookieLength); sshAlgorithms_1.SshAlgorithms.random.getBytes(this.cookie); } writer.write(this.cookie); writer.writeList(this.keyExchangeAlgorithms || [], 'ascii'); writer.writeList(this.serverHostKeyAlgorithms || [], 'ascii'); writer.writeList(this.encryptionAlgorithmsClientToServer || [], 'ascii'); writer.writeList(this.encryptionAlgorithmsServerToClient || [], 'ascii'); writer.writeList(this.macAlgorithmsClientToServer || [], 'ascii'); writer.writeList(this.macAlgorithmsServerToClient || [], 'ascii'); writer.writeList(this.compressionAlgorithmsClientToServer || [], 'ascii'); writer.writeList(this.compressionAlgorithmsServerToClient || [], 'ascii'); writer.writeList(this.languagesClientToServer || [], 'ascii'); writer.writeList(this.languagesServerToClient || [], 'ascii'); writer.writeBoolean((_a = this.firstKexPacketFollows) !== null && _a !== void 0 ? _a : false); writer.writeUInt32(this.reserved || 0); } static CreateNone() { const noneArray = ['none']; const emptyArray = ['']; const message = new KeyExchangeInitMessage(); message.cookie = buffer_1.Buffer.alloc(keyExchangeInitCookieLength); message.keyExchangeAlgorithms = noneArray; message.serverHostKeyAlgorithms = noneArray; message.encryptionAlgorithmsClientToServer = noneArray; message.encryptionAlgorithmsServerToClient = noneArray; message.macAlgorithmsClientToServer = noneArray; message.macAlgorithmsServerToClient = noneArray; message.compressionAlgorithmsClientToServer = noneArray; message.compressionAlgorithmsServerToClient = noneArray; message.languagesClientToServer = emptyArray; message.languagesServerToClient = emptyArray; // Save the serialized bytes so that the message doesn't have to be re-serialized every time // it is sent. message.rawBytes = message.toBuffer(); return message; } get allowsNone() { const includesNone = (algorithms) => (algorithms === null || algorithms === void 0 ? void 0 : algorithms.includes('none')) === true; return (includesNone(this.keyExchangeAlgorithms) && includesNone(this.serverHostKeyAlgorithms) && includesNone(this.encryptionAlgorithmsClientToServer) && includesNone(this.encryptionAlgorithmsServerToClient) && includesNone(this.macAlgorithmsClientToServer) && includesNone(this.macAlgorithmsServerToClient) && includesNone(this.compressionAlgorithmsClientToServer) && includesNone(this.compressionAlgorithmsServerToClient) && this.firstKexPacketFollows !== true); } } exports.KeyExchangeInitMessage = KeyExchangeInitMessage; KeyExchangeInitMessage.none = KeyExchangeInitMessage.CreateNone(); class KeyExchangeDhInitMessage extends KeyExchangeMessage { get messageType() { return 30; } onRead(reader) { this.e = reader.readBinary(); } onWrite(writer) { writer.writeBinary(this.validateField(this.e, 'E')); } } exports.KeyExchangeDhInitMessage = KeyExchangeDhInitMessage; class KeyExchangeDhReplyMessage extends KeyExchangeMessage { get messageType() { return 31; } onRead(reader) { this.hostKey = reader.readBinary(); this.f = reader.readBinary(); this.signature = reader.readBinary(); } onWrite(writer) { writer.writeBinary(this.validateField(this.hostKey, 'host key')); writer.writeBinary(this.validateField(this.f, 'F')); writer.writeBinary(this.validateField(this.signature, 'signature')); } } exports.KeyExchangeDhReplyMessage = KeyExchangeDhReplyMessage; class NewKeysMessage extends KeyExchangeMessage { get messageType() { return 21; } onRead(reader) { } onWrite(writer) { } } exports.NewKeysMessage = NewKeysMessage; sshMessage_1.SshMessage.index.set(20, KeyExchangeInitMessage); sshMessage_1.SshMessage.index.set(30, KeyExchangeDhInitMessage); sshMessage_1.SshMessage.index.set(31, KeyExchangeDhReplyMessage); sshMessage_1.SshMessage.index.set(21, NewKeysMessage); //# sourceMappingURL=kexMessages.js.map