2018-05-17 17:11:34 +02:00
|
|
|
/**
|
2022-10-14 17:10:01 +02:00
|
|
|
* @author n1474335 [n1474335@gmail.com]
|
2022-09-22 17:39:51 +02:00
|
|
|
* @author john19696 [john19696@protonmail.com]
|
2022-10-14 17:10:01 +02:00
|
|
|
* @copyright Crown Copyright 2016
|
2018-05-17 17:11:34 +02:00
|
|
|
* @license Apache-2.0
|
|
|
|
*/
|
|
|
|
|
2019-07-09 13:23:59 +02:00
|
|
|
import Operation from "../Operation.mjs";
|
|
|
|
import Utils from "../Utils.mjs";
|
|
|
|
import MD2 from "./MD2.mjs";
|
|
|
|
import MD4 from "./MD4.mjs";
|
|
|
|
import MD5 from "./MD5.mjs";
|
|
|
|
import MD6 from "./MD6.mjs";
|
|
|
|
import SHA0 from "./SHA0.mjs";
|
|
|
|
import SHA1 from "./SHA1.mjs";
|
|
|
|
import SHA2 from "./SHA2.mjs";
|
|
|
|
import SHA3 from "./SHA3.mjs";
|
|
|
|
import Keccak from "./Keccak.mjs";
|
|
|
|
import Shake from "./Shake.mjs";
|
|
|
|
import RIPEMD from "./RIPEMD.mjs";
|
|
|
|
import HAS160 from "./HAS160.mjs";
|
|
|
|
import Whirlpool from "./Whirlpool.mjs";
|
|
|
|
import SSDEEP from "./SSDEEP.mjs";
|
|
|
|
import CTPH from "./CTPH.mjs";
|
|
|
|
import Fletcher8Checksum from "./Fletcher8Checksum.mjs";
|
|
|
|
import Fletcher16Checksum from "./Fletcher16Checksum.mjs";
|
|
|
|
import Fletcher32Checksum from "./Fletcher32Checksum.mjs";
|
|
|
|
import Fletcher64Checksum from "./Fletcher64Checksum.mjs";
|
|
|
|
import Adler32Checksum from "./Adler32Checksum.mjs";
|
|
|
|
import CRC8Checksum from "./CRC8Checksum.mjs";
|
|
|
|
import CRC16Checksum from "./CRC16Checksum.mjs";
|
|
|
|
import CRC32Checksum from "./CRC32Checksum.mjs";
|
|
|
|
import BLAKE2b from "./BLAKE2b.mjs";
|
|
|
|
import BLAKE2s from "./BLAKE2s.mjs";
|
|
|
|
import Streebog from "./Streebog.mjs";
|
|
|
|
import GOSTHash from "./GOSTHash.mjs";
|
2022-10-14 17:10:01 +02:00
|
|
|
import OperationError from "../errors/OperationError.mjs";
|
2018-05-17 17:11:34 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Generate all hashes operation
|
|
|
|
*/
|
|
|
|
class GenerateAllHashes extends Operation {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GenerateAllHashes constructor
|
|
|
|
*/
|
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
|
|
|
|
this.name = "Generate all hashes";
|
2018-12-26 00:58:00 +01:00
|
|
|
this.module = "Crypto";
|
2018-05-17 17:11:34 +02:00
|
|
|
this.description = "Generates all available hashes and checksums for the input.";
|
2018-08-21 20:07:13 +02:00
|
|
|
this.infoURL = "https://wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions";
|
2018-05-17 17:11:34 +02:00
|
|
|
this.inputType = "ArrayBuffer";
|
|
|
|
this.outputType = "string";
|
2022-09-22 17:30:36 +02:00
|
|
|
this.args = [
|
|
|
|
{
|
2022-10-14 17:10:01 +02:00
|
|
|
name: "Length (bits)",
|
|
|
|
type: "option",
|
|
|
|
value: [
|
|
|
|
"All", "128", "160", "224", "256", "320", "384", "512"
|
2022-09-22 17:30:36 +02:00
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
2022-10-14 17:10:01 +02:00
|
|
|
name: "Include names",
|
|
|
|
type: "boolean",
|
|
|
|
value: true
|
2022-09-22 17:30:36 +02:00
|
|
|
},
|
|
|
|
];
|
|
|
|
this.hashes = [
|
2022-10-14 17:10:01 +02:00
|
|
|
{name: "MD2", algo: (new MD2()), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "MD4", algo: (new MD4()), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "MD5", algo: (new MD5()), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "MD6", algo: (new MD6()), inputType: "str", params: []},
|
|
|
|
{name: "SHA0", algo: (new SHA0()), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "SHA1", algo: (new SHA1()), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "SHA2 224", algo: (new SHA2()), inputType: "arrayBuffer", params: ["224"]},
|
|
|
|
{name: "SHA2 256", algo: (new SHA2()), inputType: "arrayBuffer", params: ["256"]},
|
|
|
|
{name: "SHA2 384", algo: (new SHA2()), inputType: "arrayBuffer", params: ["384"]},
|
|
|
|
{name: "SHA2 512", algo: (new SHA2()), inputType: "arrayBuffer", params: ["512"]},
|
|
|
|
{name: "SHA3 224", algo: (new SHA3()), inputType: "arrayBuffer", params: ["224"]},
|
|
|
|
{name: "SHA3 256", algo: (new SHA3()), inputType: "arrayBuffer", params: ["256"]},
|
|
|
|
{name: "SHA3 384", algo: (new SHA3()), inputType: "arrayBuffer", params: ["384"]},
|
|
|
|
{name: "SHA3 512", algo: (new SHA3()), inputType: "arrayBuffer", params: ["512"]},
|
|
|
|
{name: "Keccak 224", algo: (new Keccak()), inputType: "arrayBuffer", params: ["224"]},
|
|
|
|
{name: "Keccak 256", algo: (new Keccak()), inputType: "arrayBuffer", params: ["256"]},
|
|
|
|
{name: "Keccak 384", algo: (new Keccak()), inputType: "arrayBuffer", params: ["384"]},
|
|
|
|
{name: "Keccak 512", algo: (new Keccak()), inputType: "arrayBuffer", params: ["512"]},
|
|
|
|
{name: "Shake 128", algo: (new Shake()), inputType: "arrayBuffer", params: ["128", 256]},
|
|
|
|
{name: "Shake 256", algo: (new Shake()), inputType: "arrayBuffer", params: ["256", 512]},
|
|
|
|
{name: "RIPEMD-128", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["128"]},
|
|
|
|
{name: "RIPEMD-160", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["160"]},
|
|
|
|
{name: "RIPEMD-256", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["256"]},
|
|
|
|
{name: "RIPEMD-320", algo: (new RIPEMD()), inputType: "arrayBuffer", params: ["320"]},
|
|
|
|
{name: "HAS-160", algo: (new HAS160()), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "Whirlpool-0", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool-0"]},
|
|
|
|
{name: "Whirlpool-T", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool-T"]},
|
|
|
|
{name: "Whirlpool", algo: (new Whirlpool()), inputType: "arrayBuffer", params: ["Whirlpool"]},
|
|
|
|
{name: "BLAKE2b-128", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["128", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2b-160", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["160", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2b-256", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["256", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2b-384", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["384", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2b-512", algo: (new BLAKE2b), inputType: "arrayBuffer", params: ["512", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2s-128", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["128", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2s-160", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["160", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "BLAKE2s-256", algo: (new BLAKE2s), inputType: "arrayBuffer", params: ["256", "Hex", {string: "", option: "UTF8"}]},
|
|
|
|
{name: "Streebog-256", algo: (new Streebog), inputType: "arrayBuffer", params: ["256"]},
|
|
|
|
{name: "Streebog-512", algo: (new Streebog), inputType: "arrayBuffer", params: ["512"]},
|
|
|
|
{name: "GOST", algo: (new GOSTHash), inputType: "arrayBuffer", params: ["D-A"]},
|
|
|
|
{name: "SSDEEP", algo: (new SSDEEP()), inputType: "str"},
|
|
|
|
{name: "CTPH", algo: (new CTPH()), inputType: "str"}
|
2022-09-22 17:30:36 +02:00
|
|
|
];
|
|
|
|
this.checksums = [
|
2022-10-14 17:10:01 +02:00
|
|
|
{name: "Fletcher-8", algo: (new Fletcher8Checksum), inputType: "byteArray", params: []},
|
|
|
|
{name: "Fletcher-16", algo: (new Fletcher16Checksum), inputType: "byteArray", params: []},
|
|
|
|
{name: "Fletcher-32", algo: (new Fletcher32Checksum), inputType: "byteArray", params: []},
|
|
|
|
{name: "Fletcher-64", algo: (new Fletcher64Checksum), inputType: "byteArray", params: []},
|
|
|
|
{name: "Adler-32", algo: (new Adler32Checksum), inputType: "byteArray", params: []},
|
|
|
|
{name: "CRC-8", algo: (new CRC8Checksum), inputType: "arrayBuffer", params: ["CRC-8"]},
|
|
|
|
{name: "CRC-16", algo: (new CRC16Checksum), inputType: "arrayBuffer", params: []},
|
|
|
|
{name: "CRC-32", algo: (new CRC32Checksum), inputType: "arrayBuffer", params: []}
|
2022-09-22 17:30:36 +02:00
|
|
|
];
|
2018-05-17 17:11:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {ArrayBuffer} input
|
|
|
|
* @param {Object[]} args
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
|
|
|
run(input, args) {
|
2022-10-14 17:10:01 +02:00
|
|
|
const [length, includeNames] = args;
|
|
|
|
this.inputArrayBuffer = input;
|
|
|
|
this.inputStr = Utils.arrayBufferToStr(input, false);
|
|
|
|
this.inputByteArray = new Uint8Array(input);
|
2022-09-22 17:30:36 +02:00
|
|
|
|
2022-10-14 17:10:01 +02:00
|
|
|
let digest, output = "";
|
2022-09-22 17:30:36 +02:00
|
|
|
// iterate over each of the hashes
|
2022-10-14 17:10:01 +02:00
|
|
|
this.hashes.forEach(hash => {
|
|
|
|
digest = this.executeAlgo(hash.algo, hash.inputType, hash.params || []);
|
|
|
|
output += this.formatDigest(digest, length, includeNames, hash.name);
|
2022-09-22 17:30:36 +02:00
|
|
|
});
|
|
|
|
|
2022-09-22 17:53:29 +02:00
|
|
|
if (length === "All") {
|
2022-10-14 17:10:01 +02:00
|
|
|
output += "\nChecksums:\n";
|
|
|
|
this.checksums.forEach(checksum => {
|
|
|
|
digest = this.executeAlgo(checksum.algo, checksum.inputType, checksum.params || []);
|
|
|
|
output += this.formatDigest(digest, length, includeNames, checksum.name);
|
|
|
|
});
|
2022-09-22 17:30:36 +02:00
|
|
|
}
|
2018-05-17 17:11:34 +02:00
|
|
|
|
|
|
|
return output;
|
|
|
|
}
|
|
|
|
|
2022-10-14 17:10:01 +02:00
|
|
|
/**
|
|
|
|
* Executes a hash or checksum algorithm
|
|
|
|
*
|
|
|
|
* @param {Function} algo - The hash or checksum algorithm
|
|
|
|
* @param {string} inputType
|
|
|
|
* @param {Object[]} [params=[]]
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
|
|
|
executeAlgo(algo, inputType, params=[]) {
|
|
|
|
let digest = null;
|
|
|
|
switch (inputType) {
|
|
|
|
case "arrayBuffer":
|
|
|
|
digest = algo.run(this.inputArrayBuffer, params);
|
|
|
|
break;
|
|
|
|
case "str":
|
|
|
|
digest = algo.run(this.inputStr, params);
|
|
|
|
break;
|
|
|
|
case "byteArray":
|
|
|
|
digest = algo.run(this.inputByteArray, params);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
throw new OperationError("Unknown hash input type: " + inputType);
|
|
|
|
}
|
|
|
|
|
|
|
|
return digest;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Formats the digest depending on user-specified arguments
|
|
|
|
* @param {string} digest
|
|
|
|
* @param {string} length
|
|
|
|
* @param {boolean} includeNames
|
|
|
|
* @param {string} name
|
|
|
|
* @returns {string}
|
|
|
|
*/
|
|
|
|
formatDigest(digest, length, includeNames, name) {
|
|
|
|
if (length !== "All" && (digest.length * 4) !== parseInt(length, 10))
|
|
|
|
return "";
|
|
|
|
|
|
|
|
if (!includeNames)
|
|
|
|
return digest + "\n";
|
|
|
|
|
|
|
|
return `${name}:${" ".repeat(13-name.length)}${digest}\n`;
|
|
|
|
}
|
|
|
|
|
2018-05-17 17:11:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export default GenerateAllHashes;
|