Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Streebog (aka. GOST R 34.11-2012) #530

Merged
merged 4 commits into from
Jul 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/core/config/Categories.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@
"Enigma",
"Bombe",
"Multiple Bombe",
"Typex"
"Typex",
"Streebog"
]
},
{
Expand Down Expand Up @@ -194,8 +195,8 @@
"Remove null bytes",
"To Upper case",
"To Lower case",
"To Case Insensitive Regex",
"From Case Insensitive Regex",
"To Case Insensitive Regex",
"From Case Insensitive Regex",
"Add line numbers",
"Remove line numbers",
"To Table",
Expand Down
95 changes: 95 additions & 0 deletions src/core/operations/Streebog.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/**
* @author mshwed [m@ttshwed.com]
* @copyright Crown Copyright 2019
* @license Apache-2.0
*/

import Operation from "../Operation";
import OperationError from "../errors/OperationError";
import GostCoding from "../vendor/streebog/gostCoding";
import GostDigest from "../vendor/streebog/gostDigest";

/**
* Streebog operation
*/
class Streebog extends Operation {

/**
* Streebog constructor
*/
constructor() {
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.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",
"type": "option",
"value": ["256", "512"]
}
];
}

/**
* @param {string} 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);

// 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();
} catch (err) {
throw new OperationError(`Invalid Input, Details ${err.message}`);
}
}

}

export default Streebog;
Loading