Core UDP parsing functionality

Added to categorie

Description

Added Tests

Added tests
This commit is contained in:
h345983745 2019-08-19 20:14:22 +01:00
parent 1fb6bffe1c
commit 1d32a5939c
4 changed files with 162 additions and 0 deletions

View File

@ -167,6 +167,7 @@
"Parse IP range", "Parse IP range",
"Parse IPv6 address", "Parse IPv6 address",
"Parse IPv4 header", "Parse IPv4 header",
"Parse UDP",
"Parse SSH Host Key", "Parse SSH Host Key",
"Parse URI", "Parse URI",
"URL Encode", "URL Encode",

View File

@ -0,0 +1,92 @@
/**
* @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),
"Desination 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 currentRecipeConfig = this.state.opList.map(op => op.config);
// console.log(currentRecipeConfig);
const html = [];
html.push("<table class='table table-hover table-sm table-bordered' style='table-layout: fixed'>");
html.push("<tr>");
html.push("<th>Field</th>");
html.push("<th>Value</th>");
html.push("</tr>");
for (const key in data) {
switch (key){
default: {
html.push("<tr>");
html.push("<td style=\"word-wrap:break-word\">" + key + "</td>");
html.push("<td>" + data[key] + "</td>");
html.push("</tr>");
}
}
}
html.push("</table>");
return html.join("");
}
}
export default ParseUDP;

View File

@ -88,6 +88,7 @@ import "./tests/BLAKE2s";
import "./tests/Protobuf"; import "./tests/Protobuf";
import "./tests/ParseSSHHostKey"; import "./tests/ParseSSHHostKey";
import "./tests/DefangIP"; import "./tests/DefangIP";
import "./tests/ParseUDP";
// Cannot test operations that use the File type yet // Cannot test operations that use the File type yet
//import "./tests/SplitColourChannels"; //import "./tests/SplitColourChannels";

View File

@ -0,0 +1,68 @@
/**
* Parse UDP tests.
*
* @author h345983745
*
* @copyright Crown Copyright 2019
* @license Apache-2.0
*/
import TestRegister from "../../lib/TestRegister.mjs";
TestRegister.addTests([
{
name: "Parse UDP: No Data - JSON",
input: "04 89 00 35 00 2c 01 01",
expectedOutput: "{\"Source port\":1161,\"Desination port\":53,\"Length\":44,\"Checksum\":\"0x010x01\"}",
recipeConfig: [
{
op: "From Hex",
args: ["Auto"],
},
{
op: "Parse UDP",
args: [],
},
{
op: "JSON Minify",
args: [],
},
],
}, {
name: "Parse UDP: With Data - JSON",
input: "04 89 00 35 00 2c 01 01 02 02",
expectedOutput: "{\"Source port\":1161,\"Desination port\":53,\"Length\":44,\"Checksum\":\"0x010x01\",\"Data\":\"0x020x02\"}",
recipeConfig: [
{
op: "From Hex",
args: ["Auto"],
},
{
op: "Parse UDP",
args: [],
},
{
op: "JSON Minify",
args: [],
},
],
},
{
name: "Parse UDP: Not Enough Bytes",
input: "04 89 00",
expectedOutput: "Need 8 bytes for a UDP Header",
recipeConfig: [
{
op: "From Hex",
args: ["Auto"],
},
{
op: "Parse UDP",
args: [],
},
{
op: "JSON Minify",
args: [],
},
],
}
]);