123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- /* globals CryptoApi, CryptoJS, Checksum */
- /**
- * Hashing operations.
- *
- * @author n1474335 [n1474335@gmail.com]
- * @copyright Crown Copyright 2016
- * @license Apache-2.0
- *
- * @namespace
- */
- var Hash = {
- /**
- * MD2 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runMD2: function (input, args) {
- return Utils.toHexFast(CryptoApi.hash("md2", input, {}));
- },
- /**
- * MD4 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runMD4: function (input, args) {
- return Utils.toHexFast(CryptoApi.hash("md4", input, {}));
- },
- /**
- * MD5 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runMD5: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray
- return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * SHA0 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA0: function (input, args) {
- return Utils.toHexFast(CryptoApi.hash("sha0", input, {}));
- },
- /**
- * SHA1 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA1: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * SHA224 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA224: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * SHA256 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA256: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- return CryptoJS.SHA256(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * SHA384 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA384: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- return CryptoJS.SHA384(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * SHA512 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA512: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- return CryptoJS.SHA512(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * @constant
- * @default
- */
- SHA3_LENGTH: ["512", "384", "256", "224"],
- /**
- * SHA3 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runSHA3: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- var sha3Length = args[0],
- options = {
- outputLength: parseInt(sha3Length, 10)
- };
- return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex);
- },
- /**
- * RIPEMD-160 operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runRIPEMD160: function (input, args) {
- input = CryptoJS.enc.Latin1.parse(input);
- return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex);
- },
- /**
- * @constant
- * @default
- */
- HMAC_FUNCTIONS: ["MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "RIPEMD-160"],
- /**
- * HMAC operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runHMAC: function (input, args) {
- var hashFunc = args[1];
- input = CryptoJS.enc.Latin1.parse(input);
- var execute = {
- "MD5": CryptoJS.HmacMD5(input, args[0]),
- "SHA1": CryptoJS.HmacSHA1(input, args[0]),
- "SHA224": CryptoJS.HmacSHA224(input, args[0]),
- "SHA256": CryptoJS.HmacSHA256(input, args[0]),
- "SHA384": CryptoJS.HmacSHA384(input, args[0]),
- "SHA512": CryptoJS.HmacSHA512(input, args[0]),
- "SHA3": CryptoJS.HmacSHA3(input, args[0]),
- "RIPEMD-160": CryptoJS.HmacRIPEMD160(input, args[0]),
- };
- return execute[hashFunc].toString(CryptoJS.enc.Hex);
- },
- /**
- * Generate all hashes operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runAll: function (input, args) {
- var byteArray = Utils.strToByteArray(input),
- output = "MD2: " + Hash.runMD2(input, []) +
- "\nMD4: " + Hash.runMD4(input, []) +
- "\nMD5: " + Hash.runMD5(input, []) +
- "\nSHA0: " + Hash.runSHA0(input, []) +
- "\nSHA1: " + Hash.runSHA1(input, []) +
- "\nSHA2 224: " + Hash.runSHA224(input, []) +
- "\nSHA2 256: " + Hash.runSHA256(input, []) +
- "\nSHA2 384: " + Hash.runSHA384(input, []) +
- "\nSHA2 512: " + Hash.runSHA512(input, []) +
- "\nSHA3 224: " + Hash.runSHA3(input, ["224"]) +
- "\nSHA3 256: " + Hash.runSHA3(input, ["256"]) +
- "\nSHA3 384: " + Hash.runSHA3(input, ["384"]) +
- "\nSHA3 512: " + Hash.runSHA3(input, ["512"]) +
- "\nRIPEMD-160: " + Hash.runRIPEMD160(input, []) +
- "\n\nChecksums:" +
- "\nFletcher-8: " + Checksum.runFletcher8(byteArray, []) +
- "\nFletcher-16: " + Checksum.runFletcher16(byteArray, []) +
- "\nFletcher-32: " + Checksum.runFletcher32(byteArray, []) +
- "\nFletcher-64: " + Checksum.runFletcher64(byteArray, []) +
- "\nAdler-32: " + Checksum.runAdler32(byteArray, []) +
- "\nCRC-32: " + Checksum.runCRC32(byteArray, []);
- return output;
- },
- /**
- * Analyse hash operation.
- *
- * @param {string} input
- * @param {Object[]} args
- * @returns {string}
- */
- runAnalyse: function(input, args) {
- input = input.replace(/\s/g, "");
- var output = "",
- byteLength = input.length / 2,
- bitLength = byteLength * 8,
- possibleHashFunctions = [];
- if (!/^[a-f0-9]+$/i.test(input)) {
- return "Invalid hash";
- }
- output += "Hash length: " + input.length + "\n" +
- "Byte length: " + byteLength + "\n" +
- "Bit length: " + bitLength + "\n\n" +
- "Based on the length, this hash could have been generated by one of the following hashing functions:\n";
- switch (bitLength) {
- case 4:
- possibleHashFunctions = [
- "Fletcher-4",
- "Luhn algorithm",
- "Verhoeff algorithm",
- ];
- break;
- case 8:
- possibleHashFunctions = [
- "Fletcher-8",
- ];
- break;
- case 16:
- possibleHashFunctions = [
- "BSD checksum",
- "CRC-16",
- "SYSV checksum",
- "Fletcher-16"
- ];
- break;
- case 32:
- possibleHashFunctions = [
- "CRC-32",
- "Fletcher-32",
- "Adler-32",
- ];
- break;
- case 64:
- possibleHashFunctions = [
- "CRC-64",
- "RIPEMD-64",
- "SipHash",
- ];
- break;
- case 128:
- possibleHashFunctions = [
- "MD5",
- "MD4",
- "MD2",
- "HAVAL-128",
- "RIPEMD-128",
- "Snefru",
- "Tiger-128",
- ];
- break;
- case 160:
- possibleHashFunctions = [
- "SHA-1",
- "SHA-0",
- "FSB-160",
- "HAS-160",
- "HAVAL-160",
- "RIPEMD-160",
- "Tiger-160",
- ];
- break;
- case 192:
- possibleHashFunctions = [
- "Tiger",
- "HAVAL-192",
- ];
- break;
- case 224:
- possibleHashFunctions = [
- "SHA-224",
- "SHA3-224",
- "ECOH-224",
- "FSB-224",
- "HAVAL-224",
- ];
- break;
- case 256:
- possibleHashFunctions = [
- "SHA-256",
- "SHA3-256",
- "BLAKE-256",
- "ECOH-256",
- "FSB-256",
- "GOST",
- "Grøstl-256",
- "HAVAL-256",
- "PANAMA",
- "RIPEMD-256",
- "Snefru",
- ];
- break;
- case 320:
- possibleHashFunctions = [
- "RIPEMD-320",
- ];
- break;
- case 384:
- possibleHashFunctions = [
- "SHA-384",
- "SHA3-384",
- "ECOH-384",
- "FSB-384",
- ];
- break;
- case 512:
- possibleHashFunctions = [
- "SHA-512",
- "SHA3-512",
- "BLAKE-512",
- "ECOH-512",
- "FSB-512",
- "Grøstl-512",
- "JH",
- "MD6",
- "Spectral Hash",
- "SWIFFT",
- "Whirlpool",
- ];
- break;
- case 1024:
- possibleHashFunctions = [
- "Fowler-Noll-Vo",
- ];
- break;
- default:
- possibleHashFunctions = [
- "Unknown"
- ];
- break;
- }
- return output + possibleHashFunctions.join("\n");
- },
- };
|