/** * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2017 * @license Apache-2.0 */ import Operation from "../Operation.mjs"; /** * Decode NetBIOS Name operation */ class DecodeNetBIOSName extends Operation { /** * DecodeNetBIOSName constructor */ constructor() { super(); this.name = "Decode NetBIOS Name"; this.module = "Default"; this.description = "NetBIOS names as seen across the client interface to NetBIOS are exactly 16 bytes long. Within the NetBIOS-over-TCP protocols, a longer representation is used.

There are two levels of encoding. The first level maps a NetBIOS name into a domain system name. The second level maps the domain system name into the 'compressed' representation required for interaction with the domain name system.

This operation decodes the first level of encoding. See RFC 1001 for full details."; this.infoURL = "https://wikipedia.org/wiki/NetBIOS"; this.inputType = "byteArray"; this.outputType = "byteArray"; this.args = [ { "name": "Offset", "type": "number", "value": 65 } ]; this.checks = [ { pattern: "^\\s*\\S{32}$", flags: "", args: [65] } ]; } /** * @param {byteArray} input * @param {Object[]} args * @returns {byteArray} */ run(input, args) { const output = [], offset = args[0]; if (input.length <= 32 && (input.length % 2) === 0) { for (let i = 0; i < input.length; i += 2) { output.push((((input[i] & 0xff) - offset) << 4) | (((input[i + 1] & 0xff) - offset) & 0xf)); } for (let i = output.length - 1; i > 0; i--) { if (output[i] === 32) output.splice(i, i); else break; } } return output; } } export default DecodeNetBIOSName;