From 1b545848201db44a45ca438089f4ac895e492689 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Tue, 2 Feb 2021 16:06:37 +0000 Subject: [PATCH] Tweaks to various hashing functions to improve config options --- CHANGELOG.md | 6 +++- src/core/operations/HAS160.mjs | 4 ++- src/core/operations/MD2.mjs | 3 +- src/core/operations/SHA0.mjs | 3 +- src/core/operations/SHA1.mjs | 3 +- src/core/operations/SHA2.mjs | 53 +++++++++++++++++++++++++++---- src/core/operations/SM3.mjs | 7 ++-- src/core/operations/Snefru.mjs | 19 ++++++----- src/core/operations/Whirlpool.mjs | 15 ++++++--- tests/node/tests/operations.mjs | 2 +- tests/operations/tests/Hash.mjs | 23 ++++++++++---- 11 files changed, 104 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad2e3fc3..c60b7c3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,11 @@ All major and minor version changes will be documented in this file. Details of ## Details +### [9.24.0] - 2020-02-02 +- 'SM3' hashing function added along with more configuration options for other hashing operations [@n1073645] [@n1474335] | [#1022] + ### [9.23.0] - 2020-02-01 -- Various RSA operations added to encrypt, decrypt, sign, verify and generate keys [@mattnotmitt] | [#652] +- Various RSA operations added to encrypt, decrypt, sign, verify and generate keys [@mattnotmitt] [@GCHQ77703] | [#652] ### [9.22.0] - 2021-02-01 - 'Unicode Text Format' operation added [@mattnotmitt] | [#1083] @@ -420,5 +423,6 @@ All major and minor version changes will be documented in this file. Details of [#965]: https://github.com/gchq/CyberChef/pull/965 [#966]: https://github.com/gchq/CyberChef/pull/966 [#987]: https://github.com/gchq/CyberChef/pull/987 +[#1022]: https://github.com/gchq/CyberChef/pull/1022 [#1049]: https://github.com/gchq/CyberChef/pull/1049 [#1083]: https://github.com/gchq/CyberChef/pull/1083 \ No newline at end of file diff --git a/src/core/operations/HAS160.mjs b/src/core/operations/HAS160.mjs index 0ca62019..707b99b3 100644 --- a/src/core/operations/HAS160.mjs +++ b/src/core/operations/HAS160.mjs @@ -28,7 +28,9 @@ class HAS160 extends Operation { { name: "Rounds", type: "number", - value: 80 + value: 80, + min: 1, + max: 80 } ]; } diff --git a/src/core/operations/MD2.mjs b/src/core/operations/MD2.mjs index 9fca4939..38f6d325 100644 --- a/src/core/operations/MD2.mjs +++ b/src/core/operations/MD2.mjs @@ -28,7 +28,8 @@ class MD2 extends Operation { { name: "Rounds", type: "number", - value: 18 + value: 18, + min: 0 } ]; } diff --git a/src/core/operations/SHA0.mjs b/src/core/operations/SHA0.mjs index 34c4d1df..7f712ad9 100644 --- a/src/core/operations/SHA0.mjs +++ b/src/core/operations/SHA0.mjs @@ -28,7 +28,8 @@ class SHA0 extends Operation { { name: "Rounds", type: "number", - value: 80 + value: 80, + min: 16 } ]; } diff --git a/src/core/operations/SHA1.mjs b/src/core/operations/SHA1.mjs index ee744d56..8c081f2f 100644 --- a/src/core/operations/SHA1.mjs +++ b/src/core/operations/SHA1.mjs @@ -28,7 +28,8 @@ class SHA1 extends Operation { { name: "Rounds", type: "number", - value: 80 + value: 80, + min: 16 } ]; } diff --git a/src/core/operations/SHA2.mjs b/src/core/operations/SHA2.mjs index 3d015d26..ecdc4cc5 100644 --- a/src/core/operations/SHA2.mjs +++ b/src/core/operations/SHA2.mjs @@ -20,20 +20,58 @@ class SHA2 extends Operation { this.name = "SHA2"; this.module = "Crypto"; - this.description = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.

The message digest algorithm consists, by default, of 64 rounds."; + this.description = "The SHA-2 (Secure Hash Algorithm 2) hash functions were designed by the NSA. SHA-2 includes significant changes from its predecessor, SHA-1. The SHA-2 family consists of hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA224, SHA256, SHA384, SHA512.

The message digest algorithm for SHA256 variants consists, by default, of 64 rounds, and for SHA512 variants, it is, by default, 160."; this.infoURL = "https://wikipedia.org/wiki/SHA-2"; this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Size", - "type": "option", - "value": ["512", "256", "384", "224", "512/256", "512/224"] + name: "Size", + type: "argSelector", + value: [ + { + name: "512", + on: [2], + off: [1] + }, + { + name: "384", + on: [2], + off: [1] + }, + { + name: "256", + on: [1], + off: [2] + }, + { + name: "224", + on: [1], + off: [2] + }, + { + name: "512/256", + on: [2], + off: [1] + }, + { + name: "512/224", + on: [2], + off: [1] + } + ] }, { - name: "Rounds", + name: "Rounds", // For SHA256 variants type: "number", - value: 64 + value: 64, + min: 16 + }, + { + name: "Rounds", // For SHA512 variants + type: "number", + value: 160, + min: 32 } ]; } @@ -45,7 +83,8 @@ class SHA2 extends Operation { */ run(input, args) { const size = args[0]; - return runHash("sha" + size, input, {rounds: args[1]}); + const rounds = (size === "256" || size === "224") ? args[1] : args[2]; + return runHash("sha" + size, input, {rounds: rounds}); } } diff --git a/src/core/operations/SM3.mjs b/src/core/operations/SM3.mjs index a489c9be..1441476a 100644 --- a/src/core/operations/SM3.mjs +++ b/src/core/operations/SM3.mjs @@ -6,8 +6,8 @@ import Operation from "../Operation.mjs"; import Utils from "../Utils.mjs"; -import Sm3 from "crypto-api/src/hasher/sm3"; -import {toHex} from "crypto-api/src/encoder/hex"; +import Sm3 from "crypto-api/src/hasher/sm3.mjs"; +import {toHex} from "crypto-api/src/encoder/hex.mjs"; /** * SM3 operation @@ -35,7 +35,8 @@ class SM3 extends Operation { { name: "Rounds", type: "number", - value: 64 + value: 64, + min: 16 } ]; } diff --git a/src/core/operations/Snefru.mjs b/src/core/operations/Snefru.mjs index 520b3550..ae5859b3 100644 --- a/src/core/operations/Snefru.mjs +++ b/src/core/operations/Snefru.mjs @@ -26,14 +26,17 @@ class Snefru extends Operation { this.outputType = "string"; this.args = [ { - "name": "Rounds", - "type": "option", - "value": ["8", "4", "2"] + name: "Size", + type: "number", + value: 128, + min: 32, + max: 480, + step: 32 }, { - "name": "Size", - "type": "option", - "value": ["256", "128"] + name: "Rounds", + type: "option", + value: ["8", "4", "2"] } ]; } @@ -45,8 +48,8 @@ class Snefru extends Operation { */ run(input, args) { return runHash("snefru", input, { - rounds: args[0], - length: args[1] + length: args[0], + rounds: args[1] }); } diff --git a/src/core/operations/Whirlpool.mjs b/src/core/operations/Whirlpool.mjs index ae4c0359..c2364912 100644 --- a/src/core/operations/Whirlpool.mjs +++ b/src/core/operations/Whirlpool.mjs @@ -26,9 +26,16 @@ class Whirlpool extends Operation { this.outputType = "string"; this.args = [ { - "name": "Variant", - "type": "option", - "value": ["Whirlpool", "Whirlpool-T", "Whirlpool-0"] + name: "Variant", + type: "option", + value: ["Whirlpool", "Whirlpool-T", "Whirlpool-0"] + }, + { + name: "Rounds", + type: "number", + value: 10, + min: 1, + max: 10 } ]; } @@ -40,7 +47,7 @@ class Whirlpool extends Operation { */ run(input, args) { const variant = args[0].toLowerCase(); - return runHash(variant, input); + return runHash(variant, input, {rounds: args[1]}); } } diff --git a/tests/node/tests/operations.mjs b/tests/node/tests/operations.mjs index f208384c..52748167 100644 --- a/tests/node/tests/operations.mjs +++ b/tests/node/tests/operations.mjs @@ -854,7 +854,7 @@ pCGTErs= it("Snefru", () => { assert.strictEqual( - chef.snefru("demeaning milestone").toString(), + chef.snefru("demeaning milestone", {size: 256, rounds: 8}).toString(), "a671b48770fe073ce49e9259cc2f47d345a53712639f8ae23c5ad3fec19540a5"); }), diff --git a/tests/operations/tests/Hash.mjs b/tests/operations/tests/Hash.mjs index bccdc6b7..95a18ffd 100644 --- a/tests/operations/tests/Hash.mjs +++ b/tests/operations/tests/Hash.mjs @@ -345,7 +345,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Snefru", - "args": ["2", "128"] + "args": ["128", "2"] } ] }, @@ -356,7 +356,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Snefru", - "args": ["4", "128"] + "args": ["128", "4"] } ] }, @@ -367,7 +367,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Snefru", - "args": ["8", "128"] + "args": ["128", "8"] } ] }, @@ -378,7 +378,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Snefru", - "args": ["2", "256"] + "args": ["256", "2"] } ] }, @@ -389,7 +389,7 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Snefru", - "args": ["4", "256"] + "args": ["256", "4"] } ] }, @@ -400,7 +400,18 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Snefru", - "args": ["8", "256"] + "args": ["256", "8"] + } + ] + }, + { + name: "SM3 256 64", + input: "Hello, World!", + expectedOutput: "7ed26cbf0bee4ca7d55c1e64714c4aa7d1f163089ef5ceb603cd102c81fbcbc5", + recipeConfig: [ + { + "op": "SM3", + "args": ["256", "64"] } ] },