diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 0000000..9f80ad4 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000..57927c5 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/md6.iml b/.idea/md6.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/md6.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a745d9b --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..034e8a8 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + \t + for \((.+) in + + + + + + + + + + + + + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + + + + + + + + + + + + + + project + + + true + + + + DIRECTORY + + false + + + + + + + + + + + + 1492038754719 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index b0098b8..5fbfdb2 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,14 @@ # md6 -md6 FTW +Forked from Snack-X/md6 ## Supports -* php +* Node.js +* javascript ## LICENSE +To the extent possible under law, [Amrit Panesar](https://github.com/Neo-Desktop) has waived all copyright +and related or neighboring rights to [node-md6](https://github.com/Neo-Desktop/md6#). -``` - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - - Copyright (C) 2014 Snack - - Everyone is permitted to copy and distribute verbatim or modified - copies of this license document, and changing it is allowed as long - as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. -``` \ No newline at end of file +This work is published from: United States. \ No newline at end of file diff --git a/md6.js b/md6.js index afb7be1..662cb3d 100644 --- a/md6.js +++ b/md6.js @@ -1,7 +1,10 @@ /** - * * md6hash for Javascript * + * Authors: Amrit Panesar [Neo-Desktop] + * Snack-X + * cuixiping + * * Usage : * var md6 = new md6hash(); * var data = "md6 FTW"; @@ -9,307 +12,324 @@ * console.log(result); // 7bfaa624f661a683be2a3b2007493006a30a7845ee1670e499927861a8e74cce * * For node.js: - * var md6hash = require("./md6").md6hash; + * var md6hash = require("node-md6"); * var md6 = new md6hash(); - * */ -var md6hash = function() { - function to_word(input) { - var i, length = input.length, output = []; - - for(i = 0; i < length; i += 8) { - output.push([ - ((input[i + 0] & 0xff) << 24) | - ((input[i + 1] & 0xff) << 16) | - ((input[i + 2] & 0xff) << 8) | - ((input[i + 3] & 0xff) << 0), - ((input[i + 4] & 0xff) << 24) | - ((input[i + 5] & 0xff) << 16) | - ((input[i + 6] & 0xff) << 8) | - ((input[i + 7] & 0xff) << 0) - ]); - } - - return output; - } - - function from_word(input) { - var i, length = input.length, output = []; - - for(i = 0 ; i < length ; i += 1) { - output.push((input[i][0] >> 24) & 0xff); - output.push((input[i][0] >> 16) & 0xff); - output.push((input[i][0] >> 8) & 0xff); - output.push((input[i][0] >> 0) & 0xff); - output.push((input[i][1] >> 24) & 0xff); - output.push((input[i][1] >> 16) & 0xff); - output.push((input[i][1] >> 8) & 0xff); - output.push((input[i][1] >> 0) & 0xff); - } - - return output; - } - - function _xor(x, y) { - return [x[0] ^ y[0], x[1] ^ y[1]]; - } - - function _and(x, y) { - return [x[0] & y[0], x[1] & y[1]]; - } - - function _shl(x, n) { - var a = x[0] | 0x0, b = x[1] | 0x0; - - if(n >= 32) { - return [(b << (n - 32)), 0x0]; - } - else { - return [((a << n) | (b >>> (32 - n))), (b << n)]; - } - } - - function _shr(x, n) { - var a = x[0] | 0x0, b = x[1] | 0x0; - - if(n >= 32) { - return [0x0, (a >>> (n - 32))]; - } - else { - return [(a >>> n), ((a << (32 - n)) | (b >>> n))]; - } - } - - function crop(size, hash, right) { - var length = Math.floor((size + 7) / 8), remain = size % 8; - - if(right) { - hash = hash.slice(hash.length - length); - } - else { - hash = hash.slice(0, length); - } - - if(remain > 0) { - hash[length - 1] &= (0xff << (8 - remain)) & 0xff; - } - - return hash; - } +var md6hash = function () { + function to_word(input) { + var i, length = input.length, output = []; - function _hash(size, data, key, levels) { - var b, c, n, d, M, K, k, r, L, ell, S0, Sm, Q, t, rs, ls; - - b = 512; - c = 128; - - n = 89; - - d = size; - M = data; - - K = key.slice(0, 64); - k = K.length; - - while (K.length < 64) { - K.push(0x00); - } - - K = to_word(K); - - r = Math.max((k ? 80 : 0), (40 + (d / 4))); - - L = levels; - ell = 0; - - S0 = [0x01234567, 0x89abcdef]; - Sm = [0x7311c281, 0x2425cfa0]; - - Q = [ - [0x7311c281, 0x2425cfa0], [0x64322864, 0x34aac8e7], [0xb60450e9, 0xef68b7c1], - [0xe8fb2390, 0x8d9f06f1], [0xdd2e76cb, 0xa691e5bf], [0x0cd0d63b, 0x2c30bc41], - [0x1f8ccf68, 0x23058f8a], [0x54e5ed5b, 0x88e3775d], [0x4ad12aae, 0x0a6d6031], - [0x3e7f16bb, 0x88222e0d], [0x8af8671d, 0x3fb50c2c], [0x995ad117, 0x8bd25c31], - [0xc878c1dd, 0x04c4b633], [0x3b72066c, 0x7a1552ac], [0x0d6f3522, 0x631effcb] - ]; - - t = [17, 18, 21, 31, 67, 89]; - rs = [10, 5, 13, 10, 11, 12, 2, 7, 14, 15, 7, 13, 11, 7, 6, 12]; - ls = [11, 24, 9, 16, 15, 9, 27, 15, 6, 2, 29, 8, 15, 5, 31, 9]; - - function f(N) { - var i, j, s, x, S = [].concat(S0), A = [].concat(N); - - for(j = 0, i = n ; j < r ; j += 1, i += 16) { - for(s = 0 ; s < 16 ; s += 1) { - x = [].concat(S); - x = _xor(x, A[i + s - t[5]]); - x = _xor(x, A[i + s - t[0]]); - x = _xor(x, _and(A[i + s - t[1]], A[i + s - t[2]])); - x = _xor(x, _and(A[i + s - t[3]], A[i + s - t[4]])); - x = _xor(x, _shr(x, rs[s])); - A[i + s] = _xor(x, _shl(x, ls[s])); - } - - S = _xor(_xor(_shl(S, 1), _shr(S, (64 - 1))), _and(S, Sm)); - } - - return A.slice(A.length - 16); - } - - function mid(B, C, i, p, z) { - var U, V; - - U = [ - ((ell & 0xff) << 24) | ((i / Math.pow(2, 32)) & 0xffffff), - i & 0xffffffff - ]; - - V = [ - ((r & 0xfff) << 16) | ((L & 0xff) << 8) | ((z & 0xf) << 4) | ((p & 0xf000) >> 12), - (((p & 0xfff) << 20) | ((k & 0xff) << 12) | ((d & 0xfff))) - ]; - - return f([].concat(Q, K, [U, V], C, B)); - } - - function par(M) { - var i, l, p, z, P = 0, B = [], C = []; - z = (M.length > b ? 0 : 1); - - while((M.length < 1) || ((M.length % b) > 0)) { - M.push(0x00); - P += 8; - } + for (i = 0; i < length; i += 8) { + output.push([ + ((input[i] & 0xff) << 24) | ((input[i + 1] & 0xff) << 16) | + ((input[i + 2] & 0xff) << 8) | ((input[i + 3] & 0xff) << 0), - M = to_word(M); - - while(M.length > 0) { - B.push(M.slice(0, (b / 8))); - M = M.slice(b / 8); - } - - for(i = 0, p = 0, l = B.length ; i < l ; i += 1, p = 0) { - p = (i === (B.length - 1)) ? P : 0; - C = C.concat(mid(B[i], [], i, p, z)); - } - - return from_word(C); - } - - function seq(M) { - var i, l, p, z, P = 0, B = [], C = [ - [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], - [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], - [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], - [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0] - ]; - - while((M.length < 1) || ((M.length % (b - c)) > 0)) { - M.push(0x00); - P += 8; - } + ((input[i + 4] & 0xff) << 24) | ((input[i + 5] & 0xff) << 16) | + ((input[i + 6] & 0xff) << 8) | ((input[i + 7] & 0xff) << 0) + ]); + } - M = to_word(M); - - while(M.length > 0) { - B.push(M.slice(0, ((b - c) / 8))); - M = M.slice((b - c) / 8); - } - - for(i = 0, p = 0, l = B.length ; i < l ; i += 1, p = 0) { - p = (i === (B.length - 1)) ? P : 0; - z = (i === (B.length - 1)) ? 1 : 0; - C = mid(B[i], C, i, p, z); - } - - return from_word(C); - } - - do { - ell += 1; + return output; + } - M = ell > L ? seq(M) : par(M); - } while(M.length !== c); - - return crop(d, M, true); - } + function from_word(input) { + var i, length = input.length, output = []; - function bytes(input) { - var output = [], i, ch; + for (i = 0; i < length; i += 1) { + output.push((input[i][0] >> 24) & 0xff); + output.push((input[i][0] >> 16) & 0xff); + output.push((input[i][0] >> 8) & 0xff); + output.push((input[i][0] >> 0) & 0xff); + output.push((input[i][1] >> 24) & 0xff); + output.push((input[i][1] >> 16) & 0xff); + output.push((input[i][1] >> 8) & 0xff); + output.push((input[i][1] >> 0) & 0xff); + } - for(i = 0 ; i < input.length ; i++) { - ch = input.charCodeAt(i); - if(ch <= 0x7f) { - output.push(ch); - } - else if(ch <= 0x7ff) { - output.push((ch >> 6) | 0xc0); - output.push((ch & 0x3F) | 0x80); - } - else if(ch <= 0xffff) { - output.push((ch >> 12) | 0xe0); - output.push(((ch >> 6) & 0x3f) | 0x80); - output.push((ch & 0x3f) | 0x80); - } - else { - output.push((ch >> 18) | 0xf0); - output.push(((ch >> 12) & 0x3f) | 0x80); - output.push(((ch >> 6) & 0x3f) | 0x80); - output.push((ch & 0x3f) | 0x80); - } - } + return output; + } - return output; - } + function _xor(x, y) { + return [ + x[0] ^ y[0], + x[1] ^ y[1] + ]; + } - function _prehash(data, size, key, levels) { - if(typeof data === "undefined") data = ""; - if(typeof size === "undefined") size = 256; - if(typeof key === "undefined") key = ""; - if(typeof levels === "undefined") levels = 64; + function _and(x, y) { + return [ + x[0] & y[0], + x[1] & y[1] + ]; + } - data = bytes(data); - key = bytes(key); + function _shl(x, n) { + var a = x[0] | 0x0, + b = x[1] | 0x0; - if(size <= 0) size = 1; - else if(size > 512) size = 512; + if (n >= 32) { + return [ + (b << (n - 32)), + 0x0 + ]; + } + else { + return [ + ((a << n) | (b >>> (32 - n))), + (b << n) + ]; + } + } - return _hash(size, data, key, levels); - } + function _shr(x, n) { + var a = x[0] | 0x0, + b = x[1] | 0x0; - function _hex(data, size, key, levels) { - var hash = _prehash(data, size, key, levels); - var hex = ""; - var i; + if (n >= 32) { + return [ + 0x0, + (a >>> (n - 32)) + ]; + } + else { + return [ + (a >>> n), + ((a << (32 - n)) | (b >>> n)) + ]; + } + } - for(i in hash) { - var v = hash[i]; - var x = v.toString(16); - if(x.length === 1) x = "0" + x; - hex += x; - } + function crop(size, hash, right) { + var length = Math.floor((size + 7) / 8), + remain = size % 8; - return hex; - } + if (right) { + hash = hash.slice(hash.length - length); + } + else { + hash = hash.slice(0, length); + } - function _raw(data, size, key, levels) { - var hash = _prehash(data, size, key, levels); - var raw = ""; - var i; + if (remain > 0) { + hash[length - 1] &= (0xff << (8 - remain)) & 0xff; + } - for(i in hash) { - var v = hash[i]; - raw += String.fromCharCode(v); - } + return hash; + } - return raw; - } + function _hash(size, data, key, levels) { + var b, c, n, d, M, K, k, r, L, ell, S0, Sm, Q, t, rs, ls; - return { - hex: _hex, - raw: _raw - }; + b = 512; + c = 128; + + n = 89; + + d = size; + M = data; + + K = key.slice(0, 64); + k = K.length; + + while (K.length < 64) { + K.push(0x00); + } + + K = to_word(K); + + r = Math.max((k ? 80 : 0), (40 + (d / 4))); + + L = levels; + ell = 0; + + S0 = [0x01234567, 0x89abcdef]; + Sm = [0x7311c281, 0x2425cfa0]; + + Q = [ + [0x7311c281, 0x2425cfa0], [0x64322864, 0x34aac8e7], [0xb60450e9, 0xef68b7c1], + [0xe8fb2390, 0x8d9f06f1], [0xdd2e76cb, 0xa691e5bf], [0x0cd0d63b, 0x2c30bc41], + [0x1f8ccf68, 0x23058f8a], [0x54e5ed5b, 0x88e3775d], [0x4ad12aae, 0x0a6d6031], + [0x3e7f16bb, 0x88222e0d], [0x8af8671d, 0x3fb50c2c], [0x995ad117, 0x8bd25c31], + [0xc878c1dd, 0x04c4b633], [0x3b72066c, 0x7a1552ac], [0x0d6f3522, 0x631effcb] + ]; + + t = [17, 18, 21, 31, 67, 89]; + rs = [10, 5, 13, 10, 11, 12, 2, 7, 14, 15, 7, 13, 11, 7, 6, 12]; + ls = [11, 24, 9, 16, 15, 9, 27, 15, 6, 2, 29, 8, 15, 5, 31, 9]; + + function f(N) { + var i, j, s, x, S = [].concat(S0), A = [].concat(N); + + for (j = 0, i = n; j < r; j += 1, i += 16) { + for (s = 0; s < 16; s += 1) { + x = [].concat(S); + x = _xor(x, A[i + s - t[5]]); + x = _xor(x, A[i + s - t[0]]); + x = _xor(x, _and(A[i + s - t[1]], A[i + s - t[2]])); + x = _xor(x, _and(A[i + s - t[3]], A[i + s - t[4]])); + x = _xor(x, _shr(x, rs[s])); + A[i + s] = _xor(x, _shl(x, ls[s])); + } + + S = _xor(_xor(_shl(S, 1), _shr(S, (64 - 1))), _and(S, Sm)); + } + + return A.slice(A.length - 16); + } + + function mid(B, C, i, p, z) { + var U, V; + + U = [ + ((ell & 0xff) << 24) | ((i / Math.pow(2, 32)) & 0xffffff), + i & 0xffffffff + ]; + + V = [ + ((r & 0xfff) << 16) | ((L & 0xff) << 8) | ((z & 0xf) << 4) | ((p & 0xf000) >> 12), + (((p & 0xfff) << 20) | ((k & 0xff) << 12) | ((d & 0xfff))) + ]; + + return f([].concat(Q, K, [U, V], C, B)); + } + + function par(M) { + var i, l, p, z, P = 0, B = [], C = []; + z = (M.length > b ? 0 : 1); + + while ((M.length < 1) || ((M.length % b) > 0)) { + M.push(0x00); + P += 8; + } + + M = to_word(M); + + while (M.length > 0) { + B.push(M.slice(0, (b / 8))); + M = M.slice(b / 8); + } + + for (i = 0, p = 0, l = B.length; i < l; i += 1, p = 0) { + p = (i === (B.length - 1)) ? P : 0; + C = C.concat(mid(B[i], [], i, p, z)); + } + + return from_word(C); + } + + function seq(M) { + var i, l, p, z, P = 0, B = [], C = [ + [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], + [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], + [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], + [0x0, 0x0], [0x0, 0x0], [0x0, 0x0], [0x0, 0x0] + ]; + + while ((M.length < 1) || ((M.length % (b - c)) > 0)) { + M.push(0x00); + P += 8; + } + + M = to_word(M); + + while (M.length > 0) { + B.push(M.slice(0, ((b - c) / 8))); + M = M.slice((b - c) / 8); + } + + for (i = 0, p = 0, l = B.length; i < l; i += 1, p = 0) { + p = (i === (B.length - 1)) ? P : 0; + z = (i === (B.length - 1)) ? 1 : 0; + C = mid(B[i], C, i, p, z); + } + + return from_word(C); + } + + do { + ell += 1; + M = ell > L ? seq(M) : par(M); + } + while (M.length !== c); + + return crop(d, M, true); + } + + function bytes(input) { + var output = [], i, ch; + + for (i = 0; i < input.length; i++) { + ch = input.charCodeAt(i); + if (ch <= 0x7f) { + output.push(ch); + } + else if (ch <= 0x7ff) { + output.push((ch >> 6) | 0xc0); + output.push((ch & 0x3F) | 0x80); + } + else if (ch <= 0xffff) { + output.push((ch >> 12) | 0xe0); + output.push(((ch >> 6) & 0x3f) | 0x80); + output.push((ch & 0x3f) | 0x80); + } + else { + output.push((ch >> 18) | 0xf0); + output.push(((ch >> 12) & 0x3f) | 0x80); + output.push(((ch >> 6) & 0x3f) | 0x80); + output.push((ch & 0x3f) | 0x80); + } + } + + return output; + } + + function _prehash(data, size, key, levels) { + if (typeof data === "undefined") data = ""; + if (typeof size === "undefined") size = 256; + if (typeof key === "undefined") key = ""; + if (typeof levels === "undefined") levels = 64; + + data = bytes(data); + key = bytes(key); + + if (size <= 0) size = 1; + else if (size > 512) size = 512; + + return _hash(size, data, key, levels); + } + + function _hex(data, size, key, levels) { + var hash = _prehash(data, size, key, levels); + var hex = ""; + var i; + + for (i = 0; i < hash.length; i++) { + var v = hash[i]; + var x = v.toString(16); + if (x.length === 1) x = "0" + x; + hex += x; + } + + return hex; + } + + function _raw(data, size, key, levels) { + var hash = _prehash(data, size, key, levels); + var raw = ""; + var i; + + for (i = 0; i < hash.length; i++) { + var v = hash[i]; + raw += String.fromCharCode(v); + } + + return raw; + } + + return { + hex: _hex, + raw: _raw + }; }; -if(typeof exports !== "undefined") exports.md6hash = md6hash; +if (typeof exports !== "undefined") exports = md6hash; diff --git a/md6.php b/md6.php deleted file mode 100644 index 66f203c..0000000 --- a/md6.php +++ /dev/null @@ -1,267 +0,0 @@ -hex($data); - * echo $result; // 7bfaa624f661a683be2a3b2007493006a30a7845ee1670e499927861a8e74cce - * - */ -class md6hash { - private function to_word($input) { - $output = array(); - - for($i = 0 ; $i < count($input) ; $i += 8) { - array_push($output, array( - (($input[$i ] << 24) | ($input[$i+1] << 16) | ($input[$i+2] << 8) | ($input[$i+3])), - (($input[$i+4] << 24) | ($input[$i+5] << 16) | ($input[$i+6] << 8) | ($input[$i+7])) - )); - } - - return $output; - } - - private function from_word($input) { - $output = array(); - - for($i = 0 ; $i < count($input) ; $i += 1) { - array_push($output, ($input[$i][0] >> 24) & 0xff); - array_push($output, ($input[$i][0] >> 16) & 0xff); - array_push($output, ($input[$i][0] >> 8) & 0xff); - array_push($output, ($input[$i][0] >> 0) & 0xff); - array_push($output, ($input[$i][1] >> 24) & 0xff); - array_push($output, ($input[$i][1] >> 16) & 0xff); - array_push($output, ($input[$i][1] >> 8) & 0xff); - array_push($output, ($input[$i][1] >> 0) & 0xff); - } - - return $output; - } - - private function _xor($x, $y) { - return array($x[0] ^ $y[0], $x[1] ^ $y[1]); - } - - private function _and($x, $y) { - return array($x[0] & $y[0], $x[1] & $y[1]); - } - private function _shl($x, $n) { - $a = $x[0]; - $b = $x[1]; - - if($n >= 32) { - return array(($b << ($n - 32)) & 0xffffffff, 0x00000000); - } - else { - return array((($a << $n) | ($b >> (32 - $n))) & 0xffffffff, ($b << $n) & 0xffffffff); - } - } - - private function _shr($x, $n) { - $a = $x[0]; - $b = $x[1]; - - if($n >= 32) { - return array(0x00000000, $a >> ($n - 32)); - } - else { - return array(($a >> $n) & 0xffffffff, (($a << (32 - $n)) | ($b >> $n)) & 0xffffffff); - } - } - - private function crop($size, $hash, $right = false) { - $length = floor(($size + 7) / 8); - $remain = $size % 8; - - if($right) { - $hash = array_slice($hash, count($hash) - $length); - } - else { - $hash = array_slice($hash, 0, $length); - } - if($remain > 0) { - $hash[$length - 1] &= (0xff << (8 - $remain)) & 0xff; - } - - return $hash; - } - - private function bytes($input) { - $output = array(); - $length = strlen($input); - - for($i = 0 ; $i < $length ; $i++) { - array_push($output, ord($input[$i])); - } - - return $output; - } - - private function f($N) { - $S = array_merge(array(), $this->S0); - $A = array_merge(array(), $N); - - for($j = 0, $i = $this->n ; $j < $this->r ; $j += 1, $i += 16) { - for($s = 0 ; $s < 16 ; $s += 1) { - $x = array_merge(array(), $S); - $x = $this->_xor($x, $A[$i + $s - $this->t[5]]); - $x = $this->_xor($x, $A[$i + $s - $this->t[0]]); - $x = $this->_xor($x, $this->_and($A[$i + $s - $this->t[1]], $A[$i + $s - $this->t[2]])); - $x = $this->_xor($x, $this->_and($A[$i + $s - $this->t[3]], $A[$i + $s - $this->t[4]])); - $x = $this->_xor($x, $this->_shr($x, $this->rs[$s])); - $A[$i + $s] = $this->_xor($x, $this->_shl($x, $this->ls[$s])); - } - - $S = $this->_xor($this->_xor($this->_shl($S, 1), $this->_shr($S, 63)), $this->_and($S, $this->Sm)); - } - return array_slice($A, count($A) - 16); - } - - private function mid($B, $C, $i, $p, $z) { - $U = array( - (($this->ell & 0xff) << 24) | (($i / 0xffffffff) & 0xffffff), - $i & 0xffffffff - ); - - $V = array( - (($this->r & 0xfff) << 16) | (($this->L & 0xff) << 8) | (($z & 0xf) << 4) | (($p & 0xf000) >> 12), - (($p & 0xfff) << 20) | (($this->k & 0xff) << 12) | (($this->d & 0xfff)) - ); - - return $this->f(array_merge($this->Q, $this->K, array($U, $V), $C, $B)); - } - - private function par($M) { - $P = 0; - $B = array(); - $C = array(); - - $z = count($M) > $this->b ? 0 : 1; - - while(count($M) < 1 || (count($M) % $this->b) > 0) { - array_push($M, 0x00); - $P += 8; - } - - $M = $this->to_word($M); - - while(count($M) > 0) { - array_push($B, array_slice($M, 0, ($this->b / 8))); - $M = array_slice($M, $this->b / 8); - } - - for($i = 0, $p = 0, $l = count($B) ; $i < $l ; $i += 1, $p = 0) { - $p = ($i === (count($B) - 1)) ? $P : 0; - $C = array_merge($C, $this->mid($B[$i], array(), $i, $p, $z)); - } - - return $this->from_word($C); - } - - private function seq($M) { - $P = 0; - $B = array(); - $C = array( - array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), - array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), - array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), - array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0), array(0x0, 0x0) - ); - - while(count($M) < 1 || (count($M) % ($this->b - $this->c)) > 0) { - array_push($M, 0x00); - $P += 8; - } - - $M = $this->to_word($M); - - while(count($M) > 0) { - array_push($B, array_slice($M, 0, (($this->b - $this->c) / 8))); - $M = array_slice(($this->b - $this->c) / 8); - } - - for($i = 0, $p = 0, $l = count($B) ; $i < $l ; $i += 1, $p = 0) { - $p = ($i === (count($B) - 1)) ? $P : 0; - $z = ($i === (count($B) - 1)) ? 1 : 0; - $C = $this->mid($B[$i], $C, $i, $p, $z); - } - - return $this->from_word($C); - } - - private $b, $c, $n, $d, $K, $k, $r, $L, $ell, $S0, $Sm, $Q, $t, $rs, $ls; - - private function _hash($data, $size, $key, $levels) { - $this->b = 512; - $this->c = 128; - - $this->n = 89; - - $this->d = $size; - $this->M = $data; - - $this->K = array_slice($key, 0, 64); - $this->k = count($this->K); - - while(count($this->K) < 64) { - array_push($this->K, 0x00); - } - - $this->K = $this->to_word($this->K); - - $this->r = max(($this->k ? 80 : 0), (40 + ($this->d / 4))); - - $this->L = $levels; - $this->ell = 0; - - $this->S0 = array(0x01234567, 0x89abcdef); - $this->Sm = array(0x7311c281, 0x2425cfa0); - - $this->Q = array( - array(0x7311c281, 0x2425cfa0), array(0x64322864, 0x34aac8e7), array(0xb60450e9, 0xef68b7c1), - array(0xe8fb2390, 0x8d9f06f1), array(0xdd2e76cb, 0xa691e5bf), array(0x0cd0d63b, 0x2c30bc41), - array(0x1f8ccf68, 0x23058f8a), array(0x54e5ed5b, 0x88e3775d), array(0x4ad12aae, 0x0a6d6031), - array(0x3e7f16bb, 0x88222e0d), array(0x8af8671d, 0x3fb50c2c), array(0x995ad117, 0x8bd25c31), - array(0xc878c1dd, 0x04c4b633), array(0x3b72066c, 0x7a1552ac), array(0x0d6f3522, 0x631effcb) - ); - - $this->t = array(17, 18, 21, 31, 67, 89); - $this->rs = array(10, 5, 13, 10, 11, 12, 2, 7, 14, 15, 7, 13, 11, 7, 6, 12); - $this->ls = array(11, 24, 9, 16, 15, 9, 27, 15, 6, 2, 29, 8, 15, 5, 31, 9); - - do { - $this->ell += 1; - - $this->M = $this->ell > $this->L ? $this->seq($this->M) : $this->par($this->M); - } while(count($this->M) !== $this->c); - - return $this->crop($this->d, $this->M, true); - } - - private function _prehash($data, $size, $key, $levels) { - $data = $this->bytes($data); - $key = $this->bytes($key); - - if($size <= 0) $size = 1; - if($size > 512) $size = 512; - - return $this->_hash($data, $size, $key, $levels); - } - - public function hex($data = "", $size = 256, $key = "", $levels = 64) { - $hash = $this->_prehash($data, $size, $key, $levels); - $hex = ""; - foreach($hash as $v) $hex .= str_pad(dechex($v), 2, "0", STR_PAD_LEFT); - return $hex; - } - - public function raw($data = "", $size = 256, $key = "", $levels = 64) { - $hash = $this->_prehash($data, $size, $key, $levels); - $raw = ""; - foreach($hash as $v) $raw .= chr($v); - return $raw; - } -} \ No newline at end of file diff --git a/md6.py b/md6.py deleted file mode 100644 index 9c2a944..0000000 --- a/md6.py +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# md6hash for Python 2, 3 -# -# Usage: -# md6 = md6hash() -# data = "md6 FTW" -# result = md6.hex(data) -# print(result) -# - -import binascii - -class md6hash(): - def __to_word(self, i_byte): - length = len(i_byte) - o_word = [] - - for i in range(0, length, 8): - o_word.append( - ((i_byte[i + 0] & 0xff) << 56) | - ((i_byte[i + 1] & 0xff) << 48) | - ((i_byte[i + 2] & 0xff) << 40) | - ((i_byte[i + 3] & 0xff) << 32) | - ((i_byte[i + 4] & 0xff) << 24) | - ((i_byte[i + 5] & 0xff) << 16) | - ((i_byte[i + 6] & 0xff) << 8) | - ((i_byte[i + 7] & 0xff) << 0) - ) - - return o_word - - def __from_word(self, i_word): - length = len(i_word) - o_byte = [] - - for i in range(length): - o_byte.append((i_word[i] >> 56) & 0xff) - o_byte.append((i_word[i] >> 48) & 0xff) - o_byte.append((i_word[i] >> 40) & 0xff) - o_byte.append((i_word[i] >> 32) & 0xff) - o_byte.append((i_word[i] >> 24) & 0xff) - o_byte.append((i_word[i] >> 16) & 0xff) - o_byte.append((i_word[i] >> 8) & 0xff) - o_byte.append((i_word[i] >> 0) & 0xff) - - return o_byte - - def __crop(self, size, data, right): - length = int((size + 7) / 8) - remain = size % 8 - - if right: - data = data[len(data) - length:] - else: - data = data[:length] - - if remain > 0: - data[length - 1] &= (0xff << (8 - remain)) & 0xff - - return data - - def __hash(self, size, data, key, levels): - b = 512 - c = 128 - n = 89 - d = size - M = data - - K = key[:64] - k = len(K) - - while len(K) < 64: - K.append(0x00) - - K = self.__to_word(K) - - r = max(80 if k else 0, 40 + int(d / 4)) - - L = levels - ell = 0 - - S0 = 0x0123456789abcdef - Sm = 0x7311c2812425cfa0 - - Q = [ - 0x7311c2812425cfa0, 0x6432286434aac8e7, 0xb60450e9ef68b7c1, - 0xe8fb23908d9f06f1, 0xdd2e76cba691e5bf, 0x0cd0d63b2c30bc41, - 0x1f8ccf6823058f8a, 0x54e5ed5b88e3775d, 0x4ad12aae0a6d6031, - 0x3e7f16bb88222e0d, 0x8af8671d3fb50c2c, 0x995ad1178bd25c31, - 0xc878c1dd04c4b633, 0x3b72066c7a1552ac, 0x0d6f3522631effcb - ]; - - t = [17, 18, 21, 31, 67, 89] - rs = [10, 5, 13, 10, 11, 12, 2, 7, 14, 15, 7, 13, 11, 7, 6, 12] - ls = [11, 24, 9, 16, 15, 9, 27, 15, 6, 2, 29, 8, 15, 5, 31, 9] - - def f(N): - S = S0 - A = list(N) - - j = 0 - i = n - - while j < r: - for s in range(16): - x = S - x ^= A[i + s - t[5]] - x ^= A[i + s - t[0]] - x ^= A[i + s - t[1]] & A[i + s - t[2]] - x ^= A[i + s - t[3]] & A[i + s - t[4]] - x ^= x >> rs[s] - - if len(A) <= i + s: - while len(A) <= i + s: - A.append(0x00) - - A[i + s] = x ^ ((x << ls[s]) & 0xffffffffffffffff) - - S = (((S << 1) & 0xffffffffffffffff) ^ (S >> 63)) ^ (S & Sm) - - j += 1 - i += 16 - - return A[(len(A) - 16):] - - def mid(B, C, i, p, z): - U = ((ell & 0xff) << 56) | i & 0xffffffffffffff - V = ((r & 0xfff) << 48) | ((L & 0xff) << 40) | ((z & 0xf) << 36) | ((p & 0xffff) << 20) | ((k & 0xff) << 12) | (d & 0xfff) - - return f(Q + K + [U, V] + C + B) - - def par(M): - P = 0 - B = [] - C = [] - z = 0 if len(M) > b else 1 - - while len(M) < 1 or (len(M) % b) > 0: - M.append(0x00) - P += 8 - - M = self.__to_word(M) - - while len(M) > 0: - B.append(M[:int(b / 8)]) - M = M[int(b / 8):] - - i = 0 - p = 0 - l = len(B) - - while i < l: - p = P if i == (len(B) - 1) else 0 - C += mid(B[i], [], i, p, z) - - i += 1 - p = 0 - - return self.__from_word(C) - - def seq(M): - P = 0 - B = [] - C = [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0] - - while len(M) < 1 or (len(M) % (b - c)) > 0: - M.append(0x00) - P += 8 - - M = self.__to_word(M) - - while len(M) > 0: - B.append(M[:int((b - c) / 8)]) - M = M[int((b - c) / 8):] - - i = 0 - p = 0 - l = len(B) - - while i < l: - p = P if i == (len(B) - 1) else 0 - z = 1 if i == (len(B) - 1) else 0 - C = mid(B[i], C, i, p, z) - - i += 1 - p = 0 - - return self.__from_word(C) - - while True: - ell += 1 - M = seq(M) if ell > L else par(M) - - if len(M) == c: - break - - return self.__crop(d, M, True) - - def __bytes(self, i_str): - i_str = binascii.hexlify(i_str.encode("ascii")) - o_byte = [int(i_str[i:i+2], 16) for i in range(0, len(i_str), 2)] - - return o_byte - - def __prehash(self, data, size, key, levels): - data = self.__bytes(data) - key = self.__bytes(key) - - if size <= 0: - size = 1 - elif size > 512: - size = 512 - - return self.__hash(size, data, key, levels) - - def hex(self, data="", size=256, key="", levels=64): - byte = self.__prehash(data, size, key, levels) - hexstr = "" - - for i in byte: - hexstr += "%02x" % i - - return hexstr - - def raw(self, data="", size=256, key="", levels=64): - byte = self.__prehash(data, size, key, levels) - rawstr = "" - - for i in byte: - rawstr += chr(i) - - return rawstr \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..2ca4327 --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "node-md6", + "version": "0.0.1", + "description": "MD6 Implementation in Node", + "main": "md6.js", + "files": [ + "md6.js" + ], + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Neo-Desktop/md6.git" + }, + "keywords": [ + "node", + "cryptography", + "message", + "digest", + "6", + "md6", + "md6js" + ], + "author": "Amrit Panesar", + "license": "CC0-1.0", + "bugs": { + "url": "https://github.com/Neo-Desktop/md6/issues" + }, + "homepage": "https://github.com/Neo-Desktop/md6#readme" +} diff --git a/test/test.php b/test/test.php deleted file mode 100644 index 631dc4d..0000000 --- a/test/test.php +++ /dev/null @@ -1,23 +0,0 @@ -hex($data, $size); - - $total++; - if($hash === $comp) $ok++; -} - -echo "{$ok} / {$total} test(s) passed.".PHP_EOL; \ No newline at end of file diff --git a/test/test.py b/test/test.py deleted file mode 100644 index 7718e37..0000000 --- a/test/test.py +++ /dev/null @@ -1,24 +0,0 @@ -import sys -sys.path.append("..") - -from md6 import md6hash - -md6 = md6hash() -f = open("result.csv", "r") -result = f.readlines() -f.close() - -total = 0 -ok = 0 - -for line in result: - size, data, comp = line.strip().split(",") - size = int(size) - - hash = md6.hex(data, size) - - total += 1 - if hash == comp: - ok += 1 - -print "%d / %d test(s) passed." % (ok, total) \ No newline at end of file