From 37389a62c1b0239d131030b0812ae84158fd908c Mon Sep 17 00:00:00 2001 From: mshwed Date: Mon, 1 Apr 2019 23:14:40 -0400 Subject: [PATCH] Added support for hashing version 1994 and 2012. Added S-Box selection for 1994 version. Added length selection --- src/core/operations/Streebog.mjs | 58 ++++++++++++++++++++++---- src/core/vendor/streebog/gostCipher.js | 8 ++-- src/core/vendor/streebog/gostCoding.js | 12 +++--- src/core/vendor/streebog/gostCrypto.js | 9 ++-- src/core/vendor/streebog/gostDigest.js | 12 +++--- src/core/vendor/streebog/gostRandom.js | 12 +++--- 6 files changed, 78 insertions(+), 33 deletions(-) diff --git a/src/core/operations/Streebog.mjs b/src/core/operations/Streebog.mjs index 0c46f4f7..f24f2e06 100644 --- a/src/core/operations/Streebog.mjs +++ b/src/core/operations/Streebog.mjs @@ -26,7 +26,36 @@ class Streebog extends Operation { this.infoURL = "https://en.wikipedia.org/wiki/Streebog"; this.inputType = "string"; this.outputType = "string"; - this.args = []; + 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", + "type": "option", + "value": ["256", "512"] + } + ]; } /** @@ -36,16 +65,29 @@ class Streebog extends Operation { */ run(input, args) { try { - const gostDigest = new GostDigest({name: 'GOST R 34.11', version: 1994}); + const version = parseInt(args[0], 10); + let sBox = args[1]; + let length = parseInt(args[2], 10); + + // 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, 'utf8'); - let hexEncode = gostCoding.Hex.encode(gostDigest.digest(decode)) - - return hexEncode.replace(/[^\-A-Fa-f0-9]/g, '').toLowerCase();; + + const decode = gostCoding.Chars.decode(input); + const hexEncode = gostCoding.Hex.encode(gostDigest.digest(decode)); + + return hexEncode.replace(/[^\-A-Fa-f0-9]/g, "").toLowerCase(); } catch (err) { - console.log(err) - throw new OperationError("Test"); + throw new OperationError(`Invalid Input, Details ${err.message}`); } } diff --git a/src/core/vendor/streebog/gostCipher.js b/src/core/vendor/streebog/gostCipher.js index b3ec0116..bf6b31b5 100644 --- a/src/core/vendor/streebog/gostCipher.js +++ b/src/core/vendor/streebog/gostCipher.js @@ -1,7 +1,9 @@ /** - * @file GOST 28147-89/GOST R 34.12-2015/GOST R 32.13-2015 Encryption Algorithm - * @version 1.76 - * @copyright 2014-2016, Rudolf Nickolaev. All rights reserved. + * GOST 28147-89/GOST R 34.12-2015/GOST R 32.13-2015 Encryption Algorithm + * 1.76 + * 2014-2016, Rudolf Nickolaev. All rights reserved. + * + * Exported for CyberChef by mshwed [m@ttshwed.com] */ /* diff --git a/src/core/vendor/streebog/gostCoding.js b/src/core/vendor/streebog/gostCoding.js index cc909c12..c9514a79 100644 --- a/src/core/vendor/streebog/gostCoding.js +++ b/src/core/vendor/streebog/gostCoding.js @@ -1,7 +1,9 @@ /** - * @file Coding algorithms: Base64, Hex, Int16, Chars, BER and PEM - * @version 1.76 - * @copyright 2014-2016, Rudolf Nickolaev. All rights reserved. + * Coding algorithms: Base64, Hex, Int16, Chars, BER and PEM + * version 1.76 + * 2014-2016, Rudolf Nickolaev. All rights reserved. + * + * Exported for CyberChef by mshwed [m@ttshwed.com] */ /* @@ -36,9 +38,7 @@ * Module imports and exports * */ // - if (typeof exports === 'object') { - module.exports = factory(require('./gostCrypto')); - } + module.exports = factory(require('./gostCrypto')); // }(this, function (gostCrypto) { diff --git a/src/core/vendor/streebog/gostCrypto.js b/src/core/vendor/streebog/gostCrypto.js index fd6b19a2..f3e23895 100644 --- a/src/core/vendor/streebog/gostCrypto.js +++ b/src/core/vendor/streebog/gostCrypto.js @@ -1,7 +1,9 @@ /** - * @file Implementation Web Crypto interfaces for GOST algorithms - * @version 1.76 - * @copyright 2014-2016, Rudolf Nickolaev. All rights reserved. + * Implementation Web Crypto interfaces for GOST algorithms + * 1.76 + * 2014-2016, Rudolf Nickolaev. All rights reserved. + * + * Exported for CyberChef by mshwed [m@ttshwed.com] */ /* @@ -37,7 +39,6 @@ * */ // module.exports = factory(require('./gostRandom')); - // }(this, function (GostRandom) { diff --git a/src/core/vendor/streebog/gostDigest.js b/src/core/vendor/streebog/gostDigest.js index aa3ddb41..e6f5db33 100644 --- a/src/core/vendor/streebog/gostDigest.js +++ b/src/core/vendor/streebog/gostDigest.js @@ -1,7 +1,9 @@ /** - * @file GOST R 34.11-94 / GOST R 34.11-12 implementation - * @version 1.76 - * @copyright 2014-2016, Rudolf Nickolaev. All rights reserved. + * GOST R 34.11-94 / GOST R 34.11-12 implementation + * 1.76 + * 2014-2016, Rudolf Nickolaev. All rights reserved. + * + * Exported for CyberChef by mshwed [m@ttshwed.com] */ /* @@ -40,9 +42,7 @@ * Module imports and exports * */ // - if (typeof exports === 'object') { - module.exports = factory(require('./gostRandom'), require('./gostCipher')); - } + module.exports = factory(require('./gostRandom'), require('./gostCipher')); // }(this, function (GostRandom, GostCipher) { diff --git a/src/core/vendor/streebog/gostRandom.js b/src/core/vendor/streebog/gostRandom.js index 5282cf0d..93e0c845 100644 --- a/src/core/vendor/streebog/gostRandom.js +++ b/src/core/vendor/streebog/gostRandom.js @@ -1,7 +1,9 @@ /** - * @file Implementation Web Crypto random generatore for GOST algorithms - * @version 1.76 - * @copyright 2014-2016, Rudolf Nickolaev. All rights reserved. + * Implementation Web Crypto random generatore for GOST algorithms + * 1.76 + * 2014-2016, Rudolf Nickolaev. All rights reserved. + * + * Exported for CyberChef by mshwed [m@ttshwed.com] */ /* @@ -36,9 +38,7 @@ * Module imports and exports * */ // - if (typeof exports === 'object') { - module.exports = factory(); - } + module.exports = factory(); // }(this, function () {