4
Copyright (C) 2007 Apple Inc. All rights reserved.
6
Redistribution and use in source and binary forms, with or without
7
modification, are permitted provided that the following conditions
9
1. Redistributions of source code must retain the above copyright
10
notice, this list of conditions and the following disclaimer.
11
2. Redistributions in binary form must reproduce the above copyright
12
notice, this list of conditions and the following disclaimer in the
13
documentation and/or other materials provided with the distribution.
15
THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
<title>SunSpider crypto-md5</title>
39
var _sunSpiderStartDate = new Date();
42
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
43
* Digest Algorithm, as defined in RFC 1321.
44
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
45
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46
* Distributed under the BSD License
47
* See http://pajhome.org.uk/crypt/md5 for more info.
51
* Configurable variables. You may need to tweak these to be compatible with
52
* the server-side, but the defaults work in most cases.
54
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
55
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
56
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
59
* These are the functions you'll usually want to call
60
* They take string arguments and return either hex or base-64 encoded strings
62
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
63
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
64
function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
65
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
66
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
67
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
70
* Perform a simple self-test to see if the VM is working
72
function md5_vm_test()
74
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
78
* Calculate the MD5 of an array of little-endian words, and a bit length
80
function core_md5(x, len)
83
x[len >> 5] |= 0x80 << ((len) % 32);
84
x[(((len + 64) >>> 9) << 4) + 14] = len;
91
for(var i = 0; i < x.length; i += 16)
98
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
99
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
100
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
101
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
102
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
103
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
104
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
105
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
106
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
107
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
108
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
109
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
110
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
111
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
112
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
113
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
115
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
116
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
117
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
118
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
119
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
120
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
121
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
122
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
123
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
124
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
125
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
126
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
127
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
128
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
129
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
130
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
132
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
133
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
134
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
135
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
136
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
137
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
138
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
139
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
140
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
141
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
142
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
143
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
144
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
145
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
146
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
147
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
149
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
150
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
151
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
152
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
153
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
154
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
155
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
156
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
157
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
158
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
159
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
160
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
161
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
162
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
163
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
164
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
166
a = safe_add(a, olda);
167
b = safe_add(b, oldb);
168
c = safe_add(c, oldc);
169
d = safe_add(d, oldd);
171
return Array(a, b, c, d);
176
* These functions implement the four basic operations the algorithm uses.
178
function md5_cmn(q, a, b, x, s, t)
180
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
182
function md5_ff(a, b, c, d, x, s, t)
184
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
186
function md5_gg(a, b, c, d, x, s, t)
188
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
190
function md5_hh(a, b, c, d, x, s, t)
192
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
194
function md5_ii(a, b, c, d, x, s, t)
196
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
200
* Calculate the HMAC-MD5, of a key and some data
202
function core_hmac_md5(key, data)
204
var bkey = str2binl(key);
205
if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
207
var ipad = Array(16), opad = Array(16);
208
for(var i = 0; i < 16; i++)
210
ipad[i] = bkey[i] ^ 0x36363636;
211
opad[i] = bkey[i] ^ 0x5C5C5C5C;
214
var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
215
return core_md5(opad.concat(hash), 512 + 128);
219
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
220
* to work around bugs in some JS interpreters.
222
function safe_add(x, y)
224
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
225
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
226
return (msw << 16) | (lsw & 0xFFFF);
230
* Bitwise rotate a 32-bit number to the left.
232
function bit_rol(num, cnt)
234
return (num << cnt) | (num >>> (32 - cnt));
238
* Convert a string to an array of little-endian words
239
* If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
241
function str2binl(str)
244
var mask = (1 << chrsz) - 1;
245
for(var i = 0; i < str.length * chrsz; i += chrsz)
246
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
251
* Convert an array of little-endian words to a string
253
function binl2str(bin)
256
var mask = (1 << chrsz) - 1;
257
for(var i = 0; i < bin.length * 32; i += chrsz)
258
str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
263
* Convert an array of little-endian words to a hex string.
265
function binl2hex(binarray)
267
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
269
for(var i = 0; i < binarray.length * 4; i++)
271
str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
272
hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
278
* Convert an array of little-endian words to a base-64 string
280
function binl2b64(binarray)
282
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
284
for(var i = 0; i < binarray.length * 4; i += 3)
286
var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
287
| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
288
| ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
289
for(var j = 0; j < 4; j++)
291
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
292
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
298
var plainText = "Rebellious subjects, enemies to peace,\n\
299
Profaners of this neighbour-stained steel,--\n\
300
Will they not hear? What, ho! you men, you beasts,\n\
301
That quench the fire of your pernicious rage\n\
302
With purple fountains issuing from your veins,\n\
303
On pain of torture, from those bloody hands\n\
304
Throw your mistemper'd weapons to the ground,\n\
305
And hear the sentence of your moved prince.\n\
306
Three civil brawls, bred of an airy word,\n\
307
By thee, old Capulet, and Montague,\n\
308
Have thrice disturb'd the quiet of our streets,\n\
309
And made Verona's ancient citizens\n\
310
Cast by their grave beseeming ornaments,\n\
311
To wield old partisans, in hands as old,\n\
312
Canker'd with peace, to part your canker'd hate:\n\
313
If ever you disturb our streets again,\n\
314
Your lives shall pay the forfeit of the peace.\n\
315
For this time, all the rest depart away:\n\
316
You Capulet; shall go along with me:\n\
317
And, Montague, come you this afternoon,\n\
318
To know our further pleasure in this case,\n\
319
To old Free-town, our common judgment-place.\n\
320
Once more, on pain of death, all men depart."
322
for (var i = 0; i <4; i++) {
323
plainText += plainText;
326
var md5Output = hex_md5(plainText);
329
var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
331
document.getElementById("console").innerHTML = _sunSpiderInterval;