2
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
3
* Digest Algorithm, as defined in RFC 1321.
4
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
5
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
6
* Distributed under the BSD License
7
* See http://pajhome.org.uk/crypt/md5 for more info.
11
* Configurable variables. You may need to tweak these to be compatible with
12
* the server-side, but the defaults work in most cases.
14
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
15
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
16
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
19
* These are the functions you'll usually want to call
20
* They take string arguments and return either hex or base-64 encoded strings
22
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
23
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
24
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
25
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
26
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
27
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
30
* Perform a simple self-test to see if the VM is working
32
function md5_vm_test()
34
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
38
* Calculate the MD5 of an array of little-endian words, and a bit length
40
function core_md5(x, len)
43
x[len >> 5] |= 0x80 << ((len) % 32);
44
x[(((len + 64) >>> 9) << 4) + 14] = len;
52
for(var i = 0; i < x.length; i += 16)
59
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
60
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
61
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
62
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
63
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
64
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
65
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
66
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
67
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
68
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
69
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
70
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
71
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
72
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
73
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
74
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
76
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
77
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
78
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
79
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
80
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
81
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
82
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
83
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
84
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
85
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
86
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
87
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
88
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
89
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
90
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
91
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
93
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
94
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
95
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
96
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
97
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
98
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
99
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
100
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
101
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
102
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
103
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
104
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
105
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
106
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
107
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
108
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
110
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
111
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
112
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
113
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
114
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
115
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
116
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
117
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
118
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
119
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
120
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
121
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
122
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
123
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
124
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
125
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
127
a = safe_add(a, olda);
128
b = safe_add(b, oldb);
129
c = safe_add(c, oldc);
130
d = safe_add(d, oldd);
133
return Array(a, b, c, d);
138
* These functions implement the four basic operations the algorithm uses.
140
function md5_cmn(q, a, b, x, s, t)
142
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
144
function md5_ff(a, b, c, d, x, s, t)
146
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
148
function md5_gg(a, b, c, d, x, s, t)
150
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
152
function md5_hh(a, b, c, d, x, s, t)
154
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
156
function md5_ii(a, b, c, d, x, s, t)
158
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
162
* Calculate the HMAC-MD5, of a key and some data
164
function core_hmac_md5(key, data)
166
var bkey = str2binl(key);
167
if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
169
var ipad = Array(16), opad = Array(16);
171
for(var i = 0; i < 16; i++)
173
ipad[i] = bkey[i] ^ 0x36363636;
174
opad[i] = bkey[i] ^ 0x5C5C5C5C;
178
var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
179
return core_md5(opad.concat(hash), 512 + 128);
183
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
184
* to work around bugs in some JS interpreters.
186
function safe_add(x, y)
188
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
189
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
190
return (msw << 16) | (lsw & 0xFFFF);
194
* Bitwise rotate a 32-bit number to the left.
196
function bit_rol(num, cnt)
198
return (num << cnt) | (num >>> (32 - cnt));
202
* Convert a string to an array of little-endian words
203
* If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
205
function str2binl(str)
208
var mask = (1 << chrsz) - 1;
210
for(var i = 0; i < str.length * chrsz; i += chrsz)
211
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
217
* Convert an array of little-endian words to a string
219
function binl2str(bin)
222
var mask = (1 << chrsz) - 1;
224
for(var i = 0; i < bin.length * 32; i += chrsz)
225
str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
231
* Convert an array of little-endian words to a hex string.
233
function binl2hex(binarray)
235
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
238
for(var i = 0; i < binarray.length * 4; i++)
240
str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
241
hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
248
* Convert an array of little-endian words to a base-64 string
250
function binl2b64(binarray)
252
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
255
for(var i = 0; i < binarray.length * 4; i += 3)
257
var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
258
| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
259
| ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
261
for(var j = 0; j < 4; j++)
263
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
264
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
272
var plainText = "Rebellious subjects, enemies to peace,\n\
273
Profaners of this neighbour-stained steel,--\n\
274
Will they not hear? What, ho! you men, you beasts,\n\
275
That quench the fire of your pernicious rage\n\
276
With purple fountains issuing from your veins,\n\
277
On pain of torture, from those bloody hands\n\
278
Throw your mistemper'd weapons to the ground,\n\
279
And hear the sentence of your moved prince.\n\
280
Three civil brawls, bred of an airy word,\n\
281
By thee, old Capulet, and Montague,\n\
282
Have thrice disturb'd the quiet of our streets,\n\
283
And made Verona's ancient citizens\n\
284
Cast by their grave beseeming ornaments,\n\
285
To wield old partisans, in hands as old,\n\
286
Canker'd with peace, to part your canker'd hate:\n\
287
If ever you disturb our streets again,\n\
288
Your lives shall pay the forfeit of the peace.\n\
289
For this time, all the rest depart away:\n\
290
You Capulet; shall go along with me:\n\
291
And, Montague, come you this afternoon,\n\
292
To know our further pleasure in this case,\n\
293
To old Free-town, our common judgment-place.\n\
294
Once more, on pain of death, all men depart."
297
for (var i = 0; i <4; i++) {
298
plainText += plainText;
302
var md5Output = hex_md5(plainText);