mirror of
https://github.com/gchq/CyberChef.git
synced 2025-04-21 15:26:16 -04:00
Merge branch 'master' into render-markdown
This commit is contained in:
commit
82b5e97a2b
73 changed files with 802 additions and 247 deletions
|
@ -12,9 +12,9 @@ script:
|
||||||
- grunt lint
|
- grunt lint
|
||||||
- grunt test
|
- grunt test
|
||||||
- grunt docs
|
- grunt docs
|
||||||
- npm run node-prod
|
|
||||||
- grunt prod --msg="$COMPILE_MSG"
|
- grunt prod --msg="$COMPILE_MSG"
|
||||||
- xvfb-run --server-args="-screen 0 1200x800x24" grunt testui
|
- xvfb-run --server-args="-screen 0 1200x800x24" grunt testui
|
||||||
|
- grunt testnodeconsumer
|
||||||
before_deploy:
|
before_deploy:
|
||||||
- grunt exec:sitemap
|
- grunt exec:sitemap
|
||||||
- grunt copy:ghPages
|
- grunt copy:ghPages
|
||||||
|
@ -34,7 +34,7 @@ deploy:
|
||||||
file_glob: true
|
file_glob: true
|
||||||
file:
|
file:
|
||||||
- build/prod/*.zip
|
- build/prod/*.zip
|
||||||
- build/node/CyberChef.js
|
- src/node/cjs.js
|
||||||
on:
|
on:
|
||||||
repo: gchq/CyberChef
|
repo: gchq/CyberChef
|
||||||
tags: true
|
tags: true
|
||||||
|
|
10
CHANGELOG.md
10
CHANGELOG.md
|
@ -2,6 +2,12 @@
|
||||||
All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master).
|
All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master).
|
||||||
|
|
||||||
|
|
||||||
|
### [9.2.0] - 2019-08-13
|
||||||
|
- 'Defang IP Addresses' operation added [@h345983745] | [#556]
|
||||||
|
|
||||||
|
### [9.1.0] - 2019-08-13
|
||||||
|
- 'Parse SSH Host Key' operation added [@j433866] | [#595]
|
||||||
|
|
||||||
## [9.0.0] - 2019-07-09
|
## [9.0.0] - 2019-07-09
|
||||||
- [Multiple inputs](https://github.com/gchq/CyberChef/wiki/Multiple-Inputs) are now supported in the main web UI, allowing you to upload and process multiple files at once [@j433866] | [#566]
|
- [Multiple inputs](https://github.com/gchq/CyberChef/wiki/Multiple-Inputs) are now supported in the main web UI, allowing you to upload and process multiple files at once [@j433866] | [#566]
|
||||||
- A [Node.js API](https://github.com/gchq/CyberChef/wiki/Node-API) has been implemented, meaning that CyberChef can now be used as a library, either to provide specific operations, or an entire baking environment [@d98762625] | [#291]
|
- A [Node.js API](https://github.com/gchq/CyberChef/wiki/Node-API) has been implemented, meaning that CyberChef can now be used as a library, either to provide specific operations, or an entire baking environment [@d98762625] | [#291]
|
||||||
|
@ -158,6 +164,8 @@ All major and minor version changes will be documented in this file. Details of
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[9.2.0]: https://github.com/gchq/CyberChef/releases/tag/v9.2.0
|
||||||
|
[9.1.0]: https://github.com/gchq/CyberChef/releases/tag/v9.1.0
|
||||||
[9.0.0]: https://github.com/gchq/CyberChef/releases/tag/v9.0.0
|
[9.0.0]: https://github.com/gchq/CyberChef/releases/tag/v9.0.0
|
||||||
[8.38.0]: https://github.com/gchq/CyberChef/releases/tag/v8.38.0
|
[8.38.0]: https://github.com/gchq/CyberChef/releases/tag/v8.38.0
|
||||||
[8.37.0]: https://github.com/gchq/CyberChef/releases/tag/v8.37.0
|
[8.37.0]: https://github.com/gchq/CyberChef/releases/tag/v8.37.0
|
||||||
|
@ -275,7 +283,9 @@ All major and minor version changes will be documented in this file. Details of
|
||||||
[#531]: https://github.com/gchq/CyberChef/pull/531
|
[#531]: https://github.com/gchq/CyberChef/pull/531
|
||||||
[#533]: https://github.com/gchq/CyberChef/pull/533
|
[#533]: https://github.com/gchq/CyberChef/pull/533
|
||||||
[#535]: https://github.com/gchq/CyberChef/pull/535
|
[#535]: https://github.com/gchq/CyberChef/pull/535
|
||||||
|
[#556]: https://github.com/gchq/CyberChef/pull/556
|
||||||
[#566]: https://github.com/gchq/CyberChef/pull/566
|
[#566]: https://github.com/gchq/CyberChef/pull/566
|
||||||
[#571]: https://github.com/gchq/CyberChef/pull/571
|
[#571]: https://github.com/gchq/CyberChef/pull/571
|
||||||
[#585]: https://github.com/gchq/CyberChef/pull/585
|
[#585]: https://github.com/gchq/CyberChef/pull/585
|
||||||
[#591]: https://github.com/gchq/CyberChef/pull/591
|
[#591]: https://github.com/gchq/CyberChef/pull/591
|
||||||
|
[#595]: https://github.com/gchq/CyberChef/pull/595
|
||||||
|
|
91
Gruntfile.js
91
Gruntfile.js
|
@ -3,7 +3,6 @@
|
||||||
const webpack = require("webpack");
|
const webpack = require("webpack");
|
||||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||||
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
|
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
|
||||||
const NodeExternals = require("webpack-node-externals");
|
|
||||||
const glob = require("glob");
|
const glob = require("glob");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
|
|
||||||
|
@ -15,7 +14,6 @@ const path = require("path");
|
||||||
* @license Apache-2.0
|
* @license Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const NODE_PROD = process.env.NODE_ENV === "production";
|
|
||||||
|
|
||||||
module.exports = function (grunt) {
|
module.exports = function (grunt) {
|
||||||
grunt.file.defaultEncoding = "utf8";
|
grunt.file.defaultEncoding = "utf8";
|
||||||
|
@ -36,8 +34,7 @@ module.exports = function (grunt) {
|
||||||
grunt.registerTask("node",
|
grunt.registerTask("node",
|
||||||
"Compiles CyberChef into a single NodeJS module.",
|
"Compiles CyberChef into a single NodeJS module.",
|
||||||
[
|
[
|
||||||
"clean:node", "clean:config", "clean:nodeConfig", "exec:generateConfig",
|
"clean:node", "clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex"
|
||||||
"exec:generateNodeIndex", "webpack:node", "webpack:nodeRepl", "chmod:build"
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
grunt.registerTask("test",
|
grunt.registerTask("test",
|
||||||
|
@ -51,6 +48,10 @@ module.exports = function (grunt) {
|
||||||
"A task which runs all the UI tests in the tests directory. The prod task must already have been run.",
|
"A task which runs all the UI tests in the tests directory. The prod task must already have been run.",
|
||||||
["connect:prod", "exec:browserTests"]);
|
["connect:prod", "exec:browserTests"]);
|
||||||
|
|
||||||
|
grunt.registerTask("testnodeconsumer",
|
||||||
|
"A task which checks whether consuming CJS and ESM apps work with the CyberChef build",
|
||||||
|
["exec:setupNodeConsumers", "exec:testCJSNodeConsumer", "exec:testESMNodeConsumer", "exec:testESMDeepImportNodeConsumer", "exec:teardownNodeConsumers"]);
|
||||||
|
|
||||||
grunt.registerTask("docs",
|
grunt.registerTask("docs",
|
||||||
"Compiles documentation in the /docs directory.",
|
"Compiles documentation in the /docs directory.",
|
||||||
["clean:docs", "jsdoc", "chmod:docs"]);
|
["clean:docs", "jsdoc", "chmod:docs"]);
|
||||||
|
@ -90,7 +91,8 @@ module.exports = function (grunt) {
|
||||||
COMPILE_MSG: JSON.stringify(grunt.option("compile-msg") || grunt.option("msg") || ""),
|
COMPILE_MSG: JSON.stringify(grunt.option("compile-msg") || grunt.option("msg") || ""),
|
||||||
PKG_VERSION: JSON.stringify(pkg.version),
|
PKG_VERSION: JSON.stringify(pkg.version),
|
||||||
},
|
},
|
||||||
moduleEntryPoints = listEntryModules();
|
moduleEntryPoints = listEntryModules(),
|
||||||
|
nodeConsumerTestPath = "~/tmp-cyberchef";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -201,46 +203,6 @@ module.exports = function (grunt) {
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
node: {
|
|
||||||
mode: NODE_PROD ? "production" : "development",
|
|
||||||
target: "node",
|
|
||||||
entry: "./src/node/index.mjs",
|
|
||||||
externals: [NodeExternals({
|
|
||||||
whitelist: ["crypto-api/src/crypto-api"]
|
|
||||||
})],
|
|
||||||
output: {
|
|
||||||
filename: "CyberChef.js",
|
|
||||||
path: __dirname + "/build/node",
|
|
||||||
library: "CyberChef",
|
|
||||||
libraryTarget: "commonjs2"
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
new webpack.DefinePlugin(BUILD_CONSTANTS),
|
|
||||||
new webpack.optimize.LimitChunkCountPlugin({
|
|
||||||
maxChunks: 1
|
|
||||||
})
|
|
||||||
],
|
|
||||||
},
|
|
||||||
nodeRepl: {
|
|
||||||
mode: NODE_PROD ? "production" : "development",
|
|
||||||
target: "node",
|
|
||||||
entry: "./src/node/repl-index.mjs",
|
|
||||||
externals: [NodeExternals({
|
|
||||||
whitelist: ["crypto-api/src/crypto-api"]
|
|
||||||
})],
|
|
||||||
output: {
|
|
||||||
filename: "CyberChef-repl.js",
|
|
||||||
path: __dirname + "/build/node",
|
|
||||||
library: "CyberChef",
|
|
||||||
libraryTarget: "commonjs2"
|
|
||||||
},
|
|
||||||
plugins: [
|
|
||||||
new webpack.DefinePlugin(BUILD_CONSTANTS),
|
|
||||||
new webpack.optimize.LimitChunkCountPlugin({
|
|
||||||
maxChunks: 1
|
|
||||||
})
|
|
||||||
],
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"webpack-dev-server": {
|
"webpack-dev-server": {
|
||||||
options: {
|
options: {
|
||||||
|
@ -428,7 +390,44 @@ module.exports = function (grunt) {
|
||||||
},
|
},
|
||||||
nodeTests: {
|
nodeTests: {
|
||||||
command: "node --experimental-modules --no-warnings --no-deprecation tests/node/index.mjs"
|
command: "node --experimental-modules --no-warnings --no-deprecation tests/node/index.mjs"
|
||||||
}
|
},
|
||||||
|
setupNodeConsumers: {
|
||||||
|
command: [
|
||||||
|
"echo '\n--- Testing node conumers ---'",
|
||||||
|
"npm link",
|
||||||
|
`mkdir ${nodeConsumerTestPath}`,
|
||||||
|
`cp tests/node/consumers/* ${nodeConsumerTestPath}`,
|
||||||
|
`cd ${nodeConsumerTestPath}`,
|
||||||
|
"npm link cyberchef"
|
||||||
|
].join(";"),
|
||||||
|
},
|
||||||
|
teardownNodeConsumers: {
|
||||||
|
command: [
|
||||||
|
`rm -rf ${nodeConsumerTestPath}`,
|
||||||
|
"echo '\n--- Node consumer tests complete ---'"
|
||||||
|
].join(";"),
|
||||||
|
},
|
||||||
|
testCJSNodeConsumer: {
|
||||||
|
command: [
|
||||||
|
`cd ${nodeConsumerTestPath}`,
|
||||||
|
"node --no-warnings cjs-consumer.js",
|
||||||
|
].join(";"),
|
||||||
|
stdout: false,
|
||||||
|
},
|
||||||
|
testESMNodeConsumer: {
|
||||||
|
command: [
|
||||||
|
`cd ${nodeConsumerTestPath}`,
|
||||||
|
"node --no-warnings --experimental-modules esm-consumer.mjs",
|
||||||
|
].join(";"),
|
||||||
|
stdout: false,
|
||||||
|
},
|
||||||
|
testESMDeepImportNodeConsumer: {
|
||||||
|
command: [
|
||||||
|
`cd ${nodeConsumerTestPath}`,
|
||||||
|
"node --no-warnings --experimental-modules esm-deep-import-consumer.mjs",
|
||||||
|
].join(";"),
|
||||||
|
stdout: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -81,6 +81,10 @@ CyberChef is built to support
|
||||||
- Mozilla Firefox 35+
|
- Mozilla Firefox 35+
|
||||||
- Microsoft Edge 14+
|
- Microsoft Edge 14+
|
||||||
|
|
||||||
|
## Node.js support
|
||||||
|
|
||||||
|
CyberChef is built to fully support Node.js `v10` and partially supports `v12`. Named imports using a deep import specifier does not work in `v12`. For more information, see the Node API page in the project [wiki pages](https://github.com/gchq/CyberChef/wiki)
|
||||||
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|
91
package-lock.json
generated
91
package-lock.json
generated
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "9.0.1",
|
"version": "9.0.8",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -3146,15 +3146,6 @@
|
||||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
|
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"catharsis": {
|
|
||||||
"version": "0.8.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz",
|
|
||||||
"integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"lodash": "^4.17.11"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chai-nightwatch": {
|
"chai-nightwatch": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.3.0.tgz",
|
||||||
|
@ -5097,6 +5088,11 @@
|
||||||
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
|
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"esm": {
|
||||||
|
"version": "3.2.25",
|
||||||
|
"resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
|
||||||
|
"integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="
|
||||||
|
},
|
||||||
"esmangle": {
|
"esmangle": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/esmangle/-/esmangle-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/esmangle/-/esmangle-1.0.1.tgz",
|
||||||
|
@ -8524,27 +8520,36 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"jsdoc": {
|
"jsdoc": {
|
||||||
"version": "3.6.2",
|
"version": "3.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz",
|
||||||
"integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==",
|
"integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/parser": "^7.4.4",
|
"@babel/parser": "^7.4.4",
|
||||||
"bluebird": "^3.5.4",
|
"bluebird": "^3.5.4",
|
||||||
"catharsis": "^0.8.10",
|
"catharsis": "^0.8.11",
|
||||||
"escape-string-regexp": "^2.0.0",
|
"escape-string-regexp": "^2.0.0",
|
||||||
"js2xmlparser": "^4.0.0",
|
"js2xmlparser": "^4.0.0",
|
||||||
"klaw": "^3.0.0",
|
"klaw": "^3.0.0",
|
||||||
"markdown-it": "^8.4.2",
|
"markdown-it": "^8.4.2",
|
||||||
"markdown-it-anchor": "^5.0.2",
|
"markdown-it-anchor": "^5.0.2",
|
||||||
"marked": "^0.6.2",
|
"marked": "^0.7.0",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"requizzle": "^0.2.2",
|
"requizzle": "^0.2.3",
|
||||||
"strip-json-comments": "^3.0.1",
|
"strip-json-comments": "^3.0.1",
|
||||||
"taffydb": "2.6.2",
|
"taffydb": "2.6.2",
|
||||||
"underscore": "~1.9.1"
|
"underscore": "~1.9.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"catharsis": {
|
||||||
|
"version": "0.8.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz",
|
||||||
|
"integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lodash": "^4.17.14"
|
||||||
|
}
|
||||||
|
},
|
||||||
"escape-string-regexp": {
|
"escape-string-regexp": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
|
||||||
|
@ -8560,6 +8565,21 @@
|
||||||
"graceful-fs": "^4.1.9"
|
"graceful-fs": "^4.1.9"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"marked": {
|
||||||
|
"version": "0.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz",
|
||||||
|
"integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"requizzle": {
|
||||||
|
"version": "0.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
|
||||||
|
"integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lodash": "^4.17.14"
|
||||||
|
}
|
||||||
|
},
|
||||||
"strip-json-comments": {
|
"strip-json-comments": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
|
||||||
|
@ -8989,9 +9009,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lodash": {
|
"lodash": {
|
||||||
"version": "4.17.11",
|
"version": "4.17.15",
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||||
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
|
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
||||||
},
|
},
|
||||||
"lodash._arraycopy": {
|
"lodash._arraycopy": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
|
@ -9083,9 +9103,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash.defaultsdeep": {
|
"lodash.defaultsdeep": {
|
||||||
"version": "4.6.0",
|
"version": "4.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
|
||||||
"integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=",
|
"integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash.escaperegexp": {
|
"lodash.escaperegexp": {
|
||||||
|
@ -9154,15 +9174,15 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lodash.merge": {
|
"lodash.merge": {
|
||||||
"version": "4.6.1",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
|
||||||
"integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==",
|
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash.mergewith": {
|
"lodash.mergewith": {
|
||||||
"version": "4.6.1",
|
"version": "4.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
|
||||||
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
|
"integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"lodash.once": {
|
"lodash.once": {
|
||||||
|
@ -9304,12 +9324,6 @@
|
||||||
"integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==",
|
"integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"marked": {
|
|
||||||
"version": "0.6.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz",
|
|
||||||
"integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"md5.js": {
|
"md5.js": {
|
||||||
"version": "1.3.5",
|
"version": "1.3.5",
|
||||||
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
|
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
|
||||||
|
@ -11971,15 +11985,6 @@
|
||||||
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
|
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"requizzle": {
|
|
||||||
"version": "0.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz",
|
|
||||||
"integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"lodash": "^4.17.11"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
|
||||||
|
|
13
package.json
13
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "cyberchef",
|
"name": "cyberchef",
|
||||||
"version": "9.0.1",
|
"version": "9.0.8",
|
||||||
"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": "n1474335 <n1474335@gmail.com>",
|
||||||
"homepage": "https://gchq.github.io/CyberChef",
|
"homepage": "https://gchq.github.io/CyberChef",
|
||||||
|
@ -27,7 +27,7 @@
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/gchq/CyberChef/"
|
"url": "https://github.com/gchq/CyberChef/"
|
||||||
},
|
},
|
||||||
"main": "build/node/CyberChef.js",
|
"main": "src/node/cjs.js",
|
||||||
"module": "src/node/index.mjs",
|
"module": "src/node/index.mjs",
|
||||||
"bugs": "https://github.com/gchq/CyberChef/issues",
|
"bugs": "https://github.com/gchq/CyberChef/issues",
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
|
@ -108,6 +108,7 @@
|
||||||
"diff": "^4.0.1",
|
"diff": "^4.0.1",
|
||||||
"es6-promisify": "^6.0.1",
|
"es6-promisify": "^6.0.1",
|
||||||
"escodegen": "^1.11.1",
|
"escodegen": "^1.11.1",
|
||||||
|
"esm": "^3.2.25",
|
||||||
"esmangle": "^1.0.1",
|
"esmangle": "^1.0.1",
|
||||||
"esprima": "^4.0.1",
|
"esprima": "^4.0.1",
|
||||||
"exif-parser": "^0.1.12",
|
"exif-parser": "^0.1.12",
|
||||||
|
@ -126,7 +127,7 @@
|
||||||
"kbpgp": "2.1.2",
|
"kbpgp": "2.1.2",
|
||||||
"libbzip2-wasm": "0.0.4",
|
"libbzip2-wasm": "0.0.4",
|
||||||
"libyara-wasm": "0.0.12",
|
"libyara-wasm": "0.0.12",
|
||||||
"lodash": "^4.17.11",
|
"lodash": "^4.17.15",
|
||||||
"loglevel": "^1.6.3",
|
"loglevel": "^1.6.3",
|
||||||
"loglevel-message-prefix": "^3.0.0",
|
"loglevel-message-prefix": "^3.0.0",
|
||||||
"markdown-it": "^9.0.0",
|
"markdown-it": "^9.0.0",
|
||||||
|
@ -157,11 +158,9 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "grunt dev",
|
"start": "grunt dev",
|
||||||
"build": "grunt prod",
|
"build": "grunt prod",
|
||||||
"node": "NODE_ENV=development grunt node",
|
"repl": "node src/node/repl.js",
|
||||||
"node-prod": "NODE_ENV=production grunt node",
|
|
||||||
"repl": "grunt node && node build/node/CyberChef-repl.js",
|
|
||||||
"test": "grunt test",
|
"test": "grunt test",
|
||||||
"test-node": "grunt test-node",
|
"test-node-consumer": "grunt testnodeconsumer",
|
||||||
"testui": "grunt testui",
|
"testui": "grunt testui",
|
||||||
"docs": "grunt docs",
|
"docs": "grunt docs",
|
||||||
"lint": "grunt lint",
|
"lint": "grunt lint",
|
||||||
|
|
|
@ -235,6 +235,10 @@ class Dish {
|
||||||
case Dish.JSON:
|
case Dish.JSON:
|
||||||
title = "application/json";
|
title = "application/json";
|
||||||
break;
|
break;
|
||||||
|
case Dish.NUMBER:
|
||||||
|
case Dish.BIG_NUMBER:
|
||||||
|
title = this.value.toString();
|
||||||
|
break;
|
||||||
case Dish.ARRAY_BUFFER:
|
case Dish.ARRAY_BUFFER:
|
||||||
case Dish.BYTE_ARRAY:
|
case Dish.BYTE_ARRAY:
|
||||||
title = this.detectDishType();
|
title = this.detectDishType();
|
||||||
|
@ -283,7 +287,21 @@ class Dish {
|
||||||
case Dish.ARRAY_BUFFER:
|
case Dish.ARRAY_BUFFER:
|
||||||
return this.value instanceof ArrayBuffer;
|
return this.value instanceof ArrayBuffer;
|
||||||
case Dish.BIG_NUMBER:
|
case Dish.BIG_NUMBER:
|
||||||
return BigNumber.isBigNumber(this.value);
|
if (BigNumber.isBigNumber(this.value)) return true;
|
||||||
|
/*
|
||||||
|
If a BigNumber is passed between WebWorkers it is serialised as a JSON
|
||||||
|
object with a coefficient (c), exponent (e) and sign (s). We detect this
|
||||||
|
and reinitialise it as a BigNumber object.
|
||||||
|
*/
|
||||||
|
if (Object.keys(this.value).sort().equals(["c", "e", "s"])) {
|
||||||
|
const temp = new BigNumber();
|
||||||
|
temp.c = this.value.c;
|
||||||
|
temp.e = this.value.e;
|
||||||
|
temp.s = this.value.s;
|
||||||
|
this.value = temp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
case Dish.JSON:
|
case Dish.JSON:
|
||||||
// All values can be serialised in some manner, so we return true in all cases
|
// All values can be serialised in some manner, so we return true in all cases
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -122,7 +122,8 @@
|
||||||
"PGP Encrypt",
|
"PGP Encrypt",
|
||||||
"PGP Decrypt",
|
"PGP Decrypt",
|
||||||
"PGP Encrypt and Sign",
|
"PGP Encrypt and Sign",
|
||||||
"PGP Decrypt and Verify"
|
"PGP Decrypt and Verify",
|
||||||
|
"Parse SSH Host Key"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -166,6 +167,7 @@
|
||||||
"Parse IP range",
|
"Parse IP range",
|
||||||
"Parse IPv6 address",
|
"Parse IPv6 address",
|
||||||
"Parse IPv4 header",
|
"Parse IPv4 header",
|
||||||
|
"Parse SSH Host Key",
|
||||||
"Parse URI",
|
"Parse URI",
|
||||||
"URL Encode",
|
"URL Encode",
|
||||||
"URL Decode",
|
"URL Decode",
|
||||||
|
@ -177,7 +179,8 @@
|
||||||
"Group IP addresses",
|
"Group IP addresses",
|
||||||
"Encode NetBIOS Name",
|
"Encode NetBIOS Name",
|
||||||
"Decode NetBIOS Name",
|
"Decode NetBIOS Name",
|
||||||
"Defang URL"
|
"Defang URL",
|
||||||
|
"Defang IP Addresses"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,7 +63,7 @@ export function toBase64(data, alphabet="A-Za-z0-9+/=") {
|
||||||
/**
|
/**
|
||||||
* UnBase64's the input string using the given alphabet, returning a byte array.
|
* UnBase64's the input string using the given alphabet, returning a byte array.
|
||||||
*
|
*
|
||||||
* @param {byteArray} data
|
* @param {string} data
|
||||||
* @param {string} [alphabet="A-Za-z0-9+/="]
|
* @param {string} [alphabet="A-Za-z0-9+/="]
|
||||||
* @param {string} [returnType="string"] - Either "string" or "byteArray"
|
* @param {string} [returnType="string"] - Either "string" or "byteArray"
|
||||||
* @param {boolean} [removeNonAlphChars=true]
|
* @param {boolean} [removeNonAlphChars=true]
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
/**
|
/**
|
||||||
* Runs bitwise operations across the input data.
|
* Runs bitwise operations across the input data.
|
||||||
*
|
*
|
||||||
* @param {byteArray} input
|
* @param {byteArray|Uint8Array} input
|
||||||
* @param {byteArray} key
|
* @param {byteArray} key
|
||||||
* @param {function} func - The bitwise calculation to carry out
|
* @param {function} func - The bitwise calculation to carry out
|
||||||
* @param {boolean} nullPreserving
|
* @param {boolean} nullPreserving
|
||||||
|
|
|
@ -16,14 +16,14 @@ class Protobuf {
|
||||||
/**
|
/**
|
||||||
* Protobuf constructor
|
* Protobuf constructor
|
||||||
*
|
*
|
||||||
* @param {byteArray} data
|
* @param {byteArray|Uint8Array} data
|
||||||
*/
|
*/
|
||||||
constructor(data) {
|
constructor(data) {
|
||||||
// Check we have a byteArray
|
// Check we have a byteArray or Uint8Array
|
||||||
if (data instanceof Array) {
|
if (data instanceof Array || data instanceof Uint8Array) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
} else {
|
} else {
|
||||||
throw new Error("Protobuf input must be a byteArray");
|
throw new Error("Protobuf input must be a byteArray or Uint8Array");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up masks
|
// Set up masks
|
||||||
|
@ -205,7 +205,7 @@ class Protobuf {
|
||||||
(this.data[this.offset] & this.VALUE) << shift :
|
(this.data[this.offset] & this.VALUE) << shift :
|
||||||
(this.data[this.offset] & this.VALUE) * Math.pow(2, shift);
|
(this.data[this.offset] & this.VALUE) * Math.pow(2, shift);
|
||||||
shift += 7;
|
shift += 7;
|
||||||
} while ((this.data[this.offset++] & this.MSD) === this.MSB);
|
} while ((this.data[this.offset++] & this.MSB) === this.MSB);
|
||||||
return fieldNumber;
|
return fieldNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ export default class TLVParser {
|
||||||
/**
|
/**
|
||||||
* TLVParser constructor
|
* TLVParser constructor
|
||||||
*
|
*
|
||||||
* @param {byteArray} input
|
* @param {byteArray|Uint8Array} input
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
*/
|
*/
|
||||||
constructor(input, options) {
|
constructor(input, options) {
|
||||||
|
|
|
@ -91,7 +91,7 @@ The following algorithms will be used based on the size of the key:
|
||||||
|
|
||||||
const decipher = forge.cipher.createDecipher("AES-" + mode, key);
|
const decipher = forge.cipher.createDecipher("AES-" + mode, key);
|
||||||
decipher.start({
|
decipher.start({
|
||||||
iv: iv,
|
iv: iv.length === 0 ? "" : iv,
|
||||||
tag: gcmTag
|
tag: gcmTag
|
||||||
});
|
});
|
||||||
decipher.update(forge.util.createBuffer(input));
|
decipher.update(forge.util.createBuffer(input));
|
||||||
|
|
|
@ -22,13 +22,13 @@ class Adler32Checksum extends Operation {
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).<br><br>Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32.";
|
this.description = "Adler-32 is a checksum algorithm which was invented by Mark Adler in 1995, and is a modification of the Fletcher checksum. Compared to a cyclic redundancy check of the same length, it trades reliability for speed (preferring the latter).<br><br>Adler-32 is more reliable than Fletcher-16, and slightly less reliable than Fletcher-32.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Adler-32";
|
this.infoURL = "https://wikipedia.org/wiki/Adler-32";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
|
@ -36,6 +36,7 @@ class Adler32Checksum extends Operation {
|
||||||
const MOD_ADLER = 65521;
|
const MOD_ADLER = 65521;
|
||||||
let a = 1,
|
let a = 1,
|
||||||
b = 0;
|
b = 0;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
a += input[i];
|
a += input[i];
|
||||||
|
|
|
@ -21,8 +21,8 @@ class BitShiftLeft extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Shifts the bits in each byte towards the left by the specified amount.";
|
this.description = "Shifts the bits in each byte towards the left by the specified amount.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts";
|
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "ArrayBuffer";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
"name": "Amount",
|
"name": "Amount",
|
||||||
|
@ -33,16 +33,17 @@ class BitShiftLeft extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {ArrayBuffer}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const amount = args[0];
|
const amount = args[0];
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
return input.map(b => {
|
return input.map(b => {
|
||||||
return (b << amount) & 0xff;
|
return (b << amount) & 0xff;
|
||||||
});
|
}).buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -21,8 +21,8 @@ class BitShiftRight extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Shifts the bits in each byte towards the right by the specified amount.<br><br><i>Logical shifts</i> replace the leftmost bits with zeros.<br><i>Arithmetic shifts</i> preserve the most significant bit (MSB) of the original byte keeping the sign the same (positive or negative).";
|
this.description = "Shifts the bits in each byte towards the right by the specified amount.<br><br><i>Logical shifts</i> replace the leftmost bits with zeros.<br><i>Arithmetic shifts</i> preserve the most significant bit (MSB) of the original byte keeping the sign the same (positive or negative).";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts";
|
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#Bit_shifts";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "ArrayBuffer";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
"name": "Amount",
|
"name": "Amount",
|
||||||
|
@ -38,18 +38,19 @@ class BitShiftRight extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {ArrayBuffer}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const amount = args[0],
|
const amount = args[0],
|
||||||
type = args[1],
|
type = args[1],
|
||||||
mask = type === "Logical shift" ? 0 : 0x80;
|
mask = type === "Logical shift" ? 0 : 0x80;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
return input.map(b => {
|
return input.map(b => {
|
||||||
return (b >>> amount) ^ (b & mask);
|
return (b >>> amount) ^ (b & mask);
|
||||||
});
|
}).buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,17 +23,18 @@ class CitrixCTX1Decode extends Operation {
|
||||||
this.module = "Encodings";
|
this.module = "Encodings";
|
||||||
this.description = "Decodes strings in a Citrix CTX1 password format to plaintext.";
|
this.description = "Decodes strings in a Citrix CTX1 password format to plaintext.";
|
||||||
this.infoURL = "https://www.reddit.com/r/AskNetsec/comments/1s3r6y/citrix_ctx1_hash_decoding/";
|
this.infoURL = "https://www.reddit.com/r/AskNetsec/comments/1s3r6y/citrix_ctx1_hash_decoding/";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
if (input.length % 4 !== 0) {
|
if (input.length % 4 !== 0) {
|
||||||
throw new OperationError("Incorrect hash length");
|
throw new OperationError("Incorrect hash length");
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ class DecodeText extends Operation {
|
||||||
"</ul>",
|
"</ul>",
|
||||||
].join("\n");
|
].join("\n");
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Character_encoding";
|
this.infoURL = "https://wikipedia.org/wiki/Character_encoding";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -42,13 +42,13 @@ class DecodeText extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const format = IO_FORMAT[args[0]];
|
const format = IO_FORMAT[args[0]];
|
||||||
return cptable.utils.decode(format, input);
|
return cptable.utils.decode(format, new Uint8Array(input));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
61
src/core/operations/DefangIPAddresses.mjs
Normal file
61
src/core/operations/DefangIPAddresses.mjs
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/**
|
||||||
|
* @author h345983745
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defang IP Addresses operation
|
||||||
|
*/
|
||||||
|
class DefangIPAddresses extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefangIPAddresses constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "Defang IP Addresses";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Takes a IPv4 or IPv6 address and 'Defangs' it, meaning the IP becomes invalid, removing the risk of accidentally utilising it as an IP address.";
|
||||||
|
this.infoURL = "https://isc.sans.edu/forums/diary/Defang+all+the+things/22744/";
|
||||||
|
this.inputType = "string";
|
||||||
|
this.outputType = "string";
|
||||||
|
this.args = [];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
input = input.replace(IPV4_REGEX, x => {
|
||||||
|
return x.replace(/\./g, "[.]");
|
||||||
|
});
|
||||||
|
|
||||||
|
input = input.replace(IPV6_REGEX, x => {
|
||||||
|
return x.replace(/:/g, "[:]");
|
||||||
|
});
|
||||||
|
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DefangIPAddresses;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IPV4 regular expression
|
||||||
|
*/
|
||||||
|
const IPV4_REGEX = new RegExp("(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d|\\d)(?:\\/\\d{1,2})?", "g");
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IPV6 regular expression
|
||||||
|
*/
|
||||||
|
const IPV6_REGEX = new RegExp("((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,4}:(:|\\b)|){5}|([\\dA-Fa-f]{1,4}:){6})((([\\dA-Fa-f]{1,4}((?!\\3)::|:\\b|(?![\\dA-Fa-f])))|(?!\\2\\3)){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})", "g");
|
|
@ -31,7 +31,7 @@ class EncodeText extends Operation {
|
||||||
].join("\n");
|
].join("\n");
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Character_encoding";
|
this.infoURL = "https://wikipedia.org/wiki/Character_encoding";
|
||||||
this.inputType = "string";
|
this.inputType = "string";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "ArrayBuffer";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
"name": "Encoding",
|
"name": "Encoding",
|
||||||
|
@ -44,13 +44,12 @@ class EncodeText extends Operation {
|
||||||
/**
|
/**
|
||||||
* @param {string} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {ArrayBuffer}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const format = IO_FORMAT[args[0]];
|
const format = IO_FORMAT[args[0]];
|
||||||
let encoded = cptable.utils.encode(format, input);
|
const encoded = cptable.utils.encode(format, input);
|
||||||
encoded = Array.from(encoded);
|
return new Uint8Array(encoded).buffer;
|
||||||
return encoded;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,19 +22,20 @@ class Fletcher16Checksum extends Operation {
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-16";
|
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-16";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
let a = 0,
|
let a = 0,
|
||||||
b = 0;
|
b = 0;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
a = (a + input[i]) % 0xff;
|
a = (a + input[i]) % 0xff;
|
||||||
|
|
|
@ -22,19 +22,20 @@ class Fletcher32Checksum extends Operation {
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-32";
|
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-32";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
let a = 0,
|
let a = 0,
|
||||||
b = 0;
|
b = 0;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
a = (a + input[i]) % 0xffff;
|
a = (a + input[i]) % 0xffff;
|
||||||
|
|
|
@ -22,19 +22,20 @@ class Fletcher64Checksum extends Operation {
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-64";
|
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum#Fletcher-64";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
let a = 0,
|
let a = 0,
|
||||||
b = 0;
|
b = 0;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
a = (a + input[i]) % 0xffffffff;
|
a = (a + input[i]) % 0xffffffff;
|
||||||
|
|
|
@ -22,19 +22,20 @@ class Fletcher8Checksum extends Operation {
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
this.description = "The Fletcher checksum is an algorithm for computing a position-dependent checksum devised by John Gould Fletcher at Lawrence Livermore Labs in the late 1970s.<br><br>The objective of the Fletcher checksum was to provide error-detection properties approaching those of a cyclic redundancy check but with the lower computational effort associated with summation techniques.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum";
|
this.infoURL = "https://wikipedia.org/wiki/Fletcher%27s_checksum";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
let a = 0,
|
let a = 0,
|
||||||
b = 0;
|
b = 0;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
a = (a + input[i]) % 0xf;
|
a = (a + input[i]) % 0xf;
|
||||||
|
|
|
@ -106,9 +106,9 @@ class FromBase64 extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ArrayBuffer} input
|
* @param {string} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const [alphabet, removeNonAlphChars] = args;
|
const [alphabet, removeNonAlphChars] = args;
|
||||||
|
|
|
@ -23,7 +23,7 @@ class GenerateHOTP extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "The HMAC-based One-Time Password algorithm (HOTP) is an algorithm that computes a one-time password from a shared secret key and an incrementing counter. It has been adopted as Internet Engineering Task Force standard RFC 4226, is the cornerstone of Initiative For Open Authentication (OATH), and is used in a number of two-factor authentication systems.<br><br>Enter the secret as the input or leave it blank for a random secret to be generated.";
|
this.description = "The HMAC-based One-Time Password algorithm (HOTP) is an algorithm that computes a one-time password from a shared secret key and an incrementing counter. It has been adopted as Internet Engineering Task Force standard RFC 4226, is the cornerstone of Initiative For Open Authentication (OATH), and is used in a number of two-factor authentication systems.<br><br>Enter the secret as the input or leave it blank for a random secret to be generated.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm";
|
this.infoURL = "https://wikipedia.org/wiki/HMAC-based_One-time_Password_algorithm";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ class GenerateHOTP extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -23,7 +23,7 @@ class GenerateTOTP extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "The Time-based One-Time Password algorithm (TOTP) is an algorithm that computes a one-time password from a shared secret key and the current time. It has been adopted as Internet Engineering Task Force standard RFC 6238, is the cornerstone of Initiative For Open Authentication (OATH), and is used in a number of two-factor authentication systems. A TOTP is an HOTP where the counter is the current time.<br><br>Enter the secret as the input or leave it blank for a random secret to be generated. T0 and T1 are in seconds.";
|
this.description = "The Time-based One-Time Password algorithm (TOTP) is an algorithm that computes a one-time password from a shared secret key and the current time. It has been adopted as Internet Engineering Task Force standard RFC 6238, is the cornerstone of Initiative For Open Authentication (OATH), and is used in a number of two-factor authentication systems. A TOTP is an HOTP where the counter is the current time.<br><br>Enter the secret as the input or leave it blank for a random secret to be generated. T0 and T1 are in seconds.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Time-based_One-time_Password_algorithm";
|
this.infoURL = "https://wikipedia.org/wiki/Time-based_One-time_Password_algorithm";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -55,7 +55,7 @@ class GenerateTOTP extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,17 +22,18 @@ class NOT extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Returns the inverse of each byte.";
|
this.description = "Returns the inverse of each byte.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#NOT";
|
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#NOT";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "byteArray";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
return bitOp(input, null, not);
|
return bitOp(input, null, not);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ class OR extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "OR the input with the given key.<br>e.g. <code>fe023da5</code>";
|
this.description = "OR the input with the given key.<br>e.g. <code>fe023da5</code>";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#OR";
|
this.infoURL = "https://wikipedia.org/wiki/Bitwise_operation#OR";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "byteArray";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -36,12 +36,13 @@ class OR extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const key = Utils.convertToByteArray(args[0].string || "", args[0].option);
|
const key = Utils.convertToByteArray(args[0].string || "", args[0].option);
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
return bitOp(input, key, or);
|
return bitOp(input, key, or);
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,7 +113,7 @@ CMYK: ${cmyk}
|
||||||
}).on('colorpickerChange', function(e) {
|
}).on('colorpickerChange', function(e) {
|
||||||
var color = e.color.string('rgba');
|
var color = e.color.string('rgba');
|
||||||
document.getElementById('input-text').value = color;
|
document.getElementById('input-text').value = color;
|
||||||
window.app.autoBake();
|
window.app.manager.input.debounceInputChange(new Event("keyup"));
|
||||||
});
|
});
|
||||||
</script>`;
|
</script>`;
|
||||||
}
|
}
|
||||||
|
|
150
src/core/operations/ParseSSHHostKey.mjs
Normal file
150
src/core/operations/ParseSSHHostKey.mjs
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
/**
|
||||||
|
* @author j433866 [j433866@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation";
|
||||||
|
import OperationError from "../errors/OperationError";
|
||||||
|
import Utils from "../Utils";
|
||||||
|
import { fromBase64 } from "../lib/Base64";
|
||||||
|
import { fromHex, toHexFast } from "../lib/Hex";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse SSH Host Key operation
|
||||||
|
*/
|
||||||
|
class ParseSSHHostKey extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ParseSSHHostKey constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "Parse SSH Host Key";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Parses a SSH host key and extracts fields from it.<br>The key type can be:<ul><li>ssh-rsa</li><li>ssh-dss</li><li>ecdsa-sha2</li></ul>The key format can be either Hex or Base64.";
|
||||||
|
this.infoURL = "https://wikipedia.org/wiki/Secure_Shell";
|
||||||
|
this.inputType = "string";
|
||||||
|
this.outputType = "string";
|
||||||
|
this.args = [
|
||||||
|
{
|
||||||
|
name: "Input Format",
|
||||||
|
type: "option",
|
||||||
|
value: [
|
||||||
|
"Auto",
|
||||||
|
"Base64",
|
||||||
|
"Hex"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
const [inputFormat] = args,
|
||||||
|
inputKey = this.convertKeyToBinary(input.trim(), inputFormat),
|
||||||
|
fields = this.parseKey(inputKey),
|
||||||
|
keyType = Utils.byteArrayToChars(fromHex(fields[0]), "");
|
||||||
|
|
||||||
|
let output = `Key type: ${keyType}`;
|
||||||
|
|
||||||
|
if (keyType === "ssh-rsa") {
|
||||||
|
output += `\nExponent: 0x${fields[1]}`;
|
||||||
|
output += `\nModulus: 0x${fields[2]}`;
|
||||||
|
} else if (keyType === "ssh-dss") {
|
||||||
|
output += `\np: 0x${fields[1]}`;
|
||||||
|
output += `\nq: 0x${fields[2]}`;
|
||||||
|
output += `\ng: 0x${fields[3]}`;
|
||||||
|
output += `\ny: 0x${fields[4]}`;
|
||||||
|
} else if (keyType.startsWith("ecdsa-sha2")) {
|
||||||
|
output += `\nCurve: ${Utils.byteArrayToChars(fromHex(fields[1]))}`;
|
||||||
|
output += `\nPoint: 0x${fields.slice(2)}`;
|
||||||
|
} else {
|
||||||
|
output += "\nUnsupported key type.";
|
||||||
|
output += `\nParameters: ${fields.slice(1)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the key to binary format from either hex or base64
|
||||||
|
*
|
||||||
|
* @param {string} inputKey
|
||||||
|
* @param {string} inputFormat
|
||||||
|
* @returns {byteArray}
|
||||||
|
*/
|
||||||
|
convertKeyToBinary(inputKey, inputFormat) {
|
||||||
|
const keyPattern = new RegExp(/^(?:[ssh]|[ecdsa-sha2])\S+\s+(\S*)/),
|
||||||
|
keyMatch = inputKey.match(keyPattern);
|
||||||
|
|
||||||
|
if (keyMatch) {
|
||||||
|
inputKey = keyMatch[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputFormat === "Auto") {
|
||||||
|
inputFormat = this.detectKeyFormat(inputKey);
|
||||||
|
}
|
||||||
|
if (inputFormat === "Hex") {
|
||||||
|
return fromHex(inputKey);
|
||||||
|
} else if (inputFormat === "Base64") {
|
||||||
|
return fromBase64(inputKey, null, "byteArray");
|
||||||
|
} else {
|
||||||
|
throw new OperationError("Invalid input format.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects if the key is base64 or hex encoded
|
||||||
|
*
|
||||||
|
* @param {string} inputKey
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
detectKeyFormat(inputKey) {
|
||||||
|
const hexPattern = new RegExp(/^(?:[\dA-Fa-f]{2}[ ,;:]?)+$/);
|
||||||
|
const b64Pattern = new RegExp(/^\s*(?:[A-Za-z\d+/]{4})+(?:[A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?\s*$/);
|
||||||
|
|
||||||
|
if (hexPattern.test(inputKey)) {
|
||||||
|
return "Hex";
|
||||||
|
} else if (b64Pattern.test(inputKey)) {
|
||||||
|
return "Base64";
|
||||||
|
} else {
|
||||||
|
throw new OperationError("Unable to detect input key format.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses fields from the key
|
||||||
|
*
|
||||||
|
* @param {byteArray} key
|
||||||
|
*/
|
||||||
|
parseKey(key) {
|
||||||
|
const fields = [];
|
||||||
|
while (key.length > 0) {
|
||||||
|
const lengthField = key.slice(0, 4);
|
||||||
|
let decodedLength = 0;
|
||||||
|
for (let i = 0; i < lengthField.length; i++) {
|
||||||
|
decodedLength += lengthField[i];
|
||||||
|
decodedLength = decodedLength << 8;
|
||||||
|
}
|
||||||
|
decodedLength = decodedLength >> 8;
|
||||||
|
// Break if length wasn't decoded correctly
|
||||||
|
if (decodedLength <= 0) break;
|
||||||
|
|
||||||
|
fields.push(toHexFast(key.slice(4, 4 + decodedLength)));
|
||||||
|
key = key.slice(4 + decodedLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ParseSSHHostKey;
|
|
@ -24,7 +24,7 @@ class ParseTLV extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Converts a Type-Length-Value (TLV) encoded string into a JSON object. Can optionally include a <code>Key</code> / <code>Type</code> entry. <br><br>Tags: Key-Length-Value, KLV, Length-Value, LV";
|
this.description = "Converts a Type-Length-Value (TLV) encoded string into a JSON object. Can optionally include a <code>Key</code> / <code>Type</code> entry. <br><br>Tags: Key-Length-Value, KLV, Length-Value, LV";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Type-length-value";
|
this.infoURL = "https://wikipedia.org/wiki/Type-length-value";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "JSON";
|
this.outputType = "JSON";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -46,12 +46,13 @@ class ParseTLV extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
const [bytesInKey, bytesInLength, basicEncodingRules] = args;
|
const [bytesInKey, bytesInLength, basicEncodingRules] = args;
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
if (bytesInKey <= 0 && bytesInLength <= 0)
|
if (bytesInKey <= 0 && bytesInLength <= 0)
|
||||||
throw new OperationError("Type or Length size must be greater than 0");
|
throw new OperationError("Type or Length size must be greater than 0");
|
||||||
|
|
|
@ -23,17 +23,18 @@ class ProtobufDecode extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Decodes any Protobuf encoded data to a JSON representation of the data using the field number as the field key.";
|
this.description = "Decodes any Protobuf encoded data to a JSON representation of the data using the field number as the field key.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Protocol_Buffers";
|
this.infoURL = "https://wikipedia.org/wiki/Protocol_Buffers";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "JSON";
|
this.outputType = "JSON";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {JSON}
|
* @returns {JSON}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
try {
|
try {
|
||||||
return Protobuf.decode(input);
|
return Protobuf.decode(input);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
@ -27,17 +27,18 @@ class RemoveEXIF extends Operation {
|
||||||
"EXIF data embedded in photos usually contains information about the image file itself as well as the device used to create it.",
|
"EXIF data embedded in photos usually contains information about the image file itself as well as the device used to create it.",
|
||||||
].join("\n");
|
].join("\n");
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Exif";
|
this.infoURL = "https://wikipedia.org/wiki/Exif";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "byteArray";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
// Do nothing if input is empty
|
// Do nothing if input is empty
|
||||||
if (input.length === 0) return input;
|
if (input.length === 0) return input;
|
||||||
|
|
||||||
|
|
|
@ -20,17 +20,18 @@ class RemoveNullBytes extends Operation {
|
||||||
this.name = "Remove null bytes";
|
this.name = "Remove null bytes";
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Removes all null bytes (<code>0x00</code>) from the input.";
|
this.description = "Removes all null bytes (<code>0x00</code>) from the input.";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "byteArray";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const output = [];
|
const output = [];
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
if (input[i] !== 0) output.push(input[i]);
|
if (input[i] !== 0) output.push(input[i]);
|
||||||
|
|
|
@ -26,18 +26,19 @@ class SplitColourChannels extends Operation {
|
||||||
this.module = "Image";
|
this.module = "Image";
|
||||||
this.description = "Splits the given image into its red, green and blue colour channels.";
|
this.description = "Splits the given image into its red, green and blue colour channels.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Channel_(digital_image)";
|
this.infoURL = "https://wikipedia.org/wiki/Channel_(digital_image)";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "List<File>";
|
this.outputType = "List<File>";
|
||||||
this.presentType = "html";
|
this.presentType = "html";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {List<File>}
|
* @returns {List<File>}
|
||||||
*/
|
*/
|
||||||
async run(input, args) {
|
async run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
// Make sure that the input is an image
|
// Make sure that the input is an image
|
||||||
if (!isImage(input)) throw new OperationError("Invalid file type.");
|
if (!isImage(input)) throw new OperationError("Invalid file type.");
|
||||||
|
|
||||||
|
|
|
@ -22,17 +22,18 @@ class TCPIPChecksum extends Operation {
|
||||||
this.module = "Crypto";
|
this.module = "Crypto";
|
||||||
this.description = "Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes.";
|
this.description = "Calculates the checksum for a TCP (Transport Control Protocol) or IP (Internet Protocol) header from an input of raw bytes.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/IPv4_header_checksum";
|
this.infoURL = "https://wikipedia.org/wiki/IPv4_header_checksum";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
let csum = 0;
|
let csum = 0;
|
||||||
|
|
||||||
for (let i = 0; i < input.length; i++) {
|
for (let i = 0; i < input.length; i++) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ class Tar extends Operation {
|
||||||
this.module = "Compression";
|
this.module = "Compression";
|
||||||
this.description = "Packs the input into a tarball.<br><br>No support for multiple files at this time.";
|
this.description = "Packs the input into a tarball.<br><br>No support for multiple files at this time.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Tar_(computing)";
|
this.infoURL = "https://wikipedia.org/wiki/Tar_(computing)";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "File";
|
this.outputType = "File";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -34,11 +34,13 @@ class Tar extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
const Tarball = function() {
|
const Tarball = function() {
|
||||||
this.bytes = new Array(512);
|
this.bytes = new Array(512);
|
||||||
this.position = 0;
|
this.position = 0;
|
||||||
|
|
|
@ -22,7 +22,7 @@ class ToBase32 extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7.";
|
this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Base32";
|
this.infoURL = "https://wikipedia.org/wiki/Base32";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -34,12 +34,13 @@ class ToBase32 extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
if (!input) return "";
|
if (!input) return "";
|
||||||
|
input = new Uint8Array(input);
|
||||||
|
|
||||||
const alphabet = args[0] ? Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=";
|
const alphabet = args[0] ? Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=";
|
||||||
let output = "",
|
let output = "",
|
||||||
|
|
|
@ -24,7 +24,7 @@ class ToBase58 extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.<br><br>This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).<br><br>e.g. <code>hello world</code> becomes <code>StV1DL6CwTryKyV</code><br><br>Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc).";
|
this.description = "Base58 (similar to Base64) is a notation for encoding arbitrary byte data. It differs from Base64 by removing easily misread characters (i.e. l, I, 0 and O) to improve human readability.<br><br>This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).<br><br>e.g. <code>hello world</code> becomes <code>StV1DL6CwTryKyV</code><br><br>Base58 is commonly used in cryptocurrencies (Bitcoin, Ripple, etc).";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Base58";
|
this.infoURL = "https://wikipedia.org/wiki/Base58";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -36,11 +36,12 @@ class ToBase58 extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
let alphabet = args[0] || ALPHABET_OPTIONS[0].value,
|
let alphabet = args[0] || ALPHABET_OPTIONS[0].value,
|
||||||
result = [0];
|
result = [0];
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ class ToBase62 extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system.";
|
this.description = "Base62 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. The high number base results in shorter strings than with the decimal or hexadecimal system.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems";
|
this.infoURL = "https://wikipedia.org/wiki/List_of_numeral_systems";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -36,11 +36,12 @@ class ToBase62 extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
if (input.length < 1) return "";
|
if (input.length < 1) return "";
|
||||||
|
|
||||||
const ALPHABET = Utils.expandAlphRange(args[0]).join("");
|
const ALPHABET = Utils.expandAlphRange(args[0]).join("");
|
||||||
|
|
|
@ -24,7 +24,7 @@ class ToBase85 extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.<br><br>This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).<br><br>e.g. <code>hello world</code> becomes <code>BOu!rD]j7BEbo7</code><br><br>Base85 is commonly used in Adobe's PostScript and PDF file formats.<br><br><strong>Options</strong><br><u>Alphabet</u><ul><li>Standard - The standard alphabet, referred to as Ascii85</li><li>Z85 (ZeroMQ) - A string-safe variant of Base85, which avoids quote marks and backslash characters</li><li>IPv6 - A variant of Base85 suitable for encoding IPv6 addresses (RFC 1924)</li></ul><u>Include delimiter</u><br>Adds a '<~' and '~>' delimiter to the start and end of the data. This is standard for Adobe's implementation of Base85.";
|
this.description = "Base85 (also called Ascii85) is a notation for encoding arbitrary byte data. It is usually more efficient that Base64.<br><br>This operation encodes data in an ASCII string (with an alphabet of your choosing, presets included).<br><br>e.g. <code>hello world</code> becomes <code>BOu!rD]j7BEbo7</code><br><br>Base85 is commonly used in Adobe's PostScript and PDF file formats.<br><br><strong>Options</strong><br><u>Alphabet</u><ul><li>Standard - The standard alphabet, referred to as Ascii85</li><li>Z85 (ZeroMQ) - A string-safe variant of Base85, which avoids quote marks and backslash characters</li><li>IPv6 - A variant of Base85 suitable for encoding IPv6 addresses (RFC 1924)</li></ul><u>Include delimiter</u><br>Adds a '<~' and '~>' delimiter to the start and end of the data. This is standard for Adobe's implementation of Base85.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Ascii85";
|
this.infoURL = "https://wikipedia.org/wiki/Ascii85";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -41,11 +41,12 @@ class ToBase85 extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const alphabet = Utils.expandAlphRange(args[0]).join(""),
|
const alphabet = Utils.expandAlphRange(args[0]).join(""),
|
||||||
encoding = alphabetName(alphabet),
|
encoding = alphabetName(alphabet),
|
||||||
includeDelim = args[1];
|
includeDelim = args[1];
|
||||||
|
|
|
@ -24,7 +24,7 @@ class ToBinary extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Displays the input data as a binary string.<br><br>e.g. <code>Hi</code> becomes <code>01001000 01101001</code>";
|
this.description = "Displays the input data as a binary string.<br><br>e.g. <code>Hi</code> becomes <code>01001000 01101001</code>";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Binary_code";
|
this.infoURL = "https://wikipedia.org/wiki/Binary_code";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -36,11 +36,12 @@ class ToBinary extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
return toBinary(input, args[0]);
|
return toBinary(input, args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ class ToDecimal extends Operation {
|
||||||
this.name = "To Decimal";
|
this.name = "To Decimal";
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Converts the input data to an ordinal integer array.<br><br>e.g. <code>Hello</code> becomes <code>72 101 108 108 111</code>";
|
this.description = "Converts the input data to an ordinal integer array.<br><br>e.g. <code>Hello</code> becomes <code>72 101 108 108 111</code>";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -40,11 +40,12 @@ class ToDecimal extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const delim = Utils.charRep(args[0]),
|
const delim = Utils.charRep(args[0]),
|
||||||
signed = args[1];
|
signed = args[1];
|
||||||
if (signed) {
|
if (signed) {
|
||||||
|
|
|
@ -23,7 +23,7 @@ class ToHexContent extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Converts special characters in a string to hexadecimal. This format is used by SNORT for representing hex within ASCII text.<br><br>e.g. <code>foo=bar</code> becomes <code>foo|3d|bar</code>.";
|
this.description = "Converts special characters in a string to hexadecimal. This format is used by SNORT for representing hex within ASCII text.<br><br>e.g. <code>foo=bar</code> becomes <code>foo|3d|bar</code>.";
|
||||||
this.infoURL = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000";
|
this.infoURL = "http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node32.html#SECTION00451000000000000000";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -40,11 +40,12 @@ class ToHexContent extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const convert = args[0];
|
const convert = args[0];
|
||||||
const spaces = args[1];
|
const spaces = args[1];
|
||||||
if (convert === "All chars") {
|
if (convert === "All chars") {
|
||||||
|
|
|
@ -25,17 +25,18 @@ class ToQuotedPrintable extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.<br><br>QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length.";
|
this.description = "Quoted-Printable, or QP encoding, is an encoding using printable ASCII characters (alphanumeric and the equals sign '=') to transmit 8-bit data over a 7-bit data path or, generally, over a medium which is not 8-bit clean. It is defined as a MIME content transfer encoding for use in e-mail.<br><br>QP works by using the equals sign '=' as an escape character. It also limits line length to 76, as some software has limits on line length.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Quoted-printable";
|
this.infoURL = "https://wikipedia.org/wiki/Quoted-printable";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
let mimeEncodedStr = this.mimeEncode(input);
|
let mimeEncodedStr = this.mimeEncode(input);
|
||||||
|
|
||||||
// fix line breaks
|
// fix line breaks
|
||||||
|
@ -73,7 +74,7 @@ class ToQuotedPrintable extends Operation {
|
||||||
/**
|
/**
|
||||||
* Encodes mime data.
|
* Encodes mime data.
|
||||||
*
|
*
|
||||||
* @param {byteArray} buffer
|
* @param {byteArray|Uint8Array} buffer
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
mimeEncode(buffer) {
|
mimeEncode(buffer) {
|
||||||
|
|
|
@ -23,7 +23,7 @@ class Untar extends Operation {
|
||||||
this.module = "Compression";
|
this.module = "Compression";
|
||||||
this.description = "Unpacks a tarball and displays it per file.";
|
this.description = "Unpacks a tarball and displays it per file.";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Tar_(computing)";
|
this.infoURL = "https://wikipedia.org/wiki/Tar_(computing)";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "List<File>";
|
this.outputType = "List<File>";
|
||||||
this.presentType = "html";
|
this.presentType = "html";
|
||||||
this.args = [];
|
this.args = [];
|
||||||
|
@ -37,11 +37,12 @@ class Untar extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {List<File>}
|
* @returns {List<File>}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const stream = new Stream(input),
|
const stream = new Stream(input),
|
||||||
files = [];
|
files = [];
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ class XOR extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "XOR the input with the given key.<br>e.g. <code>fe023da5</code><br><br><strong>Options</strong><br><u>Null preserving:</u> If the current byte is 0x00 or the same as the key, skip it.<br><br><u>Scheme:</u><ul><li>Standard - key is unchanged after each round</li><li>Input differential - key is set to the value of the previous unprocessed byte</li><li>Output differential - key is set to the value of the previous processed byte</li><li>Cascade - key is set to the input byte shifted by one</li></ul>";
|
this.description = "XOR the input with the given key.<br>e.g. <code>fe023da5</code><br><br><strong>Options</strong><br><u>Null preserving:</u> If the current byte is 0x00 or the same as the key, skip it.<br><br><u>Scheme:</u><ul><li>Standard - key is unchanged after each round</li><li>Input differential - key is set to the value of the previous unprocessed byte</li><li>Output differential - key is set to the value of the previous processed byte</li><li>Cascade - key is set to the input byte shifted by one</li></ul>";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/XOR";
|
this.infoURL = "https://wikipedia.org/wiki/XOR";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "byteArray";
|
this.outputType = "byteArray";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -46,11 +46,12 @@ class XOR extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {byteArray}
|
* @returns {byteArray}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const key = Utils.convertToByteArray(args[0].string || "", args[0].option),
|
const key = Utils.convertToByteArray(args[0].string || "", args[0].option),
|
||||||
[, scheme, nullPreserving] = args;
|
[, scheme, nullPreserving] = args;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ class XORBruteForce extends Operation {
|
||||||
this.module = "Default";
|
this.module = "Default";
|
||||||
this.description = "Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.<br><br>Optionally enter a string that you expect to find in the plaintext to filter results (crib).";
|
this.description = "Enumerate all possible XOR solutions. Current maximum key length is 2 due to browser performance.<br><br>Optionally enter a string that you expect to find in the plaintext to filter results (crib).";
|
||||||
this.infoURL = "https://wikipedia.org/wiki/Exclusive_or";
|
this.infoURL = "https://wikipedia.org/wiki/Exclusive_or";
|
||||||
this.inputType = "byteArray";
|
this.inputType = "ArrayBuffer";
|
||||||
this.outputType = "string";
|
this.outputType = "string";
|
||||||
this.args = [
|
this.args = [
|
||||||
{
|
{
|
||||||
|
@ -72,11 +72,12 @@ class XORBruteForce extends Operation {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {byteArray} input
|
* @param {ArrayBuffer} input
|
||||||
* @param {Object[]} args
|
* @param {Object[]} args
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
run(input, args) {
|
run(input, args) {
|
||||||
|
input = new Uint8Array(input);
|
||||||
const [
|
const [
|
||||||
keyLength,
|
keyLength,
|
||||||
sampleLength,
|
sampleLength,
|
||||||
|
|
13
src/node/cjs.js
Normal file
13
src/node/cjs.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
/**
|
||||||
|
* Export the main ESM module as CommonJS
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author d98762656 [d98762625@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*eslint no-global-assign: ["off"] */
|
||||||
|
require = require("esm")(module);
|
||||||
|
module.exports = require("./index.mjs");
|
||||||
|
module.exports.File = require("./File.mjs");
|
|
@ -7,9 +7,9 @@
|
||||||
* @license Apache-2.0
|
* @license Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import chef from "./index.mjs";
|
const chef = require("./cjs.js");
|
||||||
import repl from "repl";
|
const repl = require("repl");
|
||||||
import File from "./File.mjs";
|
|
||||||
|
|
||||||
/*eslint no-console: ["off"] */
|
/*eslint no-console: ["off"] */
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ const replServer = repl.start({
|
||||||
prompt: "chef > ",
|
prompt: "chef > ",
|
||||||
});
|
});
|
||||||
|
|
||||||
global.File = File;
|
global.File = chef.File;
|
||||||
|
|
||||||
Object.keys(chef).forEach((key) => {
|
Object.keys(chef).forEach((key) => {
|
||||||
if (key !== "operations") {
|
if (key !== "operations") {
|
|
@ -382,7 +382,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="save-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="save-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -442,7 +442,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="load-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="load-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -469,7 +469,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="options-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="options-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -582,7 +582,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="favourites-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="favourites-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -608,7 +608,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="support-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="support-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -744,7 +744,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="confirm-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="confirm-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -763,7 +763,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="input-tab-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="input-tab-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
@ -822,7 +822,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal" id="output-tab-modal" tabindex="-1" role="dialog">
|
<div class="modal fade" id="output-tab-modal" tabindex="-1" role="dialog">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
|
|
|
@ -125,6 +125,7 @@
|
||||||
|
|
||||||
/* Misc. */
|
/* Misc. */
|
||||||
--drop-file-border-colour: #3a87ad;
|
--drop-file-border-colour: #3a87ad;
|
||||||
|
--table-border-colour: #ccc;
|
||||||
--popover-background: #fff;
|
--popover-background: #fff;
|
||||||
--popover-border-colour: #ccc;
|
--popover-border-colour: #ccc;
|
||||||
--code-background: #f9f2f4;
|
--code-background: #f9f2f4;
|
||||||
|
|
|
@ -121,6 +121,7 @@
|
||||||
|
|
||||||
/* Misc. */
|
/* Misc. */
|
||||||
--drop-file-border-colour: #0e639c;
|
--drop-file-border-colour: #0e639c;
|
||||||
|
--table-border-colour: #555;
|
||||||
--popover-background: #444;
|
--popover-background: #444;
|
||||||
--popover-border-colour: #555;
|
--popover-border-colour: #555;
|
||||||
--code-background: #0e639c;
|
--code-background: #0e639c;
|
||||||
|
|
|
@ -121,6 +121,7 @@
|
||||||
|
|
||||||
/* Misc. */
|
/* Misc. */
|
||||||
--drop-file-border-colour: purple;
|
--drop-file-border-colour: purple;
|
||||||
|
--table-border-colour: var(--hl3);
|
||||||
--popover-background: turquoise;
|
--popover-background: turquoise;
|
||||||
--popover-border-colour: violet;
|
--popover-border-colour: violet;
|
||||||
--code-background: black;
|
--code-background: black;
|
||||||
|
|
|
@ -138,6 +138,7 @@
|
||||||
|
|
||||||
/* Misc. */
|
/* Misc. */
|
||||||
--drop-file-border-colour: var(--base01);
|
--drop-file-border-colour: var(--base01);
|
||||||
|
--table-border-colour: var(--base01);
|
||||||
--popover-background: var(--base02);
|
--popover-background: var(--base02);
|
||||||
--popover-border-colour: var(--base01);
|
--popover-border-colour: var(--base01);
|
||||||
--code-background: var(--base03);
|
--code-background: var(--base03);
|
||||||
|
|
|
@ -140,6 +140,7 @@
|
||||||
|
|
||||||
/* Misc. */
|
/* Misc. */
|
||||||
--drop-file-border-colour: var(--base1);
|
--drop-file-border-colour: var(--base1);
|
||||||
|
--table-border-colour: var(--base1);
|
||||||
--popover-background: var(--base2);
|
--popover-background: var(--base2);
|
||||||
--popover-border-colour: var(--base1);
|
--popover-border-colour: var(--base1);
|
||||||
--code-background: var(--base3);
|
--code-background: var(--base3);
|
||||||
|
|
|
@ -148,6 +148,15 @@ optgroup {
|
||||||
width: auto !important;
|
width: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.table,
|
||||||
|
.table-hover tbody tr:hover {
|
||||||
|
color: var(--primary-font-colour);
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-bordered th, .table-bordered td {
|
||||||
|
border: 1px solid var(--table-border-colour);
|
||||||
|
}
|
||||||
|
|
||||||
.popover {
|
.popover {
|
||||||
background-color: var(--popover-background);
|
background-color: var(--popover-background);
|
||||||
border-color: var(--popover-border-colour);
|
border-color: var(--popover-border-colour);
|
||||||
|
|
|
@ -515,8 +515,9 @@ class InputWaiter {
|
||||||
*
|
*
|
||||||
* @param {number} inputNum
|
* @param {number} inputNum
|
||||||
* @param {string | ArrayBuffer} value
|
* @param {string | ArrayBuffer} value
|
||||||
|
* @param {boolean} [force=false] - If true, forces the value to be updated even if the type is different to the currently stored type
|
||||||
*/
|
*/
|
||||||
updateInputValue(inputNum, value) {
|
updateInputValue(inputNum, value, force=false) {
|
||||||
let includeInput = false;
|
let includeInput = false;
|
||||||
const recipeStr = toBase64(value, "A-Za-z0-9+/"); // B64 alphabet with no padding
|
const recipeStr = toBase64(value, "A-Za-z0-9+/"); // B64 alphabet with no padding
|
||||||
if (recipeStr.length > 0 && recipeStr.length <= 68267) {
|
if (recipeStr.length > 0 && recipeStr.length <= 68267) {
|
||||||
|
@ -534,7 +535,8 @@ class InputWaiter {
|
||||||
action: "updateInputValue",
|
action: "updateInputValue",
|
||||||
data: {
|
data: {
|
||||||
inputNum: inputNum,
|
inputNum: inputNum,
|
||||||
value: value
|
value: value,
|
||||||
|
force: force
|
||||||
}
|
}
|
||||||
}, transferable);
|
}, transferable);
|
||||||
}
|
}
|
||||||
|
@ -988,9 +990,13 @@ class InputWaiter {
|
||||||
this.manager.highlighter.removeHighlights();
|
this.manager.highlighter.removeHighlights();
|
||||||
getSelection().removeAllRanges();
|
getSelection().removeAllRanges();
|
||||||
|
|
||||||
const tabsList = document.getElementById("input-tabs").children;
|
const tabsList = document.getElementById("input-tabs");
|
||||||
for (let i = tabsList.length - 1; i >= 0; i--) {
|
const tabsListChildren = tabsList.children;
|
||||||
tabsList.item(i).remove();
|
|
||||||
|
tabsList.classList.remove("tabs-left");
|
||||||
|
tabsList.classList.remove("tabs-right");
|
||||||
|
for (let i = tabsListChildren.length - 1; i >= 0; i--) {
|
||||||
|
tabsListChildren.item(i).remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.showLoadingInfo({
|
this.showLoadingInfo({
|
||||||
|
@ -1021,7 +1027,7 @@ class InputWaiter {
|
||||||
this.manager.highlighter.removeHighlights();
|
this.manager.highlighter.removeHighlights();
|
||||||
getSelection().removeAllRanges();
|
getSelection().removeAllRanges();
|
||||||
|
|
||||||
this.updateInputValue(inputNum, "");
|
this.updateInputValue(inputNum, "", true);
|
||||||
|
|
||||||
this.set({
|
this.set({
|
||||||
inputNum: inputNum,
|
inputNum: inputNum,
|
||||||
|
|
|
@ -217,9 +217,13 @@ class OutputWaiter {
|
||||||
*/
|
*/
|
||||||
removeAllOutputs() {
|
removeAllOutputs() {
|
||||||
this.outputs = {};
|
this.outputs = {};
|
||||||
const tabs = document.getElementById("output-tabs").children;
|
const tabsList = document.getElementById("output-tabs");
|
||||||
for (let i = tabs.length - 1; i >= 0; i--) {
|
const tabsListChildren = tabsList.children;
|
||||||
tabs.item(i).remove();
|
|
||||||
|
tabsList.classList.remove("tabs-left");
|
||||||
|
tabsList.classList.remove("tabs-right");
|
||||||
|
for (let i = tabsListChildren.length - 1; i >= 0; i--) {
|
||||||
|
tabsListChildren.item(i).remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -935,8 +939,8 @@ class OutputWaiter {
|
||||||
*/
|
*/
|
||||||
refreshTabs(activeTab, direction) {
|
refreshTabs(activeTab, direction) {
|
||||||
const newNums = this.getNearbyNums(activeTab, direction),
|
const newNums = this.getNearbyNums(activeTab, direction),
|
||||||
tabsLeft = (newNums[0] !== this.getSmallestInputNum()),
|
tabsLeft = (newNums[0] !== this.getSmallestInputNum() && newNums.length > 0),
|
||||||
tabsRight = (newNums[newNums.length - 1] !== this.getLargestInputNum());
|
tabsRight = (newNums[newNums.length - 1] !== this.getLargestInputNum() && newNums.length > 0);
|
||||||
|
|
||||||
this.manager.tabs.refreshOutputTabs(newNums, activeTab, tabsLeft, tabsRight);
|
this.manager.tabs.refreshOutputTabs(newNums, activeTab, tabsLeft, tabsRight);
|
||||||
|
|
||||||
|
@ -1149,14 +1153,14 @@ class OutputWaiter {
|
||||||
* Handler for copy click events.
|
* Handler for copy click events.
|
||||||
* Copies the output to the clipboard
|
* Copies the output to the clipboard
|
||||||
*/
|
*/
|
||||||
copyClick() {
|
async copyClick() {
|
||||||
const dish = this.getOutputDish(this.manager.tabs.getActiveOutputTab());
|
const dish = this.getOutputDish(this.manager.tabs.getActiveOutputTab());
|
||||||
if (dish === null) {
|
if (dish === null) {
|
||||||
this.app.alert("Could not find data to copy. Has this output been baked yet?", 3000);
|
this.app.alert("Could not find data to copy. Has this output been baked yet?", 3000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const output = dish.get(Dish.STRING);
|
const output = await dish.get(Dish.STRING);
|
||||||
|
|
||||||
// Create invisible textarea to populate with the raw dish string (not the printable version that
|
// Create invisible textarea to populate with the raw dish string (not the printable version that
|
||||||
// contains dots instead of the actual bytes)
|
// contains dots instead of the actual bytes)
|
||||||
|
@ -1331,7 +1335,7 @@ class OutputWaiter {
|
||||||
if (Object.prototype.hasOwnProperty.call(output, "data") &&
|
if (Object.prototype.hasOwnProperty.call(output, "data") &&
|
||||||
output.data &&
|
output.data &&
|
||||||
Object.prototype.hasOwnProperty.call(output.data, "dish")) {
|
Object.prototype.hasOwnProperty.call(output.data, "dish")) {
|
||||||
const data = output.data.dish.get(Dish.STRING);
|
const data = await output.data.dish.get(Dish.STRING);
|
||||||
if (contentFilterExp.test(data)) {
|
if (contentFilterExp.test(data)) {
|
||||||
results.push({
|
results.push({
|
||||||
inputNum: iNum,
|
inputNum: iNum,
|
||||||
|
|
|
@ -493,8 +493,8 @@ self.setInput = function(inputData) {
|
||||||
self.refreshTabs = function(inputNum, direction) {
|
self.refreshTabs = function(inputNum, direction) {
|
||||||
const nums = self.getNearbyNums(inputNum, direction),
|
const nums = self.getNearbyNums(inputNum, direction),
|
||||||
inputNums = Object.keys(self.inputs),
|
inputNums = Object.keys(self.inputs),
|
||||||
tabsLeft = (self.getSmallestInputNum(inputNums) !== nums[0]),
|
tabsLeft = (self.getSmallestInputNum(inputNums) !== nums[0] && nums.length > 0),
|
||||||
tabsRight = (self.getLargestInputNum(inputNums) !== nums[nums.length - 1]);
|
tabsRight = (self.getLargestInputNum(inputNums) !== nums[nums.length - 1] && nums.length > 0);
|
||||||
|
|
||||||
self.postMessage({
|
self.postMessage({
|
||||||
action: "refreshTabs",
|
action: "refreshTabs",
|
||||||
|
@ -546,10 +546,13 @@ self.updateInputProgress = function(inputData) {
|
||||||
* @param {object} inputData
|
* @param {object} inputData
|
||||||
* @param {number} inputData.inputNum - The input that's having its value updated
|
* @param {number} inputData.inputNum - The input that's having its value updated
|
||||||
* @param {string | ArrayBuffer} inputData.value - The new value of the input
|
* @param {string | ArrayBuffer} inputData.value - The new value of the input
|
||||||
|
* @param {boolean} inputData.force - If true, still updates the input value if the input type is different to the stored value
|
||||||
*/
|
*/
|
||||||
self.updateInputValue = function(inputData) {
|
self.updateInputValue = function(inputData) {
|
||||||
const inputNum = inputData.inputNum;
|
const inputNum = inputData.inputNum;
|
||||||
if (inputNum < 1) return;
|
if (inputNum < 1) return;
|
||||||
|
if (Object.prototype.hasOwnProperty.call(self.inputs[inputNum].data, "fileBuffer") &&
|
||||||
|
typeof inputData.value === "string" && !inputData.force) return;
|
||||||
const value = inputData.value;
|
const value = inputData.value;
|
||||||
if (self.inputs[inputNum] !== undefined) {
|
if (self.inputs[inputNum] !== undefined) {
|
||||||
if (typeof value === "string") {
|
if (typeof value === "string") {
|
||||||
|
|
|
@ -48,6 +48,7 @@ class TestRegister {
|
||||||
* Runs all the tests in the register.
|
* Runs all the tests in the register.
|
||||||
*/
|
*/
|
||||||
runTests () {
|
runTests () {
|
||||||
|
console.log("Running tests...");
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
this.tests.map(function(test, i) {
|
this.tests.map(function(test, i) {
|
||||||
const chef = new Chef();
|
const chef = new Chef();
|
||||||
|
@ -103,6 +104,8 @@ class TestRegister {
|
||||||
* Run all api related tests and wrap results in report format
|
* Run all api related tests and wrap results in report format
|
||||||
*/
|
*/
|
||||||
runApiTests() {
|
runApiTests() {
|
||||||
|
console.log("Running tests...");
|
||||||
|
|
||||||
return Promise.all(this.apiTests.map(async function(test, i) {
|
return Promise.all(this.apiTests.map(async function(test, i) {
|
||||||
const result = {
|
const result = {
|
||||||
test: test,
|
test: test,
|
||||||
|
|
|
@ -15,28 +15,48 @@
|
||||||
* @param {string} status
|
* @param {string} status
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
const statusToIcon = function statusToIcon(status) {
|
function statusToIcon(status) {
|
||||||
const icons = {
|
return {
|
||||||
erroring: "🔥",
|
erroring: "🔥",
|
||||||
failing: "❌",
|
failing: "❌",
|
||||||
passing: "✔️️",
|
passing: "✔️️",
|
||||||
};
|
}[status] || "?";
|
||||||
return icons[status] || "?";
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays a given test result in the console.
|
|
||||||
* Counts test statuses.
|
* Counts test statuses.
|
||||||
*
|
*
|
||||||
* @param {Object} testStatusCounts
|
* @param {Object} testStatus
|
||||||
* @param {Object} testResult
|
* @param {Object} testResult
|
||||||
*/
|
*/
|
||||||
function handleTestResult(testStatus, testResult) {
|
function handleTestResult(testStatus, testResult) {
|
||||||
testStatus.allTestsPassing = testStatus.allTestsPassing && testResult.status === "passing";
|
testStatus.allTestsPassing = testStatus.allTestsPassing && testResult.status === "passing";
|
||||||
const newCount = (testStatus.counts[testResult.status] || 0) + 1;
|
testStatus.counts[testResult.status] = (testStatus.counts[testResult.status] || 0) + 1;
|
||||||
testStatus.counts[testResult.status] = newCount;
|
|
||||||
testStatus.counts.total += 1;
|
testStatus.counts.total += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log each test result, count tests and failures.
|
||||||
|
*
|
||||||
|
* @param {Object} testStatus - object describing test run data
|
||||||
|
* @param {Object[]} results - results from TestRegister
|
||||||
|
*/
|
||||||
|
export function logTestReport(testStatus, results) {
|
||||||
|
console.log("Tests completed.");
|
||||||
|
|
||||||
|
results.forEach(r => handleTestResult(testStatus, r));
|
||||||
|
|
||||||
|
console.log();
|
||||||
|
for (const testStatusCount in testStatus.counts) {
|
||||||
|
const count = testStatus.counts[testStatusCount];
|
||||||
|
if (count > 0) {
|
||||||
|
console.log(testStatusCount.toUpperCase() + "\t" + count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log();
|
||||||
|
|
||||||
|
// Print error messages for tests that didn't pass
|
||||||
|
results.filter(res => res.status !== "passing").forEach(testResult => {
|
||||||
console.log([
|
console.log([
|
||||||
statusToIcon(testResult.status),
|
statusToIcon(testResult.status),
|
||||||
testResult.test.name
|
testResult.test.name
|
||||||
|
@ -50,24 +70,8 @@ function handleTestResult(testStatus, testResult) {
|
||||||
.replace(/\n/g, "\n\t")
|
.replace(/\n/g, "\n\t")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
console.log();
|
||||||
/**
|
|
||||||
* Log each test result, count tests and failures. Log test suite run duration.
|
|
||||||
*
|
|
||||||
* @param {Object} testStatus - object describing test run data
|
|
||||||
* @param {Object[]} results - results from TestRegister
|
|
||||||
*/
|
|
||||||
export function logTestReport(testStatus, results) {
|
|
||||||
results.forEach(r => handleTestResult(testStatus, r));
|
|
||||||
console.log("\n");
|
|
||||||
|
|
||||||
for (const testStatusCount in testStatus.counts) {
|
|
||||||
const count = testStatus.counts[testStatusCount];
|
|
||||||
if (count > 0) {
|
|
||||||
console.log(testStatusCount.toUpperCase(), count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
process.exit(testStatus.allTestsPassing ? 0 : 1);
|
process.exit(testStatus.allTestsPassing ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
@ -81,4 +85,3 @@ export function setLongTestFailure() {
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}, 60 * 1000);
|
}, 60 * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
29
tests/node/consumers/cjs-consumer.js
Normal file
29
tests/node/consumers/cjs-consumer.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* Tests to ensure that a consuming app can use CJS require
|
||||||
|
*
|
||||||
|
* @author d98762625 [d98762625@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
const chef = require("cyberchef");
|
||||||
|
const assert = require("assert");
|
||||||
|
|
||||||
|
const d = chef.bake("Testing, 1 2 3", [
|
||||||
|
chef.toHex,
|
||||||
|
chef.reverse,
|
||||||
|
{
|
||||||
|
op: chef.unique,
|
||||||
|
args: {
|
||||||
|
delimiter: "Space",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: chef.multiply,
|
||||||
|
args: {
|
||||||
|
delimiter: "Space",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
assert.equal(d.value, "630957449041920");
|
28
tests/node/consumers/esm-consumer.mjs
Normal file
28
tests/node/consumers/esm-consumer.mjs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
* Tests to ensure that a consuming app can use ESM imports
|
||||||
|
*
|
||||||
|
* @author d98762625 [d98762625@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import assert from "assert";
|
||||||
|
import chef from "cyberchef";
|
||||||
|
|
||||||
|
const d = chef.bake("Testing, 1 2 3", [
|
||||||
|
chef.toHex,
|
||||||
|
chef.reverse,
|
||||||
|
{
|
||||||
|
op: chef.unique,
|
||||||
|
args: {
|
||||||
|
delimiter: "Space",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: chef.multiply,
|
||||||
|
args: {
|
||||||
|
delimiter: "Space",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
assert.equal(d.value, "630957449041920");
|
28
tests/node/consumers/esm-deep-import-consumer.mjs
Normal file
28
tests/node/consumers/esm-deep-import-consumer.mjs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
* Tests to ensure that a consuming app can use named imports from deep import patch
|
||||||
|
*
|
||||||
|
* @author d98762625 [d98762625@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import assert from "assert";
|
||||||
|
import { bake, toHex, reverse, unique, multiply } from "cyberchef/src/node/index.mjs";
|
||||||
|
|
||||||
|
const d = bake("Testing, 1 2 3", [
|
||||||
|
toHex,
|
||||||
|
reverse,
|
||||||
|
{
|
||||||
|
op: unique,
|
||||||
|
args: {
|
||||||
|
delimiter: "Space",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
op: multiply,
|
||||||
|
args: {
|
||||||
|
delimiter: "Space",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
assert.equal(d.value, "630957449041920");
|
|
@ -136,7 +136,7 @@ TestRegister.addApiTests([
|
||||||
|
|
||||||
it("chef.help: returns multiple results", () => {
|
it("chef.help: returns multiple results", () => {
|
||||||
const result = chef.help("base 64");
|
const result = chef.help("base 64");
|
||||||
assert.strictEqual(result.length, 10);
|
assert.strictEqual(result.length, 11);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
it("chef.help: looks in description for matches too", () => {
|
it("chef.help: looks in description for matches too", () => {
|
||||||
|
|
|
@ -906,7 +906,7 @@ smothering ampersand abreast
|
||||||
}),
|
}),
|
||||||
|
|
||||||
it("to unix timestamp", () => {
|
it("to unix timestamp", () => {
|
||||||
assert.strictEqual(chef.toUNIXTimestamp("04-01-2001").toString(), "986083200 (Sun 1 April 2001 00:00:00 UTC)");
|
assert.strictEqual(chef.toUNIXTimestamp("2001-04-01").toString(), "986083200 (Sun 1 April 2001 00:00:00 UTC)");
|
||||||
}),
|
}),
|
||||||
|
|
||||||
it("Translate DateTime format", () => {
|
it("Translate DateTime format", () => {
|
||||||
|
|
|
@ -86,6 +86,8 @@ import "./tests/Typex";
|
||||||
import "./tests/BLAKE2b";
|
import "./tests/BLAKE2b";
|
||||||
import "./tests/BLAKE2s";
|
import "./tests/BLAKE2s";
|
||||||
import "./tests/Protobuf";
|
import "./tests/Protobuf";
|
||||||
|
import "./tests/ParseSSHHostKey";
|
||||||
|
import "./tests/DefangIP";
|
||||||
|
|
||||||
// Cannot test operations that use the File type yet
|
// Cannot test operations that use the File type yet
|
||||||
//import "./tests/SplitColourChannels";
|
//import "./tests/SplitColourChannels";
|
||||||
|
|
|
@ -54,6 +54,21 @@ The following algorithms will be used based on the size of the key:
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "AES Encrypt: AES-128-CTR, no IV, ASCII",
|
||||||
|
input: "The quick brown fox jumps over the lazy dog.",
|
||||||
|
expectedOutput: "a98c9e8e3b7c894384d740e4f0f4ed0be2bbb1e0e13a255812c3c6b0a629e4ad759c075b2469c6f4fb2c0cf9",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "AES Encrypt",
|
||||||
|
"args": [
|
||||||
|
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||||
|
{"option": "Hex", "string": ""},
|
||||||
|
"CTR", "Raw", "Hex"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "AES Encrypt: AES-128-CBC with IV, ASCII",
|
name: "AES Encrypt: AES-128-CBC with IV, ASCII",
|
||||||
input: "The quick brown fox jumps over the lazy dog.",
|
input: "The quick brown fox jumps over the lazy dog.",
|
||||||
|
@ -645,6 +660,22 @@ The following algorithms will be used based on the size of the key:
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "AES Decrypt: AES-128-CTR, no IV, ASCII",
|
||||||
|
input: "a98c9e8e3b7c894384d740e4f0f4ed0be2bbb1e0e13a255812c3c6b0a629e4ad759c075b2469c6f4fb2c0cf9",
|
||||||
|
expectedOutput: "The quick brown fox jumps over the lazy dog.",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
"op": "AES Decrypt",
|
||||||
|
"args": [
|
||||||
|
{"option": "Hex", "string": "00112233445566778899aabbccddeeff"},
|
||||||
|
{"option": "Hex", "string": ""},
|
||||||
|
"CTR", "Hex", "Raw",
|
||||||
|
{"option": "Hex", "string": ""}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "AES Decrypt: AES-128-CBC with IV, ASCII",
|
name: "AES Decrypt: AES-128-CBC with IV, ASCII",
|
||||||
input: "4fa077d50cc71a57393e7b542c4e3aea0fb75383b97083f2f568ffc13c0e7a47502ec6d9f25744a061a3a5e55fe95e8d",
|
input: "4fa077d50cc71a57393e7b542c4e3aea0fb75383b97083f2f568ffc13c0e7a47502ec6d9f25744a061a3a5e55fe95e8d",
|
||||||
|
|
43
tests/operations/tests/DefangIP.mjs
Normal file
43
tests/operations/tests/DefangIP.mjs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/**
|
||||||
|
* DefangIP tests.
|
||||||
|
*
|
||||||
|
* @author h345983745
|
||||||
|
*
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "Defang IP: Valid IPV4",
|
||||||
|
input: "192.168.1.1",
|
||||||
|
expectedOutput: "192[.]168[.]1[.]1",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Defang IP Addresses",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}, {
|
||||||
|
name: "Defang IP: Valid IPV6",
|
||||||
|
input: "2001:0db8:85a3:0000:0000:8a2e:0370:7343",
|
||||||
|
expectedOutput: "2001[:]0db8[:]85a3[:]0000[:]0000[:]8a2e[:]0370[:]7343",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Defang IP Addresses",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}, {
|
||||||
|
name: "Defang IP: Valid IPV6 Shorthand",
|
||||||
|
input: "2001:db8:3c4d:15::1a2f:1a2b",
|
||||||
|
expectedOutput: "2001[:]db8[:]3c4d[:]15[:][:]1a2f[:]1a2b",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Defang IP Addresses",
|
||||||
|
args: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
65
tests/operations/tests/ParseSSHHostKey.mjs
Normal file
65
tests/operations/tests/ParseSSHHostKey.mjs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/**
|
||||||
|
* Parse SSH Host Key tests
|
||||||
|
*
|
||||||
|
* @author j433866 [j433866@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2019
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import TestRegister from "../../lib/TestRegister.mjs";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "SSH Host Key: RSA",
|
||||||
|
input: "AAAAB3NzaC1yc2EAAAADAQABAAABAQDiJZ/9W9Ix/Dk9b+K4E+RGCug1AtkGXaJ9vNIY0YHFHLpWsB8DAuh/cGEI9TLbL1gzR2wG+RJNQ2EAQVWe6ypkK63Jm4zw4re+vhEiszpnP889J0h5N9yzyTndesrl4d3cQtv861FcKDPxUJbRALdtl6gwOB7BCL8gsXJLLVLO4EesrbPXD454qpVt7CgJXEXByOFjcIm3XwkdOnXMPHHnMSD7EIN1SvQMD6PfIDrbDd6KQt5QXW/Rc/BsfX5cbUIV1QW5A/GbepXHHKmWRtLC2J/mH3hW2Zq/hITPEaJdG1CtIilQmJaZGXpfGIwFeb0Av9pSL926arZZ6vDi9ctF",
|
||||||
|
expectedOutput: `Key type: ssh-rsa
|
||||||
|
Exponent: 0x010001
|
||||||
|
Modulus: 0x00e2259ffd5bd231fc393d6fe2b813e4460ae83502d9065da27dbcd218d181c51cba56b01f0302e87f706108f532db2f5833476c06f9124d43610041559eeb2a642badc99b8cf0e2b7bebe1122b33a673fcf3d27487937dcb3c939dd7acae5e1dddc42dbfceb515c2833f15096d100b76d97a830381ec108bf20b1724b2d52cee047acadb3d70f8e78aa956dec28095c45c1c8e1637089b75f091d3a75cc3c71e73120fb1083754af40c0fa3df203adb0dde8a42de505d6fd173f06c7d7e5c6d4215d505b903f19b7a95c71ca99646d2c2d89fe61f7856d99abf8484cf11a25d1b50ad222950989699197a5f188c0579bd00bfda522fddba6ab659eaf0e2f5cb45`,
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Parse SSH Host Key",
|
||||||
|
args: ["Base64"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "SSH Host Key: DSA",
|
||||||
|
input: "AAAAB3NzaC1kc3MAAACBAMnoZCOzvaQqs//9mxK2USZvJBc7b1dFJiBcV80abN6maE+203pTRPIPCpPt0deQxv4YN3dSHoodEcArWxs1QRAIuRsQIvsUP7chovzGnxP84XWK5sbfrseD0vxZ7UR0NaAFPcSgeXcWC1SG9uvrAJQlyp4DBy+fKuqiYmwaz0bHAAAAFQCXNJ4yiE1V7LpCU2V1JKbqDvICMwAAAIB/5aR1iBOeyCVpj0dP3YZmoxd9R7FCC/0UuOf0lx4E6WHT6Z2QuPBhc2mpNDq2M0VF9oJfVWgcfG8r1rlXaCYODSacGcbnW5VKQ+LKkkALmg4h8jFCHReUC+Hmia/v8LyDwPO1wK6ETn7a3m80yM7gAU5ZNurVIVVP2lB65mjEsQAAAIA3ct9YRB6iUCvOD45sZM1C9oTC24Ttmaou0GcpWx3h0/iZ8mbil1cjaO9frRNZ/vSSVWEhEDNG8gwkjZWlvnJL3y1XUxbMll4WbmI/Q1kzKwopceaFwMbYTPKDg6L1RtCMUxSUyKsFk1c4SpEPlDS7DApZs5PgmWgMd/u6vwMXyg==",
|
||||||
|
expectedOutput: `Key type: ssh-dss
|
||||||
|
p: 0x00c9e86423b3bda42ab3fffd9b12b651266f24173b6f574526205c57cd1a6cdea6684fb6d37a5344f20f0a93edd1d790c6fe183777521e8a1d11c02b5b1b35411008b91b1022fb143fb721a2fcc69f13fce1758ae6c6dfaec783d2fc59ed447435a0053dc4a07977160b5486f6ebeb009425ca9e03072f9f2aeaa2626c1acf46c7
|
||||||
|
q: 0x0097349e32884d55ecba4253657524a6ea0ef20233
|
||||||
|
g: 0x7fe5a47588139ec825698f474fdd8666a3177d47b1420bfd14b8e7f4971e04e961d3e99d90b8f0617369a9343ab6334545f6825f55681c7c6f2bd6b95768260e0d269c19c6e75b954a43e2ca92400b9a0e21f231421d17940be1e689afeff0bc83c0f3b5c0ae844e7edade6f34c8cee0014e5936ead521554fda507ae668c4b1
|
||||||
|
y: 0x3772df58441ea2502bce0f8e6c64cd42f684c2db84ed99aa2ed067295b1de1d3f899f266e297572368ef5fad1359fef492556121103346f20c248d95a5be724bdf2d575316cc965e166e623f4359332b0a2971e685c0c6d84cf28383a2f546d08c531494c8ab059357384a910f9434bb0c0a59b393e099680c77fbbabf0317ca`,
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Parse SSH Host Key",
|
||||||
|
args: ["Base64"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "SSH Host Key: ECDSA",
|
||||||
|
input: "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGxZWSAGJyJQoVBwFCpr420eRUZDE/kw2YWm5vDro8050DZ1ZzqIuYaNl0BGzMcRTeasGtJuI8G84ZQQSgca3C4=",
|
||||||
|
expectedOutput: `Key type: ecdsa-sha2-nistp256
|
||||||
|
Curve: nistp256
|
||||||
|
Point: 0x046c59592006272250a15070142a6be36d1e45464313f930d985a6e6f0eba3cd39d03675673a88b9868d974046ccc7114de6ac1ad26e23c1bce194104a071adc2e`,
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Parse SSH Host Key",
|
||||||
|
args: ["Base64"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "SSH Host Key: Extract key",
|
||||||
|
input: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDiJZ/9W9Ix/Dk9b+K4E+RGCug1AtkGXaJ9vNIY0YHFHLpWsB8DAuh/cGEI9TLbL1gzR2wG+RJNQ2EAQVWe6ypkK63Jm4zw4re+vhEiszpnP889J0h5N9yzyTndesrl4d3cQtv861FcKDPxUJbRALdtl6gwOB7BCL8gsXJLLVLO4EesrbPXD454qpVt7CgJXEXByOFjcIm3XwkdOnXMPHHnMSD7EIN1SvQMD6PfIDrbDd6KQt5QXW/Rc/BsfX5cbUIV1QW5A/GbepXHHKmWRtLC2J/mH3hW2Zq/hITPEaJdG1CtIilQmJaZGXpfGIwFeb0Av9pSL926arZZ6vDi9ctF test@test",
|
||||||
|
expectedOutput: `Key type: ssh-rsa
|
||||||
|
Exponent: 0x010001
|
||||||
|
Modulus: 0x00e2259ffd5bd231fc393d6fe2b813e4460ae83502d9065da27dbcd218d181c51cba56b01f0302e87f706108f532db2f5833476c06f9124d43610041559eeb2a642badc99b8cf0e2b7bebe1122b33a673fcf3d27487937dcb3c939dd7acae5e1dddc42dbfceb515c2833f15096d100b76d97a830381ec108bf20b1724b2d52cee047acadb3d70f8e78aa956dec28095c45c1c8e1637089b75f091d3a75cc3c71e73120fb1083754af40c0fa3df203adb0dde8a42de505d6fd173f06c7d7e5c6d4215d505b903f19b7a95c71ca99646d2c2d89fe61f7856d99abf8484cf11a25d1b50ad222950989699197a5f188c0579bd00bfda522fddba6ab659eaf0e2f5cb45`,
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "Parse SSH Host Key",
|
||||||
|
args: ["Base64"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
|
@ -103,11 +103,17 @@ module.exports = {
|
||||||
"sass-loader",
|
"sass-loader",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
* The limit for these files has been increased to 60,000 (60KB)
|
||||||
|
* to ensure the material icons font is inlined.
|
||||||
|
*
|
||||||
|
* See: https://github.com/gchq/CyberChef/issues/612
|
||||||
|
*/
|
||||||
{
|
{
|
||||||
test: /\.(ico|eot|ttf|woff|woff2)$/,
|
test: /\.(ico|eot|ttf|woff|woff2)$/,
|
||||||
loader: "url-loader",
|
loader: "url-loader",
|
||||||
options: {
|
options: {
|
||||||
limit: 10000,
|
limit: 60000,
|
||||||
name: "[hash].[ext]",
|
name: "[hash].[ext]",
|
||||||
outputPath: "assets"
|
outputPath: "assets"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue