Hash.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. import Utils from "../Utils.js";
  2. import CryptoJS from "crypto-js";
  3. import CryptoApi from "crypto-api";
  4. import MD6 from "node-md6";
  5. import Checksum from "./Checksum.js";
  6. /**
  7. * Hashing operations.
  8. *
  9. * @author n1474335 [n1474335@gmail.com]
  10. * @copyright Crown Copyright 2016
  11. * @license Apache-2.0
  12. *
  13. * @namespace
  14. */
  15. const Hash = {
  16. /**
  17. * MD2 operation.
  18. *
  19. * @param {string} input
  20. * @param {Object[]} args
  21. * @returns {string}
  22. */
  23. runMD2: function (input, args) {
  24. return Utils.toHexFast(CryptoApi.hash("md2", input, {}));
  25. },
  26. /**
  27. * MD4 operation.
  28. *
  29. * @param {string} input
  30. * @param {Object[]} args
  31. * @returns {string}
  32. */
  33. runMD4: function (input, args) {
  34. return Utils.toHexFast(CryptoApi.hash("md4", input, {}));
  35. },
  36. /**
  37. * MD5 operation.
  38. *
  39. * @param {string} input
  40. * @param {Object[]} args
  41. * @returns {string}
  42. */
  43. runMD5: function (input, args) {
  44. input = CryptoJS.enc.Latin1.parse(input); // Cast to WordArray
  45. return CryptoJS.MD5(input).toString(CryptoJS.enc.Hex);
  46. },
  47. /**
  48. * @constant
  49. * @default
  50. */
  51. MD6_SIZE: 256,
  52. /**
  53. * @constant
  54. * @default
  55. */
  56. MD6_LEVELS: 64,
  57. /**
  58. * MD6 operation.
  59. *
  60. * @param {string} input
  61. * @param {Object[]} args
  62. * @returns {string}
  63. */
  64. runMD6: function (input, args) {
  65. const size = args[0],
  66. levels = args[1],
  67. key = args[2];
  68. if (size < 0 || size > 512)
  69. return "Size must be between 0 and 512";
  70. if (levels < 0)
  71. return "Levels must be greater than 0";
  72. return MD6.getHashOfText(input, size, key, levels);
  73. },
  74. /**
  75. * SHA0 operation.
  76. *
  77. * @param {string} input
  78. * @param {Object[]} args
  79. * @returns {string}
  80. */
  81. runSHA0: function (input, args) {
  82. return Utils.toHexFast(CryptoApi.hash("sha0", input, {}));
  83. },
  84. /**
  85. * SHA1 operation.
  86. *
  87. * @param {string} input
  88. * @param {Object[]} args
  89. * @returns {string}
  90. */
  91. runSHA1: function (input, args) {
  92. input = CryptoJS.enc.Latin1.parse(input);
  93. return CryptoJS.SHA1(input).toString(CryptoJS.enc.Hex);
  94. },
  95. /**
  96. * @constant
  97. * @default
  98. */
  99. SHA2_SIZE: ["256", "512", "224", "384"],
  100. /**
  101. * SHA2 operation.
  102. *
  103. * @param {string} input
  104. * @param {Object[]} args
  105. * @returns {string}
  106. */
  107. runSHA2: function (input, args) {
  108. const size = parseInt(args[0], 10);
  109. let algo;
  110. switch (size) {
  111. case 224:
  112. algo = CryptoJS.SHA224;
  113. break;
  114. case 384:
  115. algo = CryptoJS.SHA384;
  116. break;
  117. case 256:
  118. algo = CryptoJS.SHA256;
  119. break;
  120. case 512:
  121. algo = CryptoJS.SHA512;
  122. break;
  123. default:
  124. return "Invalid size";
  125. }
  126. input = CryptoJS.enc.Latin1.parse(input);
  127. return algo(input).toString(CryptoJS.enc.Hex);
  128. },
  129. /**
  130. * @constant
  131. * @default
  132. */
  133. SHA3_SIZE: ["512", "384", "256", "224"],
  134. /**
  135. * SHA3 operation.
  136. *
  137. * @param {string} input
  138. * @param {Object[]} args
  139. * @returns {string}
  140. */
  141. runSHA3: function (input, args) {
  142. input = CryptoJS.enc.Latin1.parse(input);
  143. let sha3Length = args[0],
  144. options = {
  145. outputLength: parseInt(sha3Length, 10)
  146. };
  147. return CryptoJS.SHA3(input, options).toString(CryptoJS.enc.Hex);
  148. },
  149. /**
  150. * RIPEMD-160 operation.
  151. *
  152. * @param {string} input
  153. * @param {Object[]} args
  154. * @returns {string}
  155. */
  156. runRIPEMD160: function (input, args) {
  157. input = CryptoJS.enc.Latin1.parse(input);
  158. return CryptoJS.RIPEMD160(input).toString(CryptoJS.enc.Hex);
  159. },
  160. /**
  161. * @constant
  162. * @default
  163. */
  164. HMAC_FUNCTIONS: ["MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "SHA3", "RIPEMD-160"],
  165. /**
  166. * HMAC operation.
  167. *
  168. * @param {string} input
  169. * @param {Object[]} args
  170. * @returns {string}
  171. */
  172. runHMAC: function (input, args) {
  173. const hashFunc = args[1];
  174. input = CryptoJS.enc.Latin1.parse(input);
  175. const execute = {
  176. "MD5": CryptoJS.HmacMD5(input, args[0]),
  177. "SHA1": CryptoJS.HmacSHA1(input, args[0]),
  178. "SHA224": CryptoJS.HmacSHA224(input, args[0]),
  179. "SHA256": CryptoJS.HmacSHA256(input, args[0]),
  180. "SHA384": CryptoJS.HmacSHA384(input, args[0]),
  181. "SHA512": CryptoJS.HmacSHA512(input, args[0]),
  182. "SHA3": CryptoJS.HmacSHA3(input, args[0]),
  183. "RIPEMD-160": CryptoJS.HmacRIPEMD160(input, args[0]),
  184. };
  185. return execute[hashFunc].toString(CryptoJS.enc.Hex);
  186. },
  187. /**
  188. * Generate all hashes operation.
  189. *
  190. * @param {string} input
  191. * @param {Object[]} args
  192. * @returns {string}
  193. */
  194. runAll: function (input, args) {
  195. let byteArray = Utils.strToByteArray(input),
  196. output = "MD2: " + Hash.runMD2(input, []) +
  197. "\nMD4: " + Hash.runMD4(input, []) +
  198. "\nMD5: " + Hash.runMD5(input, []) +
  199. "\nMD6: " + Hash.runMD6(input, []) +
  200. "\nSHA0: " + Hash.runSHA0(input, []) +
  201. "\nSHA1: " + Hash.runSHA1(input, []) +
  202. "\nSHA2 224: " + Hash.runSHA2(input, ["224"]) +
  203. "\nSHA2 256: " + Hash.runSHA2(input, ["256"]) +
  204. "\nSHA2 384: " + Hash.runSHA2(input, ["384"]) +
  205. "\nSHA2 512: " + Hash.runSHA2(input, ["512"]) +
  206. "\nSHA3 224: " + Hash.runSHA3(input, ["224"]) +
  207. "\nSHA3 256: " + Hash.runSHA3(input, ["256"]) +
  208. "\nSHA3 384: " + Hash.runSHA3(input, ["384"]) +
  209. "\nSHA3 512: " + Hash.runSHA3(input, ["512"]) +
  210. "\nRIPEMD-160: " + Hash.runRIPEMD160(input, []) +
  211. "\n\nChecksums:" +
  212. "\nFletcher-8: " + Checksum.runFletcher8(byteArray, []) +
  213. "\nFletcher-16: " + Checksum.runFletcher16(byteArray, []) +
  214. "\nFletcher-32: " + Checksum.runFletcher32(byteArray, []) +
  215. "\nFletcher-64: " + Checksum.runFletcher64(byteArray, []) +
  216. "\nAdler-32: " + Checksum.runAdler32(byteArray, []) +
  217. "\nCRC-32: " + Checksum.runCRC32(byteArray, []);
  218. return output;
  219. },
  220. /**
  221. * Analyse hash operation.
  222. *
  223. * @param {string} input
  224. * @param {Object[]} args
  225. * @returns {string}
  226. */
  227. runAnalyse: function(input, args) {
  228. input = input.replace(/\s/g, "");
  229. let output = "",
  230. byteLength = input.length / 2,
  231. bitLength = byteLength * 8,
  232. possibleHashFunctions = [];
  233. if (!/^[a-f0-9]+$/i.test(input)) {
  234. return "Invalid hash";
  235. }
  236. output += "Hash length: " + input.length + "\n" +
  237. "Byte length: " + byteLength + "\n" +
  238. "Bit length: " + bitLength + "\n\n" +
  239. "Based on the length, this hash could have been generated by one of the following hashing functions:\n";
  240. switch (bitLength) {
  241. case 4:
  242. possibleHashFunctions = [
  243. "Fletcher-4",
  244. "Luhn algorithm",
  245. "Verhoeff algorithm",
  246. ];
  247. break;
  248. case 8:
  249. possibleHashFunctions = [
  250. "Fletcher-8",
  251. ];
  252. break;
  253. case 16:
  254. possibleHashFunctions = [
  255. "BSD checksum",
  256. "CRC-16",
  257. "SYSV checksum",
  258. "Fletcher-16"
  259. ];
  260. break;
  261. case 32:
  262. possibleHashFunctions = [
  263. "CRC-32",
  264. "Fletcher-32",
  265. "Adler-32",
  266. ];
  267. break;
  268. case 64:
  269. possibleHashFunctions = [
  270. "CRC-64",
  271. "RIPEMD-64",
  272. "SipHash",
  273. ];
  274. break;
  275. case 128:
  276. possibleHashFunctions = [
  277. "MD5",
  278. "MD4",
  279. "MD2",
  280. "HAVAL-128",
  281. "RIPEMD-128",
  282. "Snefru",
  283. "Tiger-128",
  284. ];
  285. break;
  286. case 160:
  287. possibleHashFunctions = [
  288. "SHA-1",
  289. "SHA-0",
  290. "FSB-160",
  291. "HAS-160",
  292. "HAVAL-160",
  293. "RIPEMD-160",
  294. "Tiger-160",
  295. ];
  296. break;
  297. case 192:
  298. possibleHashFunctions = [
  299. "Tiger",
  300. "HAVAL-192",
  301. ];
  302. break;
  303. case 224:
  304. possibleHashFunctions = [
  305. "SHA-224",
  306. "SHA3-224",
  307. "ECOH-224",
  308. "FSB-224",
  309. "HAVAL-224",
  310. ];
  311. break;
  312. case 256:
  313. possibleHashFunctions = [
  314. "SHA-256",
  315. "SHA3-256",
  316. "BLAKE-256",
  317. "ECOH-256",
  318. "FSB-256",
  319. "GOST",
  320. "Grøstl-256",
  321. "HAVAL-256",
  322. "PANAMA",
  323. "RIPEMD-256",
  324. "Snefru",
  325. ];
  326. break;
  327. case 320:
  328. possibleHashFunctions = [
  329. "RIPEMD-320",
  330. ];
  331. break;
  332. case 384:
  333. possibleHashFunctions = [
  334. "SHA-384",
  335. "SHA3-384",
  336. "ECOH-384",
  337. "FSB-384",
  338. ];
  339. break;
  340. case 512:
  341. possibleHashFunctions = [
  342. "SHA-512",
  343. "SHA3-512",
  344. "BLAKE-512",
  345. "ECOH-512",
  346. "FSB-512",
  347. "Grøstl-512",
  348. "JH",
  349. "MD6",
  350. "Spectral Hash",
  351. "SWIFFT",
  352. "Whirlpool",
  353. ];
  354. break;
  355. case 1024:
  356. possibleHashFunctions = [
  357. "Fowler-Noll-Vo",
  358. ];
  359. break;
  360. default:
  361. possibleHashFunctions = [
  362. "Unknown"
  363. ];
  364. break;
  365. }
  366. return output + possibleHashFunctions.join("\n");
  367. },
  368. };
  369. export default Hash;