Merge branch 'master' into jwt-decode-verify
This commit is contained in:
commit
80997c2d7c
1
.gitignore
vendored
1
.gitignore
vendored
@ -10,6 +10,7 @@ src/core/config/OperationConfig.json
|
|||||||
src/core/operations/index.mjs
|
src/core/operations/index.mjs
|
||||||
src/node/config/OperationConfig.json
|
src/node/config/OperationConfig.json
|
||||||
src/node/index.mjs
|
src/node/index.mjs
|
||||||
|
tests/operations/index.mjs
|
||||||
**/*.DS_Store
|
**/*.DS_Store
|
||||||
tests/browser/output/*
|
tests/browser/output/*
|
||||||
.node-version
|
.node-version
|
||||||
|
|||||||
@ -144,7 +144,8 @@ module.exports = function (grunt) {
|
|||||||
new BundleAnalyzerPlugin({
|
new BundleAnalyzerPlugin({
|
||||||
analyzerMode: "static",
|
analyzerMode: "static",
|
||||||
reportFilename: "BundleAnalyzerReport.html",
|
reportFilename: "BundleAnalyzerReport.html",
|
||||||
openAnalyzer: false
|
openAnalyzer: false,
|
||||||
|
excludeAssets: /.*Worker.js/
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
26
SECURITY.md
26
SECURITY.md
@ -2,25 +2,15 @@
|
|||||||
|
|
||||||
## Supported Versions
|
## Supported Versions
|
||||||
|
|
||||||
CyberChef is supported on a best endeavours basis. Patches will be applied to
|
CyberChef is supported on a best endeavours basis.
|
||||||
the latest version rather than retroactively to older versions. To ensure you
|
Patches will be applied to the latest version rather than retroactively to older versions.
|
||||||
are using the most secure version of CyberChef, please make sure you have the
|
To ensure you are using the most secure version of CyberChef, please make sure you have the [latest release](https://github.com/gchq/CyberChef/releases/latest). [The official website](https://gchq.github.io/CyberChef/) is always up to date.
|
||||||
[latest release](https://github.com/gchq/CyberChef/releases/latest). The
|
|
||||||
official [live demo](https://gchq.github.io/CyberChef/) is always up to date.
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
In most scenarios, the most appropriate way to report a vulnerability is to
|
If you discover a vulnerability in CyberChef, please do not publicly disclose it, and do not create a GitHub issue.
|
||||||
[raise a new issue](https://github.com/gchq/CyberChef/issues/new/choose)
|
|
||||||
describing the problem in as much detail as possible, ideally with examples.
|
|
||||||
This will obviously be public. If you feel that the vulnerability is
|
|
||||||
significant enough to warrant a private disclosure, please email
|
|
||||||
[oss@gchq.gov.uk](mailto:oss@gchq.gov.uk) and
|
|
||||||
[n1474335@gmail.com](mailto:n1474335@gmail.com).
|
|
||||||
|
|
||||||
Disclosures of vulnerabilities in CyberChef are always welcomed. Whilst we aim
|
Instead, send an email as soon as possible to [CyberChefSecurity@gchq.gov.uk](mailto:CyberChefSecurity@gchq.gov.uk).
|
||||||
to write clean and secure code free from bugs, we recognise that this is an open
|
The report will be acknowledged and actioned urgently by the CyberChef maintainers.
|
||||||
source project written by analysts in their spare time, relying on dozens of
|
|
||||||
open source libraries that are modified and updated on a regular basis. We hope
|
If you do not receive a timely acknowledgement, please notify [oss@gchq.gov.uk](mailto:oss@gchq.gov.uk) and [CyberChef@gchq.gov.uk](mailto:CyberChef@gchq.gov.uk) of your vulnerability report.
|
||||||
that the community will continue to support us as we endeavour to maintain and
|
|
||||||
develop this tool together.
|
|
||||||
|
|||||||
6
package-lock.json
generated
6
package-lock.json
generated
@ -16373,9 +16373,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/shell-quote": {
|
"node_modules/shell-quote": {
|
||||||
"version": "1.8.3",
|
"version": "1.8.4",
|
||||||
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
|
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz",
|
||||||
"integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
|
"integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "11.0.0",
|
"version": "11.0.0",
|
||||||
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
|
||||||
"author": "n1474335 <n1474335@gmail.com>",
|
"author": "GCHQ <CyberChef@gchq.gov.uk>",
|
||||||
"homepage": "https://gchq.github.io/CyberChef",
|
"homepage": "https://gchq.github.io/CyberChef",
|
||||||
"copyright": "Crown copyright 2016",
|
"copyright": "Crown copyright 2016",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
|||||||
@ -119,6 +119,7 @@
|
|||||||
"GOST Verify",
|
"GOST Verify",
|
||||||
"GOST Key Wrap",
|
"GOST Key Wrap",
|
||||||
"GOST Key Unwrap",
|
"GOST Key Unwrap",
|
||||||
|
"ROR13",
|
||||||
"ROT13",
|
"ROT13",
|
||||||
"ROT13 Brute Force",
|
"ROT13 Brute Force",
|
||||||
"ROT47",
|
"ROT47",
|
||||||
@ -241,6 +242,7 @@
|
|||||||
"Bit shift right",
|
"Bit shift right",
|
||||||
"Rotate left",
|
"Rotate left",
|
||||||
"Rotate right",
|
"Rotate right",
|
||||||
|
"ROR13",
|
||||||
"ROT13",
|
"ROT13",
|
||||||
"ROT8000"
|
"ROT8000"
|
||||||
]
|
]
|
||||||
|
|||||||
@ -58,3 +58,66 @@ fs.writeFileSync(
|
|||||||
code
|
code
|
||||||
);
|
);
|
||||||
console.log("Written operation index.");
|
console.log("Written operation index.");
|
||||||
|
|
||||||
|
// find all test files
|
||||||
|
const testsDir = path.join(process.cwd() + "/tests/operations/tests/");
|
||||||
|
const testObjs = [];
|
||||||
|
fs.readdirSync(testsDir).forEach(file => {
|
||||||
|
if (!file.endsWith(".mjs")) return;
|
||||||
|
testObjs.push(file.split(".mjs")[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Construct test index file
|
||||||
|
code = `/**
|
||||||
|
* THIS FILE IS AUTOMATICALLY GENERATED BY src/core/config/scripts/generateOpsIndex.mjs
|
||||||
|
*
|
||||||
|
* @author john [john19696@protonmail.com]
|
||||||
|
* @author tlwr [toby@toby.codes]
|
||||||
|
* @author n1474335 [n1474335@gmail.com]
|
||||||
|
* @copyright Crown Copyright ${new Date().getUTCFullYear()}
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import {
|
||||||
|
setLongTestFailure,
|
||||||
|
logTestReport,
|
||||||
|
} from "../lib/utils.mjs";
|
||||||
|
|
||||||
|
import "../lib/wasmFetchPolyfill.mjs";
|
||||||
|
|
||||||
|
import TestRegister from "../lib/TestRegister.mjs";
|
||||||
|
`;
|
||||||
|
|
||||||
|
testObjs.forEach(obj => {
|
||||||
|
if (obj !== "SplitColourChannels")
|
||||||
|
code += `import "./tests/${obj}.mjs";\n`;
|
||||||
|
else
|
||||||
|
code += `// Cannot test operations that use the File type yet
|
||||||
|
// import "./tests/SplitColourChannels.mjs";\n`;
|
||||||
|
});
|
||||||
|
|
||||||
|
code += `
|
||||||
|
|
||||||
|
const testStatus = {
|
||||||
|
allTestsPassing: true,
|
||||||
|
counts: {
|
||||||
|
total: 0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
setLongTestFailure();
|
||||||
|
|
||||||
|
const logOpsTestReport = logTestReport.bind(null, testStatus);
|
||||||
|
|
||||||
|
(async function() {
|
||||||
|
const results = await TestRegister.runTests();
|
||||||
|
logOpsTestReport(results);
|
||||||
|
})();
|
||||||
|
`;
|
||||||
|
|
||||||
|
// Write tests file
|
||||||
|
fs.writeFileSync(
|
||||||
|
path.join(testsDir, "../index.mjs"),
|
||||||
|
code
|
||||||
|
);
|
||||||
|
console.log("Written operation tests index.");
|
||||||
|
|||||||
@ -23,7 +23,7 @@ if (!fs.existsSync(dir)) {
|
|||||||
console.log("Example> node --experimental-modules src/core/config/scripts/newOperation.mjs");
|
console.log("Example> node --experimental-modules src/core/config/scripts/newOperation.mjs");
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
const testDir = path.join(process.cwd() + "/tests/operations/tests/");
|
||||||
const ioTypes = ["string", "byteArray", "number", "html", "ArrayBuffer", "BigNumber", "JSON", "File", "List<File>"];
|
const ioTypes = ["string", "byteArray", "number", "html", "ArrayBuffer", "BigNumber", "JSON", "File", "List<File>"];
|
||||||
|
|
||||||
const schema = {
|
const schema = {
|
||||||
@ -123,6 +123,30 @@ prompt.get(schema, (err, result) => {
|
|||||||
return txt.charAt(0).toUpperCase() + txt.substr(1);
|
return txt.charAt(0).toUpperCase() + txt.substr(1);
|
||||||
}).replace(/[\s-()./]/g, "");
|
}).replace(/[\s-()./]/g, "");
|
||||||
|
|
||||||
|
const testTemplate = `/**
|
||||||
|
* ${moduleName} tests
|
||||||
|
*
|
||||||
|
* @author ${result.authorName} [${result.authorEmail}]
|
||||||
|
* @copyright Crown Copyright ${(new Date()).getFullYear()}
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "${result.opName}: test",
|
||||||
|
input: "Example input",
|
||||||
|
expectedOutput: "Expected output",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "${result.opName}",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
`;
|
||||||
|
|
||||||
const template = `/**
|
const template = `/**
|
||||||
* @author ${result.authorName} [${result.authorEmail}]
|
* @author ${result.authorName} [${result.authorEmail}]
|
||||||
@ -218,13 +242,16 @@ export default ${moduleName};
|
|||||||
}
|
}
|
||||||
fs.writeFileSync(filename, template);
|
fs.writeFileSync(filename, template);
|
||||||
|
|
||||||
|
const testFilename = path.join(testDir, `./${moduleName}.mjs`);
|
||||||
|
fs.writeFileSync(testFilename, testTemplate);
|
||||||
|
|
||||||
console.log(`\nOperation template written to ${colors.green(filename)}`);
|
console.log(`\nOperation template written to ${colors.green(filename)}`);
|
||||||
|
console.log(`\nOperation test template written to ${colors.green(testFilename)}`);
|
||||||
console.log(`\nNext steps:
|
console.log(`\nNext steps:
|
||||||
1. Add your operation to ${colors.green("src/core/config/Categories.json")}
|
1. Add your operation to ${colors.green("src/core/config/Categories.json")}
|
||||||
2. Write your operation code.
|
2. Write your operation code in ${colors.green(filename)}
|
||||||
3. Write tests in ${colors.green("tests/operations/tests/")}
|
3. Write your operation test code in ${colors.green(testFilename)}
|
||||||
4. Run ${colors.cyan("npm run lint")} and ${colors.cyan("npm run test")}
|
4. Run ${colors.cyan("npm run lint")} and ${colors.cyan("npm run test")}
|
||||||
5. Submit a Pull Request to get your operation added to the official CyberChef repository.`);
|
5. Submit a Pull Request to get your operation added to the official CyberChef repository.`);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
83
src/core/operations/ROR13.mjs
Normal file
83
src/core/operations/ROR13.mjs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
* ROR13 Hash operation (Windows API hashing convention)
|
||||||
|
* @author fufu_btw
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation.mjs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements a ROR13 hash used for API name hashing techniques.
|
||||||
|
*/
|
||||||
|
class ROR13 extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "ROR13";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Computes a ROR13 hash used in API hashing techniques.";
|
||||||
|
this.infoURL = "";
|
||||||
|
this.inputType = "byteArray";
|
||||||
|
this.outputType = "string";
|
||||||
|
|
||||||
|
this.args = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rotate right (32-bit)
|
||||||
|
*
|
||||||
|
* @param {number} value - input value
|
||||||
|
* @param {number} bits - rotation bits
|
||||||
|
* @returns {number} rotated value
|
||||||
|
*/
|
||||||
|
ror(value, bits) {
|
||||||
|
return ((value >>> bits) | (value << (32 - bits))) >>> 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute ROR13 hash
|
||||||
|
*
|
||||||
|
* @param {byteArray} input - input bytes
|
||||||
|
* @param {Object[]} args - operation arguments
|
||||||
|
* @returns {string} hex hash
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
let hash = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < input.length; i++) {
|
||||||
|
const chr = input[i] & 0xFF;
|
||||||
|
hash = this.ror(hash, 13);
|
||||||
|
hash = (hash + chr) >>> 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "0x" + hash.toString(16).padStart(8, "0").toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight input
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]}
|
||||||
|
*/
|
||||||
|
highlight(pos, args) {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse highlight
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]}
|
||||||
|
*/
|
||||||
|
highlightReverse(pos, args) {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ROR13;
|
||||||
@ -1,217 +0,0 @@
|
|||||||
/* eslint no-console: 0 */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test Runner
|
|
||||||
*
|
|
||||||
* For running the tests in the test register.
|
|
||||||
*
|
|
||||||
* @author tlwr [toby@toby.codes]
|
|
||||||
* @author n1474335 [n1474335@gmail.com]
|
|
||||||
* @copyright Crown Copyright 2017
|
|
||||||
* @license Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
import "../lib/wasmFetchPolyfill.mjs";
|
|
||||||
import { setLongTestFailure, logTestReport } from "../lib/utils.mjs";
|
|
||||||
|
|
||||||
import TestRegister from "../lib/TestRegister.mjs";
|
|
||||||
import "./tests/A1Z26CipherDecode.mjs";
|
|
||||||
import "./tests/AESKeyWrap.mjs";
|
|
||||||
import "./tests/AnalyseUUID.mjs";
|
|
||||||
import "./tests/AlternatingCaps.mjs";
|
|
||||||
import "./tests/AvroToJSON.mjs";
|
|
||||||
import "./tests/BaconCipher.mjs";
|
|
||||||
import "./tests/Base32.mjs";
|
|
||||||
import "./tests/Base45.mjs";
|
|
||||||
import "./tests/Base58.mjs";
|
|
||||||
import "./tests/Base62.mjs";
|
|
||||||
import "./tests/Base64.mjs";
|
|
||||||
import "./tests/Base85.mjs";
|
|
||||||
import "./tests/Base92.mjs";
|
|
||||||
import "./tests/BCD.mjs";
|
|
||||||
import "./tests/Bech32.mjs";
|
|
||||||
import "./tests/BitwiseOp.mjs";
|
|
||||||
import "./tests/BLAKE2b.mjs";
|
|
||||||
import "./tests/BLAKE2s.mjs";
|
|
||||||
import "./tests/BLAKE3.mjs";
|
|
||||||
import "./tests/Bombe.mjs";
|
|
||||||
import "./tests/BSON.mjs";
|
|
||||||
import "./tests/ByteRepr.mjs";
|
|
||||||
import "./tests/CaesarBoxCipher.mjs";
|
|
||||||
import "./tests/CaretMdecode.mjs";
|
|
||||||
import "./tests/CartesianProduct.mjs";
|
|
||||||
import "./tests/CBORDecode.mjs";
|
|
||||||
import "./tests/CBOREncode.mjs";
|
|
||||||
import "./tests/CetaceanCipherDecode.mjs";
|
|
||||||
import "./tests/CetaceanCipherEncode.mjs";
|
|
||||||
import "./tests/ChaCha.mjs";
|
|
||||||
import "./tests/ChangeIPFormat.mjs";
|
|
||||||
import "./tests/CharEnc.mjs";
|
|
||||||
import "./tests/Charts.mjs";
|
|
||||||
import "./tests/Ciphers.mjs";
|
|
||||||
import "./tests/CipherSaber2.mjs";
|
|
||||||
import "./tests/CMAC.mjs";
|
|
||||||
import "./tests/Code.mjs";
|
|
||||||
import "./tests/Colossus.mjs";
|
|
||||||
import "./tests/Comment.mjs";
|
|
||||||
import "./tests/Compress.mjs";
|
|
||||||
import "./tests/ConditionalJump.mjs";
|
|
||||||
import "./tests/ConvertCoordinateFormat.mjs";
|
|
||||||
import "./tests/ConvertLeetSpeak.mjs";
|
|
||||||
import "./tests/ConvertToNATOAlphabet.mjs";
|
|
||||||
import "./tests/CRCChecksum.mjs";
|
|
||||||
import "./tests/Crypt.mjs";
|
|
||||||
import "./tests/CSV.mjs";
|
|
||||||
import "./tests/DateTime.mjs";
|
|
||||||
import "./tests/DefangIP.mjs";
|
|
||||||
import "./tests/DisassembleARM.mjs";
|
|
||||||
import "./tests/DropNthBytes.mjs";
|
|
||||||
import "./tests/ECDSA.mjs";
|
|
||||||
import "./tests/ELFInfo.mjs";
|
|
||||||
import "./tests/Enigma.mjs";
|
|
||||||
import "./tests/EscapeSmartCharacters.mjs";
|
|
||||||
import "./tests/ExtractAudioMetadata.mjs";
|
|
||||||
import "./tests/ExtractEmailAddresses.mjs";
|
|
||||||
import "./tests/ExtractHashes.mjs";
|
|
||||||
import "./tests/ExtractIPAddresses.mjs";
|
|
||||||
import "./tests/Fernet.mjs";
|
|
||||||
import "./tests/Float.mjs";
|
|
||||||
import "./tests/FileTree.mjs";
|
|
||||||
import "./tests/FletcherChecksum.mjs";
|
|
||||||
import "./tests/Fork.mjs";
|
|
||||||
import "./tests/FromDecimal.mjs";
|
|
||||||
import "./tests/GenerateAllChecksums.mjs";
|
|
||||||
import "./tests/GenerateAllHashes.mjs";
|
|
||||||
import "./tests/GenerateDeBruijnSequence.mjs";
|
|
||||||
import "./tests/GenerateQRCode.mjs";
|
|
||||||
import "./tests/GetAllCasings.mjs";
|
|
||||||
import "./tests/GOST.mjs";
|
|
||||||
import "./tests/Gunzip.mjs";
|
|
||||||
import "./tests/Gzip.mjs";
|
|
||||||
import "./tests/Hash.mjs";
|
|
||||||
import "./tests/HASSH.mjs";
|
|
||||||
import "./tests/HaversineDistance.mjs";
|
|
||||||
import "./tests/Hex.mjs";
|
|
||||||
import "./tests/Hexdump.mjs";
|
|
||||||
import "./tests/HKDF.mjs";
|
|
||||||
import "./tests/Image.mjs";
|
|
||||||
import "./tests/IndexOfCoincidence.mjs";
|
|
||||||
import "./tests/JA3Fingerprint.mjs";
|
|
||||||
import "./tests/JA4.mjs";
|
|
||||||
import "./tests/JA3SFingerprint.mjs";
|
|
||||||
import "./tests/Jsonata.mjs";
|
|
||||||
import "./tests/JSONBeautify.mjs";
|
|
||||||
import "./tests/JSONMinify.mjs";
|
|
||||||
import "./tests/JSONtoCSV.mjs";
|
|
||||||
import "./tests/Jump.mjs";
|
|
||||||
import "./tests/JWK.mjs";
|
|
||||||
import "./tests/JWTDecode.mjs";
|
|
||||||
import "./tests/JWTSign.mjs";
|
|
||||||
import "./tests/JWTVerify.mjs";
|
|
||||||
import "./tests/LevenshteinDistance.mjs";
|
|
||||||
import "./tests/Lorenz.mjs";
|
|
||||||
import "./tests/LS47.mjs";
|
|
||||||
import "./tests/LuhnChecksum.mjs";
|
|
||||||
import "./tests/LZNT1Decompress.mjs";
|
|
||||||
import "./tests/LZString.mjs";
|
|
||||||
import "./tests/Magic.mjs";
|
|
||||||
import "./tests/Media.mjs";
|
|
||||||
import "./tests/MIMEDecoding.mjs";
|
|
||||||
import "./tests/Modhex.mjs";
|
|
||||||
import "./tests/MorseCode.mjs";
|
|
||||||
import "./tests/MS.mjs";
|
|
||||||
import "./tests/MultipleBombe.mjs";
|
|
||||||
import "./tests/MurmurHash3.mjs";
|
|
||||||
import "./tests/NetBIOS.mjs";
|
|
||||||
import "./tests/NormaliseUnicode.mjs";
|
|
||||||
import "./tests/NTLM.mjs";
|
|
||||||
import "./tests/OTP.mjs";
|
|
||||||
import "./tests/ParseEthernetFrame.mjs";
|
|
||||||
import "./tests/ParseIPv4Header.mjs";
|
|
||||||
import "./tests/ParseIPRange.mjs";
|
|
||||||
import "./tests/ParseObjectIDTimestamp.mjs";
|
|
||||||
import "./tests/ParseQRCode.mjs";
|
|
||||||
import "./tests/ParseSSHHostKey.mjs";
|
|
||||||
import "./tests/ParseTCP.mjs";
|
|
||||||
import "./tests/ParseTLSRecord.mjs";
|
|
||||||
import "./tests/ParseTLV.mjs";
|
|
||||||
import "./tests/ParseUDP.mjs";
|
|
||||||
import "./tests/PEMtoHex.mjs";
|
|
||||||
import "./tests/PGP.mjs";
|
|
||||||
import "./tests/PHP.mjs";
|
|
||||||
import "./tests/ParityBit.mjs";
|
|
||||||
import "./tests/PHPSerialize.mjs";
|
|
||||||
import "./tests/PowerSet.mjs";
|
|
||||||
import "./tests/Protobuf.mjs";
|
|
||||||
import "./tests/PubKeyFromCert.mjs";
|
|
||||||
import "./tests/PubKeyFromPrivKey.mjs";
|
|
||||||
import "./tests/Rabbit.mjs";
|
|
||||||
import "./tests/RAKE.mjs";
|
|
||||||
import "./tests/Regex.mjs";
|
|
||||||
import "./tests/Register.mjs";
|
|
||||||
import "./tests/RemoveANSIEscapeCodes.mjs";
|
|
||||||
import "./tests/RegularExpression.mjs";
|
|
||||||
import "./tests/RenderMarkdown.mjs";
|
|
||||||
import "./tests/RisonEncodeDecode.mjs";
|
|
||||||
import "./tests/Rotate.mjs";
|
|
||||||
import "./tests/RSA.mjs";
|
|
||||||
import "./tests/Salsa20.mjs";
|
|
||||||
import "./tests/XSalsa20.mjs";
|
|
||||||
import "./tests/SeqUtils.mjs";
|
|
||||||
import "./tests/SetDifference.mjs";
|
|
||||||
import "./tests/SetIntersection.mjs";
|
|
||||||
import "./tests/SetUnion.mjs";
|
|
||||||
import "./tests/Shuffle.mjs";
|
|
||||||
import "./tests/SIGABA.mjs";
|
|
||||||
import "./tests/SM2.mjs";
|
|
||||||
import "./tests/SM4.mjs";
|
|
||||||
import "./tests/RC6.mjs";
|
|
||||||
// import "./tests/SplitColourChannels.mjs"; // Cannot test operations that use the File type yet
|
|
||||||
import "./tests/SQLBeautify.mjs";
|
|
||||||
import "./tests/StrUtils.mjs";
|
|
||||||
import "./tests/StripIPv4Header.mjs";
|
|
||||||
import "./tests/StripTCPHeader.mjs";
|
|
||||||
import "./tests/StripUDPHeader.mjs";
|
|
||||||
import "./tests/Subsection.mjs";
|
|
||||||
import "./tests/SwapCase.mjs";
|
|
||||||
import "./tests/SymmetricDifference.mjs";
|
|
||||||
import "./tests/TakeNthBytes.mjs";
|
|
||||||
import "./tests/Template.mjs";
|
|
||||||
import "./tests/TextEncodingBruteForce.mjs";
|
|
||||||
import "./tests/TextIntegerConverter.mjs";
|
|
||||||
import "./tests/ToFromInsensitiveRegex.mjs";
|
|
||||||
import "./tests/TranslateDateTimeFormat.mjs";
|
|
||||||
import "./tests/Typex.mjs";
|
|
||||||
import "./tests/UnescapeString.mjs";
|
|
||||||
import "./tests/Unicode.mjs";
|
|
||||||
import "./tests/Wrap.mjs";
|
|
||||||
import "./tests/URLEncodeDecode.mjs";
|
|
||||||
import "./tests/RSA.mjs";
|
|
||||||
import "./tests/CBOREncode.mjs";
|
|
||||||
import "./tests/CBORDecode.mjs";
|
|
||||||
import "./tests/JA3Fingerprint.mjs";
|
|
||||||
import "./tests/JA3SFingerprint.mjs";
|
|
||||||
import "./tests/HASSH.mjs";
|
|
||||||
import "./tests/JSONtoYAML.mjs";
|
|
||||||
|
|
||||||
// Cannot test operations that use the File type yet
|
|
||||||
// import "./tests/SplitColourChannels.mjs";
|
|
||||||
import "./tests/YARA.mjs";
|
|
||||||
import "./tests/ParseCSR.mjs";
|
|
||||||
import "./tests/XXTEA.mjs";
|
|
||||||
|
|
||||||
const testStatus = {
|
|
||||||
allTestsPassing: true,
|
|
||||||
counts: {
|
|
||||||
total: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
setLongTestFailure();
|
|
||||||
|
|
||||||
const logOpsTestReport = logTestReport.bind(null, testStatus);
|
|
||||||
|
|
||||||
(async function () {
|
|
||||||
const results = await TestRegister.runTests();
|
|
||||||
logOpsTestReport(results);
|
|
||||||
})();
|
|
||||||
@ -14,15 +14,18 @@ const validTokenSha256 = "eyJyb2xlIjoic3VwZXJ1c2VyIiwidXNlciI6ImFkbWluIn0.aab3Ew
|
|||||||
const validKey = "mysecretkey";
|
const validKey = "mysecretkey";
|
||||||
const wrongKey = "notTheKey";
|
const wrongKey = "notTheKey";
|
||||||
|
|
||||||
const outputObject = {
|
const outputObject = `{
|
||||||
user: "admin",
|
"role": "superuser",
|
||||||
role: "superuser",
|
"user": "admin"
|
||||||
};
|
}`;
|
||||||
|
|
||||||
const outputVerify = {
|
const outputVerify = `{
|
||||||
valid: true,
|
"valid": true,
|
||||||
payload: outputObject,
|
"payload": {
|
||||||
};
|
"role": "superuser",
|
||||||
|
"user": "admin"
|
||||||
|
}
|
||||||
|
}`;
|
||||||
|
|
||||||
TestRegister.addTests([
|
TestRegister.addTests([
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,7 +12,7 @@ TestRegister.addTests([
|
|||||||
{
|
{
|
||||||
name: "IPv6 Transition: IPv4 to IPv6",
|
name: "IPv6 Transition: IPv4 to IPv6",
|
||||||
input: "198.51.100.7",
|
input: "198.51.100.7",
|
||||||
expectedOutput: "6to4: 2002:c633:6407::/48\nIPv4 Mapped: ::ffff:c633:6407\nIPv4 Translated: ::ffff:0:c633:6407\nNat 64: 64:ff9b::c633:6407",
|
expectedOutput: "6to4: 2002:c633:6407::/48\nIPv4 Mapped: ::ffff:c633:6407\nIPv4 Translated: ::ffff:0:c633:6407\nNat 64: 64:ff9b::c633:6407\n",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
op: "IPv6 Transition Addresses",
|
op: "IPv6 Transition Addresses",
|
||||||
@ -22,7 +22,7 @@ TestRegister.addTests([
|
|||||||
}, {
|
}, {
|
||||||
name: "IPv6 Transition: IPv4 /24 Range to IPv6",
|
name: "IPv6 Transition: IPv4 /24 Range to IPv6",
|
||||||
input: "198.51.100.0/24",
|
input: "198.51.100.0/24",
|
||||||
expectedOutput: "6to4: 2002:c633:6400::/40\nIPv4 Mapped: ::ffff:c633:6400/120\nIPv4 Translated: ::ffff:0:c633:6400/120\nNat 64: 64:ff9b::c633:6400/120",
|
expectedOutput: "6to4: 2002:c633:6400::/40\nIPv4 Mapped: ::ffff:c633:6400/120\nIPv4 Translated: ::ffff:0:c633:6400/120\nNat 64: 64:ff9b::c633:6400/120\n",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
op: "IPv6 Transition Addresses",
|
op: "IPv6 Transition Addresses",
|
||||||
@ -32,7 +32,7 @@ TestRegister.addTests([
|
|||||||
}, {
|
}, {
|
||||||
name: "IPv6 Transition: IPv4 to IPv6 Remove headers",
|
name: "IPv6 Transition: IPv4 to IPv6 Remove headers",
|
||||||
input: "198.51.100.7",
|
input: "198.51.100.7",
|
||||||
expectedOutput: "2002:c633:6407::/48\n::ffff:c633:6407\n::ffff:0:c633:6407\n64:ff9b::c633:6407",
|
expectedOutput: "2002:c633:6407::/48\n::ffff:c633:6407\n::ffff:0:c633:6407\n64:ff9b::c633:6407\n",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
op: "IPv6 Transition Addresses",
|
op: "IPv6 Transition Addresses",
|
||||||
@ -42,7 +42,7 @@ TestRegister.addTests([
|
|||||||
}, {
|
}, {
|
||||||
name: "IPv6 Transition: IPv6 to IPv4",
|
name: "IPv6 Transition: IPv6 to IPv4",
|
||||||
input: "64:ff9b::c633:6407",
|
input: "64:ff9b::c633:6407",
|
||||||
expectedOutput: "IPv4: 198.51.100.7",
|
expectedOutput: "IPv4: 198.51.100.7\n",
|
||||||
recipeConfig: [
|
recipeConfig: [
|
||||||
{
|
{
|
||||||
op: "IPv6 Transition Addresses",
|
op: "IPv6 Transition Addresses",
|
||||||
|
|||||||
@ -51,16 +51,16 @@ const OUT_CRL_PEM_RSA = `Certificate Revocation List (CRL):
|
|||||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||||
X509v3 CRL Distribution Points:
|
X509v3 CRL Distribution Points:
|
||||||
Full Name:
|
Full Name:
|
||||||
URI:http://example.com/full-crl
|
URI:http://example.com/full-crl
|
||||||
Full Name:
|
Full Name:
|
||||||
URI:ldap://example.com/full-crl
|
URI:ldap://example.com/full-crl
|
||||||
Full Name:
|
Full Name:
|
||||||
IP:127.0.0.1
|
IP:127.0.0.1
|
||||||
X509v3 CRL Number:
|
X509v3 CRL Number:
|
||||||
1E3C
|
1E3C
|
||||||
issuerAltName:
|
X509v3 Issuer Alternative Name:
|
||||||
Unsupported CRL extension. Try openssl CLI.
|
|
||||||
Revoked Certificates:
|
Revoked Certificates:
|
||||||
Serial Number: 1000
|
Serial Number: 1000
|
||||||
Revocation Date: Sun, 25 Aug 2024 03:23:08 GMT
|
Revocation Date: Sun, 25 Aug 2024 03:23:08 GMT
|
||||||
@ -143,16 +143,16 @@ const OUT_CRL_PEM_RSA_CRL_REASON_AND_INVALIDITY_DATE = `Certificate Revocation L
|
|||||||
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
DirName:/C=UK/ST=London/O=BB/CN=Test Root CA
|
||||||
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
serial:37:5D:4B:F6:BD:7C:11:7C:CC:46:1A:FF:D7:2F:2C:26:F8:1E:4B:3D
|
||||||
X509v3 CRL Distribution Points:
|
X509v3 CRL Distribution Points:
|
||||||
Full Name:
|
Full Name:
|
||||||
URI:http://example.com/full-crl
|
URI:http://example.com/full-crl
|
||||||
Full Name:
|
Full Name:
|
||||||
URI:ldap://example.com/full-crl
|
URI:ldap://example.com/full-crl
|
||||||
Full Name:
|
Full Name:
|
||||||
IP:127.0.0.1
|
IP:127.0.0.1
|
||||||
X509v3 CRL Number:
|
X509v3 CRL Number:
|
||||||
1E3D
|
1E3D
|
||||||
issuerAltName:
|
X509v3 Issuer Alternative Name:
|
||||||
Unsupported CRL extension. Try openssl CLI.
|
|
||||||
Revoked Certificates:
|
Revoked Certificates:
|
||||||
Serial Number: 1000
|
Serial Number: 1000
|
||||||
Revocation Date: Sun, 25 Aug 2024 12:08:48 GMT
|
Revocation Date: Sun, 25 Aug 2024 12:08:48 GMT
|
||||||
|
|||||||
45
tests/operations/tests/ROR13.mjs
Normal file
45
tests/operations/tests/ROR13.mjs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* ROR13 tests.
|
||||||
|
*
|
||||||
|
* @author fufu_btw [contact@fufu.red]
|
||||||
|
* @copyright Crown Copyright 2026
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "ROR13: AddConsoleAliasW",
|
||||||
|
input: "AddConsoleAliasW",
|
||||||
|
expectedOutput: "0x9916128C",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "ROR13",
|
||||||
|
args: []
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ROR13 Hash: LoadLibraryA",
|
||||||
|
input: "LoadLibraryA",
|
||||||
|
expectedOutput: "0xEC0E4E8E",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "ROR13",
|
||||||
|
args: []
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ROR13 Hash: CloseHandle",
|
||||||
|
input: "CloseHandle",
|
||||||
|
expectedOutput: "0x0FFD97FB",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "ROR13",
|
||||||
|
args: []
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
||||||
Loading…
x
Reference in New Issue
Block a user