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
+
+
+ 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