mirror of
https://github.com/gchq/CyberChef.git
synced 2025-05-10 08:15:00 -04:00
Merge branch 'allow-magic' into simplify-recipe
This commit is contained in:
commit
1ae2857d75
59 changed files with 912 additions and 211 deletions
|
@ -97,10 +97,14 @@ class TestRegister {
|
|||
ret.status = "passing";
|
||||
} else if ("expectedMatch" in test && test.expectedMatch.test(result.result)) {
|
||||
ret.status = "passing";
|
||||
} else if ("unexpectedMatch" in test && !test.unexpectedMatch.test(result.result)) {
|
||||
ret.status = "passing";
|
||||
} else {
|
||||
ret.status = "failing";
|
||||
const expected = test.expectedOutput ? test.expectedOutput :
|
||||
test.expectedMatch ? test.expectedMatch.toString() : "unknown";
|
||||
test.expectedMatch ? test.expectedMatch.toString() :
|
||||
test.unexpectedMatch ? "to not find " + test.unexpectedMatch.toString() :
|
||||
"unknown";
|
||||
ret.output = [
|
||||
"Expected",
|
||||
"\t" + expected.replace(/\n/g, "\n\t"),
|
||||
|
@ -148,7 +152,7 @@ class TestRegister {
|
|||
result.status = "passing";
|
||||
} catch (e) {
|
||||
result.status = "erroring";
|
||||
result.output = e.message;
|
||||
result.output = `${e.message}\nError: ${e.stack}`;
|
||||
}
|
||||
|
||||
testResults.push(result);
|
||||
|
|
|
@ -1076,5 +1076,60 @@ ExifImageHeight: 57`);
|
|||
}),
|
||||
|
||||
|
||||
it("performs MAGIC", async () => {
|
||||
const input = "WUagwsiae6mP8gNtCCLUFpCpCB26RmBDoDD8PacdAmzAzBVjkK2QstFXaKhpC6iUS7RHqXrJtFisoRSgoJ4whjm1arm864qaNq4RcfUmLHrcsAaZc5TXCYifNdgS83gDeejGX46gaiMyuBV6EskHt1scgJ88x2tNSotQDwbGY1mmCob2ARGFvCKYNqiN9ipMq1ZU1mgkdbNuGcb76aRtYWhCGUc8g93UJudhb8htsheZnwTpgqhx83SVJSZXMXUjJT2zmpC7uXWtumqokbdSi88YtkWDAc1Toouh2oH4D4ddmNKJWUDpMwmngUmK14xwmomccPQE9hM172APnSqwxdKQ172RkcAsysnmj5gGtRmVNNh2s359wr6mS2QRP";
|
||||
const depth = 3;
|
||||
|
||||
const res = await chef.magic(input, {
|
||||
depth: 3
|
||||
});
|
||||
|
||||
// assert against the structure of the output, rather than the values.
|
||||
assert.strictEqual(res.value.length, depth + 1);
|
||||
res.value.forEach(row => {
|
||||
assert.ok(row.recipe);
|
||||
assert.ok(row.data);
|
||||
assert.ok(row.languageScores);
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(row, "fileType")); // Can be null, so cannot just use ok
|
||||
assert.ok(row.entropy);
|
||||
assert.ok(row.matchingOps);
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(row, "useful"));
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(row, "matchesCrib"));
|
||||
|
||||
row.recipe.forEach(item => {
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(item, "op"), `No 'op' property in item ${item}`);
|
||||
assert.strictEqual(typeof item.op, "string");
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(item, "args"), `No 'args' property in item ${item}`);
|
||||
assert.ok(Array.isArray(item.args));
|
||||
});
|
||||
|
||||
row.languageScores.forEach(score => {
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(score, "lang"), `No 'lang' property in languageScore ${score}`);
|
||||
assert.strictEqual(typeof score.lang, "string");
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(score, "score"), `No 'score' property in languageScore ${score}`);
|
||||
assert.strictEqual(typeof score.score, "number");
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(score, "probability"), `No 'probability' property in languageScore ${score}`);
|
||||
assert.strictEqual(typeof score.probability, "number");
|
||||
});
|
||||
|
||||
row.matchingOps.forEach(op => {
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(op, "op"), `No 'op' property in matchingOp ${JSON.stringify(op)}`);
|
||||
assert.strictEqual(typeof op.op, "string");
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(op, "pattern"), `No 'pattern' property in matchingOp ${JSON.stringify(op)}`);
|
||||
assert.ok(op.pattern instanceof RegExp);
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(op, "args"), `No 'args' property in matchingOp ${JSON.stringify(op)}`);
|
||||
assert.ok(Array.isArray(op.args));
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(op, "useful"), `No 'useful' property in matchingOp ${JSON.stringify(op)}`);
|
||||
assert.ifError(op.useful); // Expect this to be undefined
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(op, "entropyRange"), `No 'entropyRange' property in matchingOp ${JSON.stringify(op)}`);
|
||||
assert.ifError(op.entropyRange); // Expect this to be undefined
|
||||
assert.ok(Object.prototype.hasOwnProperty.call(op, "output"), `No 'output' property in matchingOp ${JSON.stringify(op)}`);
|
||||
assert.ifError(op.output); // Expect this to be undefined
|
||||
});
|
||||
});
|
||||
|
||||
}),
|
||||
|
||||
|
||||
]);
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ import "./tests/Lorenz.mjs";
|
|||
import "./tests/LuhnChecksum.mjs";
|
||||
import "./tests/CipherSaber2.mjs";
|
||||
import "./tests/Colossus.mjs";
|
||||
|
||||
import "./tests/ParseObjectIDTimestamp.mjs";
|
||||
|
||||
// Cannot test operations that use the File type yet
|
||||
// import "./tests/SplitColourChannels.mjs";
|
||||
|
@ -119,4 +119,3 @@ const logOpsTestReport = logTestReport.bind(null, testStatus);
|
|||
const results = await TestRegister.runTests();
|
||||
logOpsTestReport(results);
|
||||
})();
|
||||
|
||||
|
|
43
tests/operations/samples/Images.mjs
Normal file
43
tests/operations/samples/Images.mjs
Normal file
File diff suppressed because one or more lines are too long
|
@ -92,6 +92,19 @@ TestRegister.addTests([
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "0x with Comma to Ascii",
|
||||
input: "0x74,0x65,0x73,0x74,0x20,0x73,0x74,0x72,0x69,0x6e,0x67",
|
||||
expectedOutput: "test string",
|
||||
recipeConfig: [
|
||||
{
|
||||
"op": "From Hex",
|
||||
"args": [
|
||||
"0x with comma"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
},
|
||||
]);
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
24
tests/operations/tests/ParseObjectIDTimestamp.mjs
Normal file
24
tests/operations/tests/ParseObjectIDTimestamp.mjs
Normal file
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* Parse ObjectID timestamp tests
|
||||
*
|
||||
* @author dmfj [dominic@dmfj.io]
|
||||
*
|
||||
* @copyright Crown Copyright 2018
|
||||
* @license Apache-2.0
|
||||
*/
|
||||
import TestRegister from "../../lib/TestRegister.mjs";
|
||||
|
||||
|
||||
TestRegister.addTests([
|
||||
{
|
||||
name: "Parse ISO timestamp from ObjectId",
|
||||
input: "000000000000000000000000",
|
||||
expectedOutput: "1970-01-01T00:00:00.000Z",
|
||||
recipeConfig: [
|
||||
{
|
||||
op: "Parse ObjectID timestamp",
|
||||
args: [],
|
||||
}
|
||||
],
|
||||
}
|
||||
]);
|
Loading…
Add table
Add a link
Reference in a new issue