From 5e39f4b3b54cc37d6ac43ddcd50f8e57ae622853 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Wed, 14 Jul 2021 10:56:43 -0700 Subject: [PATCH] Synced with changes to modules_meshcmd --- agents/modules_meshcore/amt-mei.js | 132 +++++++++++++++++++---------- 1 file changed, 89 insertions(+), 43 deletions(-) diff --git a/agents/modules_meshcore/amt-mei.js b/agents/modules_meshcore/amt-mei.js index 946c429f..8387049f 100644 --- a/agents/modules_meshcore/amt-mei.js +++ b/agents/modules_meshcore/amt-mei.js @@ -1,5 +1,5 @@ /* -Copyright 2018-2020 Intel Corporation +Copyright 2018-2021 Intel Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -108,7 +108,7 @@ function amt_heci() function trim(x) { var y = x.indexOf('\0'); if (y >= 0) { return x.substring(0, y); } else { return x; } } this.getCommand = function getCommand(chunk) { - var command = chunk.length == 0 ? (this._rq.peekQueue().cmd | 0x800000) : chunk.readUInt32LE(4); + var command = chunk.length == 0 ? (g_internal._rq.peekQueue().cmd | 0x800000) : chunk.readUInt32LE(4); var ret = { IsResponse: (command & 0x800000) == 0x800000 ? true : false, Command: (command & 0x7FFFFF), Status: chunk.length != 0 ? chunk.readUInt32LE(12) : -1, Data: chunk.length != 0 ? chunk.slice(16) : null }; return (ret); }; @@ -332,34 +332,27 @@ function amt_heci() this.getLocalSystemAccount = function getLocalSystemAccount(callback) { var optional = []; for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); } - this.sendCommand(103, Buffer.alloc(40), function (header, fn, opt) - { - if (header.Status == 0 && header.Data.length == 68) - { + this.sendCommand(103, Buffer.alloc(40), function (header, fn, opt) { + if (header.Status == 0 && header.Data.length == 68) { opt.unshift({ user: trim(header.Data.slice(0, 33).toString()), pass: trim(header.Data.slice(33, 67).toString()), raw: header.Data }); } - else - { + else { opt.unshift(null); } fn.apply(this, opt); }, callback, optional); } - this.getLanInterfaceSettings = function getLanInterfaceSettings(index, callback) - { + this.getLanInterfaceSettings = function getLanInterfaceSettings(index, callback) { var optional = []; for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); } var ifx = Buffer.alloc(4); ifx.writeUInt32LE(index); - this.sendCommand(0x48, ifx, function onGetLanInterfaceSettings(header, fn, opt) - { - if(header.Status == 0) - { + this.sendCommand(0x48, ifx, function onGetLanInterfaceSettings(header, fn, opt) { + if (header.Status == 0) { var info = {}; info.enabled = header.Data.readUInt32LE(0); info.dhcpEnabled = header.Data.readUInt32LE(8); - switch(header.Data[12]) - { + switch (header.Data[12]) { case 1: info.dhcpMode = 'ACTIVE' break; @@ -371,14 +364,13 @@ function amt_heci() break; } info.mac = header.Data.slice(14).toString('hex:'); - + var addr = header.Data.readUInt32LE(4); info.address = ((addr >> 24) & 255) + '.' + ((addr >> 16) & 255) + '.' + ((addr >> 8) & 255) + '.' + (addr & 255); opt.unshift(info); fn.apply(this, opt); } - else - { + else { opt.unshift(null); fn.apply(this, opt); } @@ -395,32 +387,32 @@ function amt_heci() fn.apply(this, opt); }, callback, optional); } - this.startConfiguration = function startConfiguration() { + this.startConfiguration = function startConfiguration(callback) { var optional = []; - for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); } - this.sendCommand(0x29, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); + for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); } + this.sendCommand(0x29, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); } - this.stopConfiguration = function stopConfiguration() { + this.stopConfiguration = function stopConfiguration(callback) { var optional = []; - for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); } - this.sendCommand(0x5E, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); + for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); } + this.sendCommand(0x5E, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); } - this.openUserInitiatedConnection = function openUserInitiatedConnection() { + this.openUserInitiatedConnection = function openUserInitiatedConnection(callback) { var optional = []; - for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); } - this.sendCommand(0x44, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); + for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); } + this.sendCommand(0x44, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); } - this.closeUserInitiatedConnection = function closeUnserInitiatedConnected() { + this.closeUserInitiatedConnection = function closeUnserInitiatedConnected(callback) { var optional = []; - for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); } - this.sendCommand(0x45, data, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); + for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); } + this.sendCommand(0x45, null, function (header, fn, opt) { opt.unshift(header.Status); fn.apply(this, opt); }, callback, optional); } - this.getRemoteAccessConnectionStatus = function getRemoteAccessConnectionStatus() { + this.getRemoteAccessConnectionStatus = function getRemoteAccessConnectionStatus(callback) { var optional = []; - for (var i = 2; i < arguments.length; ++i) { optional.push(arguments[i]); } - this.sendCommand(0x46, data, function (header, fn, opt) { + for (var i = 1; i < arguments.length; ++i) { optional.push(arguments[i]); } + this.sendCommand(0x46, null, function (header, fn, opt) { if (header.Status == 0) { - var hostname = v.slice(14, header.Data.readUInt16LE(12) + 14).toString() + var hostname = header.Data.slice(14, header.Data.readUInt16LE(12) + 14).toString() opt.unshift({ status: header.Status, networkStatus: header.Data.readUInt32LE(0), remoteAccessStatus: header.Data.readUInt32LE(4), remoteAccessTrigger: header.Data.readUInt32LE(8), mpsHostname: hostname, raw: header.Data }); } else { opt.unshift({ status: header.Status }); @@ -428,27 +420,81 @@ function amt_heci() fn.apply(this, opt); }, callback, optional); } - this.getProtocolVersion = function getProtocolVersion(callback) - { + this.getProtocolVersion = function getProtocolVersion(callback) { var optional = []; for (var i = 1; i < arguments.length; ++i) { opt.push(arguments[i]); } - if (!this._tmpSession) { this._tmpSession = heci.create(); this._tmpSession.parent = this;} - this._tmpSession.doIoctl(heci.IOCTL.HECI_VERSION, Buffer.alloc(5), Buffer.alloc(5), function (status, buffer, self, fn, opt) - { + if (!this._tmpSession) { this._tmpSession = heci.create(); this._tmpSession.parent = this; } + this._tmpSession.doIoctl(heci.IOCTL.HECI_VERSION, Buffer.alloc(5), Buffer.alloc(5), function (status, buffer, self, fn, opt) { if (status == 0) { var result = buffer.readUInt8(0).toString() + '.' + buffer.readUInt8(1).toString() + '.' + buffer.readUInt8(2).toString() + '.' + buffer.readUInt16BE(3).toString(); opt.unshift(result); fn.apply(self, opt); } - else - { + else { opt.unshift(null); fn.apply(self, opt); } }, this, callback, optional); } + this.startConfigurationHBased = function startConfigurationHBased(certHash, hostVpn, dnsSuffixList, func) { + if ((certHash == null) || ((certHash.length != 32) && (certHash.length != 48))) { func({ status: -101 }); } + this.stopConfiguration(function (status) { + if (status == 0) { + // We stopped the configuration, wait 20 seconds before starting up again. + var f = function tf() { delete tf.parent.xtimeout; tf.parent.startConfigurationHBasedEx(certHash, hostVpn, dnsSuffixList, func); } + f.parent = this; + this.xtimeout = setTimeout(f, 20000); + } else { + // We are not in the connect mode, this is good, start configuration right away. + this.startConfigurationHBasedEx(certHash, hostVpn, dnsSuffixList, func); + } + }) + } + this.startConfigurationHBasedEx = function startConfigurationHBased(certHash, hostVpn, dnsSuffixList, func) { + var optional = []; + for (var i = 4; i < arguments.length; ++i) { optional.push(arguments[i]); } + + // Format the command + var data = Buffer.alloc(4 + 64 + 4 + 4 + 320); + data.writeUInt32LE((certHash.length == 48) ? 3 : 2, 0); // Write certificate hash type: SHA256 = 2, SHA384 = 3 + certHash.copy(data, 4); // Write the hash + data.writeUInt32LE(hostVpn ? 1 : 0, 68); // Write is HostVPN is enabled + if (dnsSuffixList != null) { + data.writeUInt32LE(dnsSuffixList.length, 72); // Write the number of DNS Suffix, from 0 to 4 + var ptr = 76; + for (var i = 0; i < dnsSuffixList.length; i++) { ptr += data.write(dnsSuffixList[i], ptr) + 1; } // Write up to 4 DNS Suffix with null seperation. + } + + // Send the command + this.sendCommand(139, data, function (header, fn, opt) { + if (header.Status == 0) { + var amtHash = null; + if (header.Data[0] == 2) { amtHash = header.Data.slice(1, 33); } // SHA256 + if (header.Data[0] == 3) { amtHash = header.Data.slice(1, 49); } // SHA384 + opt.unshift({ status: header.Status, hash: amtHash.toString('hex') }); + } else { + opt.unshift({ status: header.Status }); + } + fn.apply(this, opt); + }, func, optional); + } } -module.exports = amt_heci; \ No newline at end of file +module.exports = amt_heci; + + +/* +AMT_STATUS_SUCCESS = 0, +AMT_STATUS_INTERNAL_ERROR = 1, +AMT_STATUS_INVALID_AMT_MODE = 3, +AMT_STATUS_INVALID_MESSAGE_LENGTH = 4, +AMT_STATUS_MAX_LIMIT_REACHED = 23, +AMT_STATUS_INVALID_PARAMETER = 36, +AMT_STATUS_RNG_GENERATION_IN_PROGRESS = 47, +AMT_STATUS_RNG_NOT_READY = 48, +AMT_STATUS_CERTIFICATE_NOT_READY = 49, +AMT_STATUS_INVALID_HANDLE = 2053 +AMT_STATUS_NOT_FOUND = 2068, +*/ \ No newline at end of file