diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index e55d3659..6b12afbb 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -106,8 +106,7 @@ "Enigma", "Bombe", "Multiple Bombe", - "Typex", - "Streebog" + "Typex" ] }, { @@ -303,6 +302,8 @@ "Snefru", "BLAKE2b", "BLAKE2s", + "GOST hash", + "Streebog", "SSDEEP", "CTPH", "Compare SSDEEP hashes", diff --git a/src/core/lib/Hex.mjs b/src/core/lib/Hex.mjs index 5ec12e86..071e9f1c 100644 --- a/src/core/lib/Hex.mjs +++ b/src/core/lib/Hex.mjs @@ -12,7 +12,7 @@ import Utils from "../Utils"; /** * Convert a byte array into a hex string. * - * @param {Uint8Array|byteArray} data + * @param {byteArray|Uint8Array|ArrayBuffer} data * @param {string} [delim=" "] * @param {number} [padding=2] * @returns {string} @@ -26,6 +26,7 @@ import Utils from "../Utils"; */ export function toHex(data, delim=" ", padding=2) { if (!data) return ""; + if (data instanceof ArrayBuffer) data = new Uint8Array(data); let output = ""; @@ -47,7 +48,7 @@ export function toHex(data, delim=" ", padding=2) { /** * Convert a byte array into a hex string as efficiently as possible with no options. * - * @param {byteArray} data + * @param {byteArray|Uint8Array|ArrayBuffer} data * @returns {string} * * @example @@ -56,6 +57,7 @@ export function toHex(data, delim=" ", padding=2) { */ export function toHexFast(data) { if (!data) return ""; + if (data instanceof ArrayBuffer) data = new Uint8Array(data); const output = []; diff --git a/src/core/operations/Streebog.mjs b/src/core/operations/Streebog.mjs index 7f054fb4..6795459c 100644 --- a/src/core/operations/Streebog.mjs +++ b/src/core/operations/Streebog.mjs @@ -6,8 +6,8 @@ import Operation from "../Operation"; import OperationError from "../errors/OperationError"; -import GostCoding from "../vendor/streebog/gostCoding"; -import GostDigest from "../vendor/streebog/gostDigest"; +import GostDigest from "../vendor/gost/gostDigest"; +import {toHexFast} from "../lib/Hex"; /** * Streebog operation @@ -21,37 +21,14 @@ class Streebog extends Operation { super(); this.name = "Streebog"; - this.module = "Crypto"; - this.description = "Streebog is a cryptographic hash function defined in the Russian national standard GOST R 34.11-2012 Information Technology \u2013 Cryptographic Information Security \u2013 Hash Function. It was created to replace an obsolete GOST hash function defined in the old standard GOST R 34.11-94, and as an asymmetric reply to SHA-3 competition by the US National Institute of Standards and Technology."; - this.infoURL = "https://en.wikipedia.org/wiki/Streebog"; - this.inputType = "string"; + this.module = "Hashing"; + this.description = "Streebog is a cryptographic hash function defined in the Russian national standard GOST R 34.11-2012 Information Technology \u2013 Cryptographic Information Security \u2013 Hash Function. It was created to replace an obsolete GOST hash function defined in the old standard GOST R 34.11-94, and as an asymmetric reply to SHA-3 competition by the US National Institute of Standards and Technology."; + this.infoURL = "https://wikipedia.org/wiki/Streebog"; + this.inputType = "ArrayBuffer"; this.outputType = "string"; this.args = [ { - "name": "Version", - "type": "option", - "value": ["2012", "1994"] - }, - // Paramset sBox for GOST 28147-89. Used only if version = 1994 - { - "name": "S-Box", - "type": "option", - "value": [ - "D-A", - "D-SC", - "E-TEST", - "E-A", - "E-B", - "E-C", - "E-D", - "E-SC", - "E-Z", - "D-TEST" - ] - }, - // 512 bits digest, valid only for algorithm "Streebog" - { - "name": "Length", + "name": "Size", "type": "option", "value": ["256", "512"] } @@ -59,34 +36,22 @@ class Streebog extends Operation { } /** - * @param {string} input + * @param {ArrayBuffer} input * @param {Object[]} args * @returns {string} */ run(input, args) { try { - const version = parseInt(args[0], 10); - let sBox = args[1]; - let length = parseInt(args[2], 10); + const length = parseInt(args[0], 10); + const gostDigest = new GostDigest({ + name: "GOST R 34.11", + version: 2012, + length: length + }); - // 1994 old-style 256 bits digest based on GOST 28147-89 - if (version === 1994) { - length = 256; - } - - if (version === 2012) { - sBox = ""; - } - - const gostDigest = new GostDigest({name: "GOST R 34.11", version, sBox, length }); - const gostCoding = new GostCoding(); - - const decode = gostCoding.Chars.decode(input); - const hexEncode = gostCoding.Hex.encode(gostDigest.digest(decode)); - - return hexEncode.replace(/[^\-A-Fa-f0-9]/g, "").toLowerCase(); + return toHexFast(gostDigest.digest(input)); } catch (err) { - throw new OperationError(`Invalid Input, Details ${err.message}`); + throw new OperationError(err); } } diff --git a/src/core/vendor/streebog/gostCipher.mjs b/src/core/vendor/gost/gostCipher.mjs similarity index 100% rename from src/core/vendor/streebog/gostCipher.mjs rename to src/core/vendor/gost/gostCipher.mjs diff --git a/src/core/vendor/streebog/gostCoding.mjs b/src/core/vendor/gost/gostCoding.mjs similarity index 100% rename from src/core/vendor/streebog/gostCoding.mjs rename to src/core/vendor/gost/gostCoding.mjs diff --git a/src/core/vendor/streebog/gostCrypto.mjs b/src/core/vendor/gost/gostCrypto.mjs similarity index 100% rename from src/core/vendor/streebog/gostCrypto.mjs rename to src/core/vendor/gost/gostCrypto.mjs diff --git a/src/core/vendor/streebog/gostDigest.mjs b/src/core/vendor/gost/gostDigest.mjs similarity index 99% rename from src/core/vendor/streebog/gostDigest.mjs rename to src/core/vendor/gost/gostDigest.mjs index 0ead2b79..2404317e 100644 --- a/src/core/vendor/streebog/gostDigest.mjs +++ b/src/core/vendor/gost/gostDigest.mjs @@ -1192,8 +1192,8 @@ function GostDigest(algorithm) // // Define chiper algorithm this.sBox = (algorithm.sBox || (algorithm.procreator === 'SC' ? 'D-SC' : 'D-A')).toUpperCase(); - if (!GostCipher) - GostCipher = root.GostCipher; + //if (!GostCipher) + // GostCipher = root.GostCipher; if (!GostCipher) throw new NotSupportedError('Object GostCipher not found'); diff --git a/src/core/vendor/streebog/gostEngine.mjs b/src/core/vendor/gost/gostEngine.mjs similarity index 100% rename from src/core/vendor/streebog/gostEngine.mjs rename to src/core/vendor/gost/gostEngine.mjs diff --git a/src/core/vendor/streebog/gostRandom.mjs b/src/core/vendor/gost/gostRandom.mjs similarity index 100% rename from src/core/vendor/streebog/gostRandom.mjs rename to src/core/vendor/gost/gostRandom.mjs diff --git a/src/core/vendor/streebog/gostSign.mjs b/src/core/vendor/gost/gostSign.mjs similarity index 100% rename from src/core/vendor/streebog/gostSign.mjs rename to src/core/vendor/gost/gostSign.mjs diff --git a/tests/operations/tests/Hash.mjs b/tests/operations/tests/Hash.mjs index 430ad05a..1a4688c8 100644 --- a/tests/operations/tests/Hash.mjs +++ b/tests/operations/tests/Hash.mjs @@ -1040,9 +1040,7 @@ TestRegister.addTests([ recipeConfig: [ { op: "Streebog", - args: [ - "2012", "D-A", "256" - ] + args: ["256"] } ] }, @@ -1053,9 +1051,7 @@ TestRegister.addTests([ recipeConfig: [ { op: "Streebog", - args: [ - "2012", "D-A", "256" - ] + args: ["256"] } ] }, @@ -1066,9 +1062,7 @@ TestRegister.addTests([ recipeConfig: [ { op: "Streebog", - args: [ - "2012", "D-A", "512" - ] + args: ["512"] } ] }, @@ -1079,9 +1073,7 @@ TestRegister.addTests([ recipeConfig: [ { op: "Streebog", - args: [ - "2012", "D-A", "512" - ] + args: ["512"] } ] }, @@ -1091,10 +1083,8 @@ TestRegister.addTests([ expectedOutput: "981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0", recipeConfig: [ { - op: "Streebog", - args: [ - "1994", "D-A", "256" - ] + op: "GOST hash", + args: ["D-A"] } ] }, @@ -1104,10 +1094,8 @@ TestRegister.addTests([ expectedOutput: "2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb", recipeConfig: [ { - op: "Streebog", - args: [ - "1994", "D-A", "256" - ] + op: "GOST hash", + args: ["D-A"] } ] }