UNPKG

5.99 kBJavaScriptView Raw
1(function(){
2 var crypt = require('crypt'),
3 utf8 = require('charenc').utf8,
4 bin = require('charenc').bin,
5
6 // The core
7 md5 = function (message, options) {
8 // Convert to byte array
9 if (message.constructor == String)
10 if (options && options.encoding === 'binary')
11 message = bin.stringToBytes(message);
12 else
13 message = utf8.stringToBytes(message);
14 else if (typeof Buffer != 'undefined' &&
15 typeof Buffer.isBuffer == 'function' && Buffer.isBuffer(message))
16 message = Array.prototype.slice.call(message, 0);
17 else if (!Array.isArray(message))
18 message = message.toString();
19 // else, assume byte array already
20
21 var m = crypt.bytesToWords(message),
22 l = message.length * 8,
23 a = 1732584193,
24 b = -271733879,
25 c = -1732584194,
26 d = 271733878;
27
28 // Swap endian
29 for (var i = 0; i < m.length; i++) {
30 m[i] = ((m[i] << 8) | (m[i] >>> 24)) & 0x00FF00FF |
31 ((m[i] << 24) | (m[i] >>> 8)) & 0xFF00FF00;
32 }
33
34 // Padding
35 m[l >>> 5] |= 0x80 << (l % 32);
36 m[(((l + 64) >>> 9) << 4) + 14] = l;
37
38 // Method shortcuts
39 var FF = md5._ff,
40 GG = md5._gg,
41 HH = md5._hh,
42 II = md5._ii;
43
44 for (var i = 0; i < m.length; i += 16) {
45
46 var aa = a,
47 bb = b,
48 cc = c,
49 dd = d;
50
51 a = FF(a, b, c, d, m[i+ 0], 7, -680876936);
52 d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
53 c = FF(c, d, a, b, m[i+ 2], 17, 606105819);
54 b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
55 a = FF(a, b, c, d, m[i+ 4], 7, -176418897);
56 d = FF(d, a, b, c, m[i+ 5], 12, 1200080426);
57 c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
58 b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
59 a = FF(a, b, c, d, m[i+ 8], 7, 1770035416);
60 d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
61 c = FF(c, d, a, b, m[i+10], 17, -42063);
62 b = FF(b, c, d, a, m[i+11], 22, -1990404162);
63 a = FF(a, b, c, d, m[i+12], 7, 1804603682);
64 d = FF(d, a, b, c, m[i+13], 12, -40341101);
65 c = FF(c, d, a, b, m[i+14], 17, -1502002290);
66 b = FF(b, c, d, a, m[i+15], 22, 1236535329);
67
68 a = GG(a, b, c, d, m[i+ 1], 5, -165796510);
69 d = GG(d, a, b, c, m[i+ 6], 9, -1069501632);
70 c = GG(c, d, a, b, m[i+11], 14, 643717713);
71 b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
72 a = GG(a, b, c, d, m[i+ 5], 5, -701558691);
73 d = GG(d, a, b, c, m[i+10], 9, 38016083);
74 c = GG(c, d, a, b, m[i+15], 14, -660478335);
75 b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
76 a = GG(a, b, c, d, m[i+ 9], 5, 568446438);
77 d = GG(d, a, b, c, m[i+14], 9, -1019803690);
78 c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
79 b = GG(b, c, d, a, m[i+ 8], 20, 1163531501);
80 a = GG(a, b, c, d, m[i+13], 5, -1444681467);
81 d = GG(d, a, b, c, m[i+ 2], 9, -51403784);
82 c = GG(c, d, a, b, m[i+ 7], 14, 1735328473);
83 b = GG(b, c, d, a, m[i+12], 20, -1926607734);
84
85 a = HH(a, b, c, d, m[i+ 5], 4, -378558);
86 d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
87 c = HH(c, d, a, b, m[i+11], 16, 1839030562);
88 b = HH(b, c, d, a, m[i+14], 23, -35309556);
89 a = HH(a, b, c, d, m[i+ 1], 4, -1530992060);
90 d = HH(d, a, b, c, m[i+ 4], 11, 1272893353);
91 c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
92 b = HH(b, c, d, a, m[i+10], 23, -1094730640);
93 a = HH(a, b, c, d, m[i+13], 4, 681279174);
94 d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
95 c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
96 b = HH(b, c, d, a, m[i+ 6], 23, 76029189);
97 a = HH(a, b, c, d, m[i+ 9], 4, -640364487);
98 d = HH(d, a, b, c, m[i+12], 11, -421815835);
99 c = HH(c, d, a, b, m[i+15], 16, 530742520);
100 b = HH(b, c, d, a, m[i+ 2], 23, -995338651);
101
102 a = II(a, b, c, d, m[i+ 0], 6, -198630844);
103 d = II(d, a, b, c, m[i+ 7], 10, 1126891415);
104 c = II(c, d, a, b, m[i+14], 15, -1416354905);
105 b = II(b, c, d, a, m[i+ 5], 21, -57434055);
106 a = II(a, b, c, d, m[i+12], 6, 1700485571);
107 d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
108 c = II(c, d, a, b, m[i+10], 15, -1051523);
109 b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
110 a = II(a, b, c, d, m[i+ 8], 6, 1873313359);
111 d = II(d, a, b, c, m[i+15], 10, -30611744);
112 c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
113 b = II(b, c, d, a, m[i+13], 21, 1309151649);
114 a = II(a, b, c, d, m[i+ 4], 6, -145523070);
115 d = II(d, a, b, c, m[i+11], 10, -1120210379);
116 c = II(c, d, a, b, m[i+ 2], 15, 718787259);
117 b = II(b, c, d, a, m[i+ 9], 21, -343485551);
118
119 a = (a + aa) >>> 0;
120 b = (b + bb) >>> 0;
121 c = (c + cc) >>> 0;
122 d = (d + dd) >>> 0;
123 }
124
125 return crypt.endian([a, b, c, d]);
126 };
127
128 // Auxiliary functions
129 md5._ff = function (a, b, c, d, x, s, t) {
130 var n = a + (b & c | ~b & d) + (x >>> 0) + t;
131 return ((n << s) | (n >>> (32 - s))) + b;
132 };
133 md5._gg = function (a, b, c, d, x, s, t) {
134 var n = a + (b & d | c & ~d) + (x >>> 0) + t;
135 return ((n << s) | (n >>> (32 - s))) + b;
136 };
137 md5._hh = function (a, b, c, d, x, s, t) {
138 var n = a + (b ^ c ^ d) + (x >>> 0) + t;
139 return ((n << s) | (n >>> (32 - s))) + b;
140 };
141 md5._ii = function (a, b, c, d, x, s, t) {
142 var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
143 return ((n << s) | (n >>> (32 - s))) + b;
144 };
145
146 // Package private blocksize
147 md5._blocksize = 16;
148 md5._digestsize = 16;
149
150 module.exports = function (message, options) {
151 if(typeof message == 'undefined')
152 return;
153
154 var digestbytes = crypt.wordsToBytes(md5(message, options));
155 return options && options.asBytes ? digestbytes :
156 options && options.asString ? bin.bytesToString(digestbytes) :
157 crypt.bytesToHex(digestbytes);
158 };
159
160})();