mirror of
https://github.com/gchq/CyberChef.git
synced 2025-04-20 14:56:19 -04:00
Merge branch 'master' into theme-auto-detection
This commit is contained in:
commit
feaf3dd119
9 changed files with 262 additions and 30 deletions
22
package-lock.json
generated
22
package-lock.json
generated
|
@ -118,6 +118,7 @@
|
||||||
"chromedriver": "^130.0.0",
|
"chromedriver": "^130.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
"colors": "^1.4.0",
|
"colors": "^1.4.0",
|
||||||
|
"compression-webpack-plugin": "^11.1.0",
|
||||||
"copy-webpack-plugin": "^12.0.2",
|
"copy-webpack-plugin": "^12.0.2",
|
||||||
"core-js": "^3.37.1",
|
"core-js": "^3.37.1",
|
||||||
"css-loader": "7.1.2",
|
"css-loader": "7.1.2",
|
||||||
|
@ -5344,6 +5345,27 @@
|
||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/compression-webpack-plugin": {
|
||||||
|
"version": "11.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-11.1.0.tgz",
|
||||||
|
"integrity": "sha512-zDOQYp10+upzLxW+VRSjEpRRwBXJdsb5lBMlRxx1g8hckIFBpe3DTI0en2w7h+beuq89576RVzfiXrkdPGrHhA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"schema-utils": "^4.2.0",
|
||||||
|
"serialize-javascript": "^6.0.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18.12.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"webpack": "^5.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/compression/node_modules/bytes": {
|
"node_modules/compression/node_modules/bytes": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
|
@ -58,6 +58,7 @@
|
||||||
"chromedriver": "^130.0.0",
|
"chromedriver": "^130.0.0",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
"colors": "^1.4.0",
|
"colors": "^1.4.0",
|
||||||
|
"compression-webpack-plugin": "^11.1.0",
|
||||||
"copy-webpack-plugin": "^12.0.2",
|
"copy-webpack-plugin": "^12.0.2",
|
||||||
"core-js": "^3.37.1",
|
"core-js": "^3.37.1",
|
||||||
"css-loader": "7.1.2",
|
"css-loader": "7.1.2",
|
||||||
|
|
|
@ -235,6 +235,7 @@
|
||||||
"Parse IP range",
|
"Parse IP range",
|
||||||
"Parse IPv6 address",
|
"Parse IPv6 address",
|
||||||
"Parse IPv4 header",
|
"Parse IPv4 header",
|
||||||
|
"Strip IPv4 header",
|
||||||
"Parse TCP",
|
"Parse TCP",
|
||||||
"Strip TCP header",
|
"Strip TCP header",
|
||||||
"Parse TLS record",
|
"Parse TLS record",
|
||||||
|
|
|
@ -22,7 +22,13 @@ class AddLineNumbers extends Operation {
|
||||||
this.description = "Adds line numbers to the output.";
|
this.description = "Adds line numbers to the output.";
|
||||||
this.inputType = "string";
|
this.inputType = "string";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [
|
||||||
|
{
|
||||||
|
"name": "Offset",
|
||||||
|
"type": "number",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,10 +39,11 @@ class AddLineNumbers extends Operation {
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const lines = input.split("\n"),
|
const lines = input.split("\n"),
|
||||||
width = lines.length.toString().length;
|
width = lines.length.toString().length;
|
||||||
|
const offset = args[0] ? parseInt(args[0], 10) : 0;
|
||||||
let output = "";
|
let output = "";
|
||||||
|
|
||||||
for (let n = 0; n < lines.length; n++) {
|
for (let n = 0; n < lines.length; n++) {
|
||||||
output += (n+1).toString().padStart(width, " ") + " " + lines[n] + "\n";
|
output += (n+1+offset).toString().padStart(width, " ") + " " + lines[n] + "\n";
|
||||||
}
|
}
|
||||||
return output.slice(0, output.length-1);
|
return output.slice(0, output.length-1);
|
||||||
}
|
}
|
||||||
|
|
57
src/core/operations/StripIPv4Header.mjs
Normal file
57
src/core/operations/StripIPv4Header.mjs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/**
|
||||||
|
* @author c65722 []
|
||||||
|
* @copyright Crown Copyright 2024
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation.mjs";
|
||||||
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
|
import Stream from "../lib/Stream.mjs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strip IPv4 header operation
|
||||||
|
*/
|
||||||
|
class StripIPv4Header extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StripIPv4Header constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "Strip IPv4 header";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Strips the IPv4 header from an IPv4 packet, outputting the payload.";
|
||||||
|
this.infoURL = "https://wikipedia.org/wiki/IPv4";
|
||||||
|
this.inputType = "ArrayBuffer";
|
||||||
|
this.outputType = "ArrayBuffer";
|
||||||
|
this.args = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ArrayBuffer} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {ArrayBuffer}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
const MIN_HEADER_LEN = 20;
|
||||||
|
|
||||||
|
const s = new Stream(new Uint8Array(input));
|
||||||
|
if (s.length < MIN_HEADER_LEN) {
|
||||||
|
throw new OperationError("Input length is less than minimum IPv4 header length");
|
||||||
|
}
|
||||||
|
|
||||||
|
const ihl = s.readInt(1) & 0x0f;
|
||||||
|
const dataOffsetBytes = ihl * 4;
|
||||||
|
if (s.length < dataOffsetBytes) {
|
||||||
|
throw new OperationError("Input length is less than IHL");
|
||||||
|
}
|
||||||
|
|
||||||
|
s.moveTo(dataOffsetBytes);
|
||||||
|
|
||||||
|
return s.getBytes().buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default StripIPv4Header;
|
|
@ -675,42 +675,42 @@ module.exports = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"Loading from URL": browser => {
|
// "Loading from URL": browser => {
|
||||||
utils.clear(browser);
|
// utils.clear(browser);
|
||||||
|
|
||||||
/* Side panel displays correct info */
|
// /* Side panel displays correct info */
|
||||||
utils.uploadFile(browser, "files/TowelDay.jpeg");
|
// utils.uploadFile(browser, "files/TowelDay.jpeg");
|
||||||
|
|
||||||
browser
|
// browser
|
||||||
.waitForElementVisible("#input-text .cm-file-details")
|
// .waitForElementVisible("#input-text .cm-file-details")
|
||||||
.waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
|
// .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
|
||||||
.waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
|
// .waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
|
||||||
.waitForElementVisible("#input-text .cm-file-details .file-details-name")
|
// .waitForElementVisible("#input-text .cm-file-details .file-details-name")
|
||||||
.waitForElementVisible("#input-text .cm-file-details .file-details-size")
|
// .waitForElementVisible("#input-text .cm-file-details .file-details-size")
|
||||||
.waitForElementVisible("#input-text .cm-file-details .file-details-type")
|
// .waitForElementVisible("#input-text .cm-file-details .file-details-type")
|
||||||
.waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
|
// .waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
|
||||||
|
|
||||||
/* Complex deep link populates the input correctly (encoding, eol, input) */
|
// /* Complex deep link populates the input correctly (encoding, eol, input) */
|
||||||
browser
|
// browser
|
||||||
.urlHash("recipe=To_Base64('A-Za-z0-9%2B/%3D')&input=VGhlIHNoaXBzIGh1bmcgaW4gdGhlIHNreSBpbiBtdWNoIHRoZSBzYW1lIHdheSB0aGF0IGJyaWNrcyBkb24ndC4M&ienc=21866&oenc=1201&ieol=FF&oeol=PS")
|
// .urlHash("recipe=To_Base64('A-Za-z0-9%2B/%3D')&input=VGhlIHNoaXBzIGh1bmcgaW4gdGhlIHNreSBpbiBtdWNoIHRoZSBzYW1lIHdheSB0aGF0IGJyaWNrcyBkb24ndC4M&ienc=21866&oenc=1201&ieol=FF&oeol=PS")
|
||||||
.waitForElementVisible("#rec-list li.operation");
|
// .waitForElementVisible("#rec-list li.operation");
|
||||||
|
|
||||||
browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{65}$/);
|
// browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{65}$/);
|
||||||
browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("66");
|
// browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("66");
|
||||||
browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
// browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
|
||||||
|
|
||||||
browser.expect.element("#input-text .chr-enc-value").text.that.equals("KOI8-U Ukrainian Cyrillic");
|
// browser.expect.element("#input-text .chr-enc-value").text.that.equals("KOI8-U Ukrainian Cyrillic");
|
||||||
browser.expect.element("#output-text .chr-enc-value").text.that.equals("UTF-16BE");
|
// browser.expect.element("#output-text .chr-enc-value").text.that.equals("UTF-16BE");
|
||||||
|
|
||||||
browser.expect.element("#input-text .eol-value").text.that.equals("FF");
|
// browser.expect.element("#input-text .eol-value").text.that.equals("FF");
|
||||||
browser.expect.element("#output-text .eol-value").text.that.equals("PS");
|
// browser.expect.element("#output-text .eol-value").text.that.equals("PS");
|
||||||
|
|
||||||
utils.bake(browser);
|
// utils.bake(browser);
|
||||||
|
|
||||||
browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^.{44}$/);
|
// browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^.{44}$/);
|
||||||
browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("44");
|
// browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("44");
|
||||||
browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
// browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
|
||||||
},
|
// },
|
||||||
|
|
||||||
"Replace input with output": browser => {
|
"Replace input with output": browser => {
|
||||||
/* Input is correctly populated */
|
/* Input is correctly populated */
|
||||||
|
|
|
@ -143,6 +143,7 @@ import "./tests/SIGABA.mjs";
|
||||||
import "./tests/SM4.mjs";
|
import "./tests/SM4.mjs";
|
||||||
// import "./tests/SplitColourChannels.mjs"; // Cannot test operations that use the File type yet
|
// import "./tests/SplitColourChannels.mjs"; // Cannot test operations that use the File type yet
|
||||||
import "./tests/StrUtils.mjs";
|
import "./tests/StrUtils.mjs";
|
||||||
|
import "./tests/StripIPv4Header.mjs";
|
||||||
import "./tests/StripTCPHeader.mjs";
|
import "./tests/StripTCPHeader.mjs";
|
||||||
import "./tests/StripUDPHeader.mjs";
|
import "./tests/StripUDPHeader.mjs";
|
||||||
import "./tests/Subsection.mjs";
|
import "./tests/Subsection.mjs";
|
||||||
|
|
126
tests/operations/tests/StripIPv4Header.mjs
Normal file
126
tests/operations/tests/StripIPv4Header.mjs
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/**
|
||||||
|
* Strip IPv4 header tests.
|
||||||
|
*
|
||||||
|
* @author c65722 []
|
||||||
|
* @copyright Crown Copyright 2024
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "Strip IPv4 header: No options, No payload",
|
||||||
|
input: "450000140005400080060000c0a80001c0a80002",
|
||||||
|
expectedOutput: "",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From Hex",
|
||||||
|
args: ["None"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Strip IPv4 header",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "To Hex",
|
||||||
|
args: ["None", 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Strip IPv4 header: No options, Payload",
|
||||||
|
input: "450000140005400080060000c0a80001c0a80002ffffffffffffffff",
|
||||||
|
expectedOutput: "ffffffffffffffff",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From Hex",
|
||||||
|
args: ["None"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Strip IPv4 header",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "To Hex",
|
||||||
|
args: ["None", 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Strip IPv4 header: Options, No payload",
|
||||||
|
input: "460000140005400080060000c0a80001c0a8000207000000",
|
||||||
|
expectedOutput: "",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From Hex",
|
||||||
|
args: ["None"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Strip IPv4 header",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "To Hex",
|
||||||
|
args: ["None", 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Strip IPv4 header: Options, Payload",
|
||||||
|
input: "460000140005400080060000c0a80001c0a8000207000000ffffffffffffffff",
|
||||||
|
expectedOutput: "ffffffffffffffff",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From Hex",
|
||||||
|
args: ["None"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Strip IPv4 header",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "To Hex",
|
||||||
|
args: ["None", 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Strip IPv4 header: Input length lesss than minimum header length",
|
||||||
|
input: "450000140005400080060000c0a80001c0a800",
|
||||||
|
expectedOutput: "Input length is less than minimum IPv4 header length",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From Hex",
|
||||||
|
args: ["None"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Strip IPv4 header",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "To Hex",
|
||||||
|
args: ["None", 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Strip IPv4 header: Input length less than IHL",
|
||||||
|
input: "460000140005400080060000c0a80001c0a80000",
|
||||||
|
expectedOutput: "Input length is less than IHL",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From Hex",
|
||||||
|
args: ["None"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "Strip IPv4 header",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: "To Hex",
|
||||||
|
args: ["None", 0]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
|
@ -1,8 +1,10 @@
|
||||||
const webpack = require("webpack");
|
const webpack = require("webpack");
|
||||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
|
const CompressionPlugin = require("compression-webpack-plugin");
|
||||||
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
||||||
const { ModifySourcePlugin, ReplaceOperation } = require("modify-source-webpack-plugin");
|
const { ModifySourcePlugin, ReplaceOperation } = require("modify-source-webpack-plugin");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
const zlib = require("zlib");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Webpack configuration details for use with Grunt.
|
* Webpack configuration details for use with Grunt.
|
||||||
|
@ -64,6 +66,21 @@ module.exports = {
|
||||||
new MiniCssExtractPlugin({
|
new MiniCssExtractPlugin({
|
||||||
filename: "assets/[name].css"
|
filename: "assets/[name].css"
|
||||||
}),
|
}),
|
||||||
|
new CompressionPlugin({
|
||||||
|
filename: "[path][base].gz",
|
||||||
|
algorithm: "gzip",
|
||||||
|
test: /\.(js|css|html)$/,
|
||||||
|
}),
|
||||||
|
new CompressionPlugin({
|
||||||
|
filename: "[path][base].br",
|
||||||
|
algorithm: "brotliCompress",
|
||||||
|
test: /\.(js|css|html)$/,
|
||||||
|
compressionOptions: {
|
||||||
|
params: {
|
||||||
|
[zlib.constants.BROTLI_PARAM_QUALITY]: 11,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
new CopyWebpackPlugin({
|
new CopyWebpackPlugin({
|
||||||
patterns: [
|
patterns: [
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue