mirror of
https://github.com/gchq/CyberChef.git
synced 2025-06-14 10:14:53 -04:00
Merge 9a193affbf
into c57556f49f
This commit is contained in:
commit
50db810c6c
4 changed files with 45 additions and 7 deletions
|
@ -327,6 +327,8 @@ class Utils {
|
||||||
*
|
*
|
||||||
* @param {string} str
|
* @param {string} str
|
||||||
* @param {string} type - One of "Binary", "Hex", "Decimal", "Base64", "UTF8" or "Latin1"
|
* @param {string} type - One of "Binary", "Hex", "Decimal", "Base64", "UTF8" or "Latin1"
|
||||||
|
* @param {string} [delim="Auto"] - (Hex only) Delimiter used to split the input string. Set to "Auto" by default.
|
||||||
|
* @param {boolean} [throwError=false] - (Hex only) Whether to throw an error on invalid input. Defaults to false.
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
|
@ -339,12 +341,12 @@ class Utils {
|
||||||
* // returns [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130]
|
* // returns [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130]
|
||||||
* Utils.convertToByteArray("0JfQtNGA0LDQstGB0YLQstGD0LnRgtC1", "base64");
|
* Utils.convertToByteArray("0JfQtNGA0LDQstGB0YLQstGD0LnRgtC1", "base64");
|
||||||
*/
|
*/
|
||||||
static convertToByteArray(str, type) {
|
static convertToByteArray(str, type, delim = "Auto", throwError = false) {
|
||||||
switch (type.toLowerCase()) {
|
switch (type.toLowerCase()) {
|
||||||
case "binary":
|
case "binary":
|
||||||
return fromBinary(str);
|
return fromBinary(str);
|
||||||
case "hex":
|
case "hex":
|
||||||
return fromHex(str);
|
return fromHex(str, delim, 2, throwError);
|
||||||
case "decimal":
|
case "decimal":
|
||||||
return fromDecimal(str);
|
return fromDecimal(str);
|
||||||
case "base64":
|
case "base64":
|
||||||
|
|
|
@ -91,6 +91,7 @@ export function toHexFast(data) {
|
||||||
* @param {string} data
|
* @param {string} data
|
||||||
* @param {string} [delim]
|
* @param {string} [delim]
|
||||||
* @param {number} [byteLen=2]
|
* @param {number} [byteLen=2]
|
||||||
|
* @param {boolean} [throwError=false]
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
|
@ -100,7 +101,7 @@ export function toHexFast(data) {
|
||||||
* // returns [10,20,30]
|
* // returns [10,20,30]
|
||||||
* fromHex("0a:14:1e", "Colon");
|
* fromHex("0a:14:1e", "Colon");
|
||||||
*/
|
*/
|
||||||
export function fromHex(data, delim="Auto", byteLen=2) {
|
export function fromHex(data, delim="Auto", byteLen=2, throwError=false) {
|
||||||
if (byteLen < 1 || Math.round(byteLen) !== byteLen)
|
if (byteLen < 1 || Math.round(byteLen) !== byteLen)
|
||||||
throw new OperationError("Byte length must be a positive integer");
|
throw new OperationError("Byte length must be a positive integer");
|
||||||
|
|
||||||
|
@ -114,7 +115,11 @@ export function fromHex(data, delim="Auto", byteLen=2) {
|
||||||
const output = [];
|
const output = [];
|
||||||
for (let i = 0; i < data.length; i++) {
|
for (let i = 0; i < data.length; i++) {
|
||||||
for (let j = 0; j < data[i].length; j += byteLen) {
|
for (let j = 0; j < data[i].length; j += byteLen) {
|
||||||
output.push(parseInt(data[i].substr(j, byteLen), 16));
|
const chunk = data[i].substr(j, byteLen);
|
||||||
|
if (throwError && /[^a-f\d]/i.test(chunk)) {
|
||||||
|
throw new OperationError(`Invalid hex character in chunk "${chunk}"`);
|
||||||
|
}
|
||||||
|
output.push(parseInt(chunk, 16));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import Operation from "../Operation.mjs";
|
import Operation from "../Operation.mjs";
|
||||||
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
import Utils from "../Utils.mjs";
|
import Utils from "../Utils.mjs";
|
||||||
import { bitOp, xor, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs";
|
import { bitOp, xor, BITWISE_OP_DELIMS } from "../lib/BitwiseOp.mjs";
|
||||||
|
|
||||||
|
@ -41,6 +42,11 @@ class XOR extends Operation {
|
||||||
"name": "Null preserving",
|
"name": "Null preserving",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"value": false
|
"value": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Filter Key",
|
||||||
|
"type": "boolean",
|
||||||
|
"value": true
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -52,10 +58,14 @@ class XOR extends Operation {
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
input = new Uint8Array(input);
|
input = new Uint8Array(input);
|
||||||
const key = Utils.convertToByteArray(args[0].string || "", args[0].option),
|
try {
|
||||||
[, scheme, nullPreserving] = args;
|
const key = Utils.convertToByteArray(args[0].string || "", args[0].option, args[3] ? "Auto" : "None", true),
|
||||||
|
[, scheme, nullPreserving] = args;
|
||||||
|
|
||||||
return bitOp(input, key, xor, nullPreserving, scheme);
|
return bitOp(input, key, xor, nullPreserving, scheme);
|
||||||
|
} catch (error) {
|
||||||
|
throw new OperationError("Invalid Characters in key");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -989,6 +989,27 @@ smothering ampersand abreast`;
|
||||||
"QV\u0010\u0004UDWQ");
|
"QV\u0010\u0004UDWQ");
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
it("XOR: should throw 'Invalid Characters in key' error when key contains invalid characters", () => {
|
||||||
|
const invalidKeys = [
|
||||||
|
{ string: "zz 00 11", option: "Hex" },
|
||||||
|
|
||||||
|
{ string: "4~ 00 11", option: "Hex" }
|
||||||
|
];
|
||||||
|
invalidKeys.forEach(invalidKey => {
|
||||||
|
assert.throws(() => {
|
||||||
|
chef.XOR("fe023da5", { key: invalidKey, filterKey: false });
|
||||||
|
}, /Invalid Characters in key/);
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
|
||||||
|
it("XOR: should not throw 'Invalid Characters in key' error when key contains only valid characters", () => {
|
||||||
|
assert.strictEqual(chef.XOR("fe023da5", {
|
||||||
|
key: "736f6d65",
|
||||||
|
filterKey: false
|
||||||
|
}).toString(),
|
||||||
|
"\u0015\n]W@\u000b\fP");
|
||||||
|
}),
|
||||||
|
|
||||||
it("XPath expression", () => {
|
it("XPath expression", () => {
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
chef.XPathExpression("<contact-info><company>abc</company></contact-info>", {xPath: "contact-info/company"}).toString(),
|
chef.XPathExpression("<contact-info><company>abc</company></contact-info>", {xPath: "contact-info/company"}).toString(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue