diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index f1a7b815e..89b93b870 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -167,6 +167,7 @@ "Parse IP range", "Parse IPv6 address", "Parse IPv4 header", + "Parse UDP", "Parse SSH Host Key", "Parse URI", "URL Encode", diff --git a/src/core/operations/ParseUDP.mjs b/src/core/operations/ParseUDP.mjs new file mode 100644 index 000000000..234a08f67 --- /dev/null +++ b/src/core/operations/ParseUDP.mjs @@ -0,0 +1,90 @@ +/** + * @author h345983745 [] + * @copyright Crown Copyright 2019 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import Stream from "../lib/Stream.mjs"; +import {toHex} from "../lib/Hex.mjs"; +import OperationError from "../errors/OperationError.mjs"; + +/** + * Parse UDP operation + */ +class ParseUDP extends Operation { + + /** + * ParseUDP constructor + */ + constructor() { + super(); + + this.name = "Parse UDP"; + this.module = "Default"; + this.description = "Parses a UDP header and payload (if present)."; + this.infoURL = "https://wikipedia.org/wiki/User_Datagram_Protocol"; + this.inputType = "byteArray"; + this.outputType = "json"; + this.presentType = "html"; + this.args = []; + } + + /** + * @param {Uint8Array} input + * @returns {Object} + */ + run(input, args) { + + if (input.length < "8"){ + throw new OperationError("Need 8 bytes for a UDP Header"); + } + + const s = new Stream(input); + //Parse Header + const UDPPacket = { + "Source port": s.readInt(2), + "Destination port": s.readInt(2), + "Length": s.readInt(2), + "Checksum": toHex(s.getBytes(2), "0x") + }; + //Parse data if present + if (s.hasMore()){ + UDPPacket.Data = toHex(s.getBytes(UDPPacket.Length - 8), "0x"); + } + + return UDPPacket; + + } + + /** + * Displays the UDP Packet in a table style + * @param {Object} data + * @returns {html} + */ + present(data) { + const html = []; + html.push("
Field | "); + html.push("Value | "); + html.push("
---|---|
" + key + " | "); + html.push("" + data[key] + " | "); + html.push("