2
0
mirror of https://github.com/gchq/CyberChef synced 2025-12-05 23:53:27 +00:00

Compare commits

...

8 Commits

Author SHA1 Message Date
n1474335
d924da2f25 6.1.0 2017-09-22 17:36:03 +00:00
n1474335
be4d1eabaa Merge branch 'feature-hashing' 2017-09-22 17:34:18 +00:00
n1474335
db98e56e72 Reduced extraneous auto bakes 2017-09-22 17:33:46 +00:00
n1474335
e2a35ea844 Updated Whirlpool and HAS-160 operations to work with modules 2017-09-22 17:01:39 +00:00
n1474335
7966b2bde6 Merge branch 'master' into feature-hashing 2017-09-22 16:09:13 +00:00
n1474335
9391b947c6 Merge branch 'master' of github.com:gchq/CyberChef 2017-09-22 16:05:59 +00:00
n1474335
e61e3bcf9b Updated the dev server to work on external interfaces 2017-09-22 16:05:15 +00:00
n1474335
d79a0e737a Added HAS-160 and Whirlpool hashing operations 2017-09-20 09:43:14 +00:00
13 changed files with 157 additions and 41 deletions

View File

@@ -1,3 +1,5 @@
"use strict";
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const NodeExternals = require("webpack-node-externals");
@@ -309,7 +311,10 @@ module.exports = function (grunt) {
"webpack-dev-server": {
options: {
webpack: webpackConfig,
host: "0.0.0.0",
disableHostCheck: true,
overlay: true,
inline: false,
clientLogLevel: "error",
stats: {
children: false,

48
package-lock.json generated
View File

@@ -1,18 +1,9 @@
{
"name": "cyberchef",
"version": "6.0.2",
"version": "6.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"HTML_CodeSniffer": {
"version": "github:squizlabs/HTML_CodeSniffer#d209ce54876657858a8a01528ad812cd234f37f0",
"dev": true
},
"JSONSelect": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz",
"integrity": "sha1-oI7cxn6z/L6Z7WMIVTRKDPKCu40="
},
"abab": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz",
@@ -41,12 +32,12 @@
"integrity": "sha1-IJ4W63DAlaA79/yCnsrLfHeS9e4=",
"dev": true,
"requires": {
"HTML_CodeSniffer": "github:squizlabs/HTML_CodeSniffer#d209ce54876657858a8a01528ad812cd234f37f0",
"axios": "0.9.1",
"bluebird": "3.5.0",
"chalk": "1.1.3",
"commander": "2.11.0",
"glob": "7.1.2",
"HTML_CodeSniffer": "github:squizlabs/HTML_CodeSniffer#d209ce54876657858a8a01528ad812cd234f37f0",
"jsdom": "9.12.0",
"mkdirp": "0.5.1",
"phantomjs-prebuilt": "2.1.15",
@@ -1764,9 +1755,9 @@
}
},
"crypto-api": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/crypto-api/-/crypto-api-0.7.3.tgz",
"integrity": "sha1-nHMgTE73lxYjIkOYuDS6fJ2B9uU="
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/crypto-api/-/crypto-api-0.7.4.tgz",
"integrity": "sha1-wuiM1WOWxJ0A75uA40lGUKdIKoE="
},
"crypto-browserify": {
"version": "3.11.1",
@@ -3873,6 +3864,10 @@
"wbuf": "1.7.2"
}
},
"HTML_CodeSniffer": {
"version": "github:squizlabs/HTML_CodeSniffer#d209ce54876657858a8a01528ad812cd234f37f0",
"dev": true
},
"html-comment-regex": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
@@ -4610,12 +4605,12 @@
"resolved": "https://registry.npmjs.org/jison/-/jison-0.4.13.tgz",
"integrity": "sha1-kEFwfWIkE2f1iDRTK58ZwsNvrHg=",
"requires": {
"JSONSelect": "0.4.0",
"cjson": "0.2.1",
"ebnf-parser": "0.1.10",
"escodegen": "0.0.21",
"esprima": "1.0.4",
"jison-lex": "0.2.1",
"JSONSelect": "0.4.0",
"lex-parser": "0.1.4",
"nomnom": "1.5.2"
},
@@ -4883,6 +4878,11 @@
}
}
},
"JSONSelect": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz",
"integrity": "sha1-oI7cxn6z/L6Z7WMIVTRKDPKCu40="
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
@@ -7829,6 +7829,15 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
"dev": true
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"dev": true,
"requires": {
"safe-buffer": "5.1.1"
}
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -7856,15 +7865,6 @@
}
}
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"dev": true,
"requires": {
"safe-buffer": "5.1.1"
}
},
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",

View File

@@ -1,6 +1,6 @@
{
"name": "cyberchef",
"version": "6.0.2",
"version": "6.1.0",
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
"author": "n1474335 <n1474335@gmail.com>",
"homepage": "https://gchq.github.io/CyberChef",
@@ -61,8 +61,8 @@
"url-loader": "^0.5.9",
"val-loader": "^1.0.2",
"web-resource-inliner": "^4.1.1",
"webpack": "^3.5.6",
"webpack-dev-server": "^2.5.0",
"webpack": "^3.6.0",
"webpack-dev-server": "^2.8.2",
"webpack-node-externals": "^1.6.0",
"worker-loader": "^0.8.0"
},
@@ -71,7 +71,7 @@
"bootstrap": "^3.3.7",
"bootstrap-colorpicker": "^2.5.1",
"bootstrap-switch": "^3.3.4",
"crypto-api": "^0.7.3",
"crypto-api": "^0.7.4",
"crypto-js": "^3.1.9-1",
"diff": "^3.3.1",
"escodegen": "^1.9.0",

View File

@@ -255,6 +255,8 @@ const Categories = [
"Keccak",
"Shake",
"RIPEMD",
"HAS-160",
"Whirlpool",
"HMAC",
"Fletcher-8 Checksum",
"Fletcher-16 Checksum",

View File

@@ -2991,6 +2991,26 @@ const OperationConfig = {
}
]
},
"HAS-160": {
module: "Hashing",
description: "HAS-160 is a cryptographic hash function designed for use with the Korean KCDSA digital signature algorithm. It is derived from SHA-1, with assorted changes intended to increase its security. It produces a 160-bit output.<br><br>HAS-160 is used in the same way as SHA-1. First it divides input in blocks of 512 bits each and pads the final block. A digest function updates the intermediate hash value by processing the input blocks in turn.<br><br>The message digest algorithm consists of 80 rounds.",
inputType: "string",
outputType: "string",
args: []
},
"Whirlpool": {
module: "Hashing",
description: "Whirlpool is a cryptographic hash function designed by Vincent Rijmen (co-creator of AES) and Paulo S. L. M. Barreto, who first described it in 2000.<br><br>Several variants exist:<ul><li>Whirlpool-0 is the original version released in 2000.</li><li>Whirlpool-T is the first revision, released in 2001, improving the generation of the s-box.</li><li>Wirlpool is the latest revision, released in 2003, fixing a flaw in the difusion matrix.</li></ul>",
inputType: "string",
outputType: "string",
args: [
{
name: "Variant",
type: "option",
value: Hash.WHIRLPOOL_VARIANT
}
]
},
"HMAC": {
module: "Hashing",
description: "Keyed-Hash Message Authentication Codes (HMAC) are a mechanism for message authentication using cryptographic hash functions.",

View File

@@ -31,6 +31,8 @@ OpModules.Hashing = {
"Keccak": Hash.runKeccak,
"Shake": Hash.runShake,
"RIPEMD": Hash.runRIPEMD,
"HAS-160": Hash.runHAS,
"Whirlpool": Hash.runWhirlpool,
"HMAC": Hash.runHMAC,
"Fletcher-8 Checksum": Checksum.runFletcher8,
"Fletcher-16 Checksum": Checksum.runFletcher16,

View File

@@ -263,6 +263,37 @@ const Hash = {
},
/**
* HAS-160 operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runHAS: function (input, args) {
return CryptoApi.hash("has160", input, {}).stringify("hex");
},
/**
* @constant
* @default
*/
WHIRLPOOL_VARIANT: ["Whirlpool", "Whirlpool-T", "Whirlpool-0"],
/**
* Whirlpool operation.
*
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
runWhirlpool: function (input, args) {
const variant = args[0].toLowerCase();
return CryptoApi.hash(variant, input, {}).stringify("hex");
},
/**
* @constant
* @default
@@ -283,6 +314,10 @@ const Hash = {
"RIPEMD160",
"RIPEMD256",
"RIPEMD320",
"HAS160",
"Whirlpool",
"Whirlpool-0",
"Whirlpool-T"
],
/**
@@ -335,6 +370,10 @@ const Hash = {
"\nRIPEMD-160: " + Hash.runRIPEMD(input, ["160"]) +
"\nRIPEMD-256: " + Hash.runRIPEMD(input, ["256"]) +
"\nRIPEMD-320: " + Hash.runRIPEMD(input, ["320"]) +
"\nHAS-160: " + Hash.runHAS(input, []) +
"\nWhirlpool-0: " + Hash.runWhirlpool(input, ["Whirlpool-0"]) +
"\nWhirlpool-T: " + Hash.runWhirlpool(input, ["Whirlpool-T"]) +
"\nWhirlpool: " + Hash.runWhirlpool(input, ["Whirlpool"]) +
"\n\nChecksums:" +
"\nFletcher-8: " + Checksum.runFletcher8(byteArray, []) +
"\nFletcher-16: " + Checksum.runFletcher16(byteArray, []) +

View File

@@ -122,7 +122,12 @@ App.prototype.bake = function(step) {
* Runs Auto Bake if it is set.
*/
App.prototype.autoBake = function() {
if (this.autoBake_ && !this.autoBakePause && !this.baking) {
// If autoBakePause is set, we are loading a full recipe (and potentially input), so there is no
// need to set the staleness indicator. Just exit and wait until auto bake is called after loading
// has completed.
if (this.autoBakePause) return false;
if (this.autoBake_ && !this.baking) {
this.bake();
} else {
this.manager.controls.showStaleIndicator();
@@ -369,10 +374,6 @@ App.prototype.loadURIParams = function() {
window.location.hash;
this.uriParams = Utils.parseURIParams(params);
// Pause auto-bake while loading but don't modify `this.autoBake_`
// otherwise `manualBake` cannot trigger.
this.autoBakePause = true;
// Read in recipe from URI params
if (this.uriParams.recipe) {
try {
@@ -407,8 +408,6 @@ App.prototype.loadURIParams = function() {
} catch (err) {}
}
// Unpause auto-bake
this.autoBakePause = false;
this.autoBake();
};
@@ -441,6 +440,10 @@ App.prototype.getRecipeConfig = function() {
App.prototype.setRecipeConfig = function(recipeConfig) {
document.getElementById("rec-list").innerHTML = null;
// Pause auto-bake while loading but don't modify `this.autoBake_`
// otherwise `manualBake` cannot trigger.
this.autoBakePause = true;
for (let i = 0; i < recipeConfig.length; i++) {
const item = this.manager.recipe.addOperation(recipeConfig[i].op);
@@ -473,6 +476,9 @@ App.prototype.setRecipeConfig = function(recipeConfig) {
this.progress = 0;
}
// Unpause auto bake
this.autoBakePause = false;
};

View File

@@ -361,6 +361,7 @@ ControlsWaiter.prototype.loadButtonClick = function() {
try {
const recipeConfig = Utils.parseRecipeConfig(document.getElementById("load-text").value);
this.app.setRecipeConfig(recipeConfig);
this.app.autoBake();
$("#rec-list [data-toggle=popover]").popover();
} catch (e) {

View File

@@ -158,13 +158,11 @@ InputWaiter.prototype.inputDrop = function(e) {
const CHUNK_SIZE = 20480; // 20KB
const setInput = function() {
this.app.autoBakePause = true;
const recipeConfig = this.app.getRecipeConfig();
if (!recipeConfig[0] || recipeConfig[0].op !== "From Hex") {
recipeConfig.unshift({op: "From Hex", args: ["Space"]});
this.app.setRecipeConfig(recipeConfig);
}
this.app.autoBakePause = false;
this.set(inputCharcode);

View File

@@ -119,9 +119,8 @@ Manager.prototype.initialiseEventListeners = function() {
this.addDynamicListener("li.operation", "operationadd", this.recipe.opAdd.bind(this.recipe));
// Recipe
this.addDynamicListener(".arg", "keyup", this.recipe.ingChange, this.recipe);
this.addDynamicListener(".arg", "change", this.recipe.ingChange, this.recipe);
this.addDynamicListener(".arg", "input", this.recipe.ingChange, this.recipe);
this.addDynamicListener(".arg:not(select)", "input", this.recipe.ingChange, this.recipe);
this.addDynamicListener(".arg[type=checkbox], .arg[type=radio], select.arg", "change", this.recipe.ingChange, this.recipe);
this.addDynamicListener(".disable-icon", "click", this.recipe.disableClick, this.recipe);
this.addDynamicListener(".breakpoint", "click", this.recipe.breakpointClick, this.recipe);
this.addDynamicListener("#rec-list li.operation", "dblclick", this.recipe.operationDblclick, this.recipe);

View File

@@ -191,7 +191,7 @@ RecipeWaiter.prototype.favDrop = function(e) {
*
* @fires Manager#statechange
*/
RecipeWaiter.prototype.ingChange = function() {
RecipeWaiter.prototype.ingChange = function(e) {
window.dispatchEvent(this.manager.statechange);
};

View File

@@ -294,6 +294,50 @@ TestRegister.addTests([
}
]
},
{
name: "HAS-160",
input: "Hello, World!",
expectedOutput: "8f6dd8d7c8a04b1cb3831adc358b1e4ac2ed5984",
recipeConfig: [
{
"op": "HAS-160",
"args": []
}
]
},
{
name: "Whirlpool-0",
input: "Hello, World!",
expectedOutput: "1c327026f565a0105a827efbfb3d3635cdb042c0aabb8416e96deb128e6c5c8684b13541cf31c26c1488949df050311c6999a12eb0e7002ad716350f5c7700ca",
recipeConfig: [
{
"op": "Whirlpool",
"args": ["Whirlpool-0"]
}
]
},
{
name: "Whirlpool-T",
input: "Hello, World!",
expectedOutput: "16c581089b6a6f356ae56e16a63a4c613eecd82a2a894b293f5ee45c37a31d09d7a8b60bfa7e414bd4a7166662cea882b5cf8c96b7d583fc610ad202591bcdb1",
recipeConfig: [
{
"op": "Whirlpool",
"args": ["Whirlpool-T"]
}
]
},
{
name: "Whirlpool",
input: "Hello, World!",
expectedOutput: "3d837c9ef7bb291bd1dcfc05d3004af2eeb8c631dd6a6c4ba35159b8889de4b1ec44076ce7a8f7bfa497e4d9dcb7c29337173f78d06791f3c3d9e00cc6017f0b",
recipeConfig: [
{
"op": "Whirlpool",
"args": ["Whirlpool"]
}
]
},
{
name: "HMAC SHA256",
input: "Hello, World!",