Tweaks to various hashing functions to improve config options

This commit is contained in:
n1474335 2021-02-02 16:06:37 +00:00
parent 3ce3866000
commit 1b54584820
11 changed files with 104 additions and 34 deletions

View file

@ -13,8 +13,11 @@ All major and minor version changes will be documented in this file. Details of
## Details ## 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 ### [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 ### [9.22.0] - 2021-02-01
- 'Unicode Text Format' operation added [@mattnotmitt] | [#1083] - '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 [#965]: https://github.com/gchq/CyberChef/pull/965
[#966]: https://github.com/gchq/CyberChef/pull/966 [#966]: https://github.com/gchq/CyberChef/pull/966
[#987]: https://github.com/gchq/CyberChef/pull/987 [#987]: https://github.com/gchq/CyberChef/pull/987
[#1022]: https://github.com/gchq/CyberChef/pull/1022
[#1049]: https://github.com/gchq/CyberChef/pull/1049 [#1049]: https://github.com/gchq/CyberChef/pull/1049
[#1083]: https://github.com/gchq/CyberChef/pull/1083 [#1083]: https://github.com/gchq/CyberChef/pull/1083

View file

@ -28,7 +28,9 @@ class HAS160 extends Operation {
{ {
name: "Rounds", name: "Rounds",
type: "number", type: "number",
value: 80 value: 80,
min: 1,
max: 80
} }
]; ];
} }

View file

@ -28,7 +28,8 @@ class MD2 extends Operation {
{ {
name: "Rounds", name: "Rounds",
type: "number", type: "number",
value: 18 value: 18,
min: 0
} }
]; ];
} }

View file

@ -28,7 +28,8 @@ class SHA0 extends Operation {
{ {
name: "Rounds", name: "Rounds",
type: "number", type: "number",
value: 80 value: 80,
min: 16
} }
]; ];
} }

View file

@ -28,7 +28,8 @@ class SHA1 extends Operation {
{ {
name: "Rounds", name: "Rounds",
type: "number", type: "number",
value: 80 value: 80,
min: 16
} }
]; ];
} }

View file

@ -20,20 +20,58 @@ class SHA2 extends Operation {
this.name = "SHA2"; this.name = "SHA2";
this.module = "Crypto"; 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.<br><br><ul><li>SHA-512 operates on 64-bit words.</li><li>SHA-256 operates on 32-bit words.</li><li>SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.</li><li>SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.</li><li>SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.</li></ul> 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.<br><br><ul><li>SHA-512 operates on 64-bit words.</li><li>SHA-256 operates on 32-bit words.</li><li>SHA-384 is largely identical to SHA-512 but is truncated to 384 bytes.</li><li>SHA-224 is largely identical to SHA-256 but is truncated to 224 bytes.</li><li>SHA-512/224 and SHA-512/256 are truncated versions of SHA-512, but the initial values are generated using the method described in Federal Information Processing Standards (FIPS) PUB 180-4.</li></ul> 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.infoURL = "https://wikipedia.org/wiki/SHA-2";
this.inputType = "ArrayBuffer"; this.inputType = "ArrayBuffer";
this.outputType = "string"; this.outputType = "string";
this.args = [ this.args = [
{ {
"name": "Size", name: "Size",
"type": "option", type: "argSelector",
"value": ["512", "256", "384", "224", "512/256", "512/224"] value: [
{
name: "512",
on: [2],
off: [1]
}, },
{ {
name: "Rounds", 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", // For SHA256 variants
type: "number", 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) { run(input, args) {
const size = args[0]; 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});
} }
} }

View file

@ -6,8 +6,8 @@
import Operation from "../Operation.mjs"; import Operation from "../Operation.mjs";
import Utils from "../Utils.mjs"; import Utils from "../Utils.mjs";
import Sm3 from "crypto-api/src/hasher/sm3"; import Sm3 from "crypto-api/src/hasher/sm3.mjs";
import {toHex} from "crypto-api/src/encoder/hex"; import {toHex} from "crypto-api/src/encoder/hex.mjs";
/** /**
* SM3 operation * SM3 operation
@ -35,7 +35,8 @@ class SM3 extends Operation {
{ {
name: "Rounds", name: "Rounds",
type: "number", type: "number",
value: 64 value: 64,
min: 16
} }
]; ];
} }

View file

@ -26,14 +26,17 @@ class Snefru extends Operation {
this.outputType = "string"; this.outputType = "string";
this.args = [ this.args = [
{ {
"name": "Rounds", name: "Size",
"type": "option", type: "number",
"value": ["8", "4", "2"] value: 128,
min: 32,
max: 480,
step: 32
}, },
{ {
"name": "Size", name: "Rounds",
"type": "option", type: "option",
"value": ["256", "128"] value: ["8", "4", "2"]
} }
]; ];
} }
@ -45,8 +48,8 @@ class Snefru extends Operation {
*/ */
run(input, args) { run(input, args) {
return runHash("snefru", input, { return runHash("snefru", input, {
rounds: args[0], length: args[0],
length: args[1] rounds: args[1]
}); });
} }

View file

@ -26,9 +26,16 @@ class Whirlpool extends Operation {
this.outputType = "string"; this.outputType = "string";
this.args = [ this.args = [
{ {
"name": "Variant", name: "Variant",
"type": "option", type: "option",
"value": ["Whirlpool", "Whirlpool-T", "Whirlpool-0"] 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) { run(input, args) {
const variant = args[0].toLowerCase(); const variant = args[0].toLowerCase();
return runHash(variant, input); return runHash(variant, input, {rounds: args[1]});
} }
} }

View file

@ -854,7 +854,7 @@ pCGTErs=
it("Snefru", () => { it("Snefru", () => {
assert.strictEqual( assert.strictEqual(
chef.snefru("demeaning milestone").toString(), chef.snefru("demeaning milestone", {size: 256, rounds: 8}).toString(),
"a671b48770fe073ce49e9259cc2f47d345a53712639f8ae23c5ad3fec19540a5"); "a671b48770fe073ce49e9259cc2f47d345a53712639f8ae23c5ad3fec19540a5");
}), }),

View file

@ -345,7 +345,7 @@ TestRegister.addTests([
recipeConfig: [ recipeConfig: [
{ {
"op": "Snefru", "op": "Snefru",
"args": ["2", "128"] "args": ["128", "2"]
} }
] ]
}, },
@ -356,7 +356,7 @@ TestRegister.addTests([
recipeConfig: [ recipeConfig: [
{ {
"op": "Snefru", "op": "Snefru",
"args": ["4", "128"] "args": ["128", "4"]
} }
] ]
}, },
@ -367,7 +367,7 @@ TestRegister.addTests([
recipeConfig: [ recipeConfig: [
{ {
"op": "Snefru", "op": "Snefru",
"args": ["8", "128"] "args": ["128", "8"]
} }
] ]
}, },
@ -378,7 +378,7 @@ TestRegister.addTests([
recipeConfig: [ recipeConfig: [
{ {
"op": "Snefru", "op": "Snefru",
"args": ["2", "256"] "args": ["256", "2"]
} }
] ]
}, },
@ -389,7 +389,7 @@ TestRegister.addTests([
recipeConfig: [ recipeConfig: [
{ {
"op": "Snefru", "op": "Snefru",
"args": ["4", "256"] "args": ["256", "4"]
} }
] ]
}, },
@ -400,7 +400,18 @@ TestRegister.addTests([
recipeConfig: [ recipeConfig: [
{ {
"op": "Snefru", "op": "Snefru",
"args": ["8", "256"] "args": ["256", "8"]
}
]
},
{
name: "SM3 256 64",
input: "Hello, World!",
expectedOutput: "7ed26cbf0bee4ca7d55c1e64714c4aa7d1f163089ef5ceb603cd102c81fbcbc5",
recipeConfig: [
{
"op": "SM3",
"args": ["256", "64"]
} }
] ]
}, },