Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /*
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.
8 */
10 /*
11 * Configurable variables. You may need to tweak these to be compatible with
12 * the server-side, but the defaults work in most cases.
13 */
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 */
18 /*
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
21 */
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)); }
29 /*
30 * Perform a simple self-test to see if the VM is working
31 */
32 function md5_vm_test()
33 {
34 return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
35 }
37 /*
38 * Calculate the MD5 of an array of little-endian words, and a bit length
39 */
40 function core_md5(x, len)
41 {
42 /* append padding */
43 x[len >> 5] |= 0x80 << ((len) % 32);
44 x[(((len + 64) >>> 9) << 4) + 14] = len;
46 var a = 1732584193;
47 var b = -271733879;
48 var c = -1732584194;
49 var d = 271733878;
51 /* BEGIN LOOP */
52 for(var i = 0; i < x.length; i += 16)
53 {
54 var olda = a;
55 var oldb = b;
56 var oldc = c;
57 var oldd = d;
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);
131 }
132 /* END LOOP */
133 return Array(a, b, c, d);
135 }
137 /*
138 * These functions implement the four basic operations the algorithm uses.
139 */
140 function md5_cmn(q, a, b, x, s, t)
141 {
142 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
143 }
144 function md5_ff(a, b, c, d, x, s, t)
145 {
146 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
147 }
148 function md5_gg(a, b, c, d, x, s, t)
149 {
150 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
151 }
152 function md5_hh(a, b, c, d, x, s, t)
153 {
154 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
155 }
156 function md5_ii(a, b, c, d, x, s, t)
157 {
158 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
159 }
161 /*
162 * Calculate the HMAC-MD5, of a key and some data
163 */
164 function core_hmac_md5(key, data)
165 {
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);
170 /* BEGIN LOOP */
171 for(var i = 0; i < 16; i++)
172 {
173 ipad[i] = bkey[i] ^ 0x36363636;
174 opad[i] = bkey[i] ^ 0x5C5C5C5C;
175 }
176 /* END LOOP */
178 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
179 return core_md5(opad.concat(hash), 512 + 128);
180 }
182 /*
183 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
184 * to work around bugs in some JS interpreters.
185 */
186 function safe_add(x, y)
187 {
188 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
189 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
190 return (msw << 16) | (lsw & 0xFFFF);
191 }
193 /*
194 * Bitwise rotate a 32-bit number to the left.
195 */
196 function bit_rol(num, cnt)
197 {
198 return (num << cnt) | (num >>> (32 - cnt));
199 }
201 /*
202 * Convert a string to an array of little-endian words
203 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
204 */
205 function str2binl(str)
206 {
207 var bin = Array();
208 var mask = (1 << chrsz) - 1;
209 /* BEGIN LOOP */
210 for(var i = 0; i < str.length * chrsz; i += chrsz)
211 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
212 /* END LOOP */
213 return bin;
214 }
216 /*
217 * Convert an array of little-endian words to a string
218 */
219 function binl2str(bin)
220 {
221 var str = "";
222 var mask = (1 << chrsz) - 1;
223 /* BEGIN LOOP */
224 for(var i = 0; i < bin.length * 32; i += chrsz)
225 str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
226 /* END LOOP */
227 return str;
228 }
230 /*
231 * Convert an array of little-endian words to a hex string.
232 */
233 function binl2hex(binarray)
234 {
235 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
236 var str = "";
237 /* BEGIN LOOP */
238 for(var i = 0; i < binarray.length * 4; i++)
239 {
240 str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
241 hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
242 }
243 /* END LOOP */
244 return str;
245 }
247 /*
248 * Convert an array of little-endian words to a base-64 string
249 */
250 function binl2b64(binarray)
251 {
252 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
253 var str = "";
254 /* BEGIN LOOP */
255 for(var i = 0; i < binarray.length * 4; i += 3)
256 {
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);
260 /* BEGIN LOOP */
261 for(var j = 0; j < 4; j++)
262 {
263 if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
264 else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
265 }
266 /* END LOOP */
267 }
268 /* END LOOP */
269 return str;
270 }
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."
296 /* BEGIN LOOP */
297 for (var i = 0; i <4; i++) {
298 plainText += plainText;
299 }
300 /* END LOOP */
302 var md5Output = hex_md5(plainText);