js/src/devtools/jint/sunspider/crypto-sha1.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:da442f6ff58c
1 /*
2 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
3 * in FIPS PUB 180-1
4 * Version 2.1a Copyright Paul Johnston 2000 - 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 details.
8 */
9
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 */
17
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_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
23 function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
24 function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
25 function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
26 function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
27 function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
28
29 /*
30 * Perform a simple self-test to see if the VM is working
31 */
32 function sha1_vm_test()
33 {
34 return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
35 }
36
37 /*
38 * Calculate the SHA-1 of an array of big-endian words, and a bit length
39 */
40 function core_sha1(x, len)
41 {
42 /* append padding */
43 x[len >> 5] |= 0x80 << (24 - len % 32);
44 x[((len + 64 >> 9) << 4) + 15] = len;
45
46 var w = Array(80);
47 var a = 1732584193;
48 var b = -271733879;
49 var c = -1732584194;
50 var d = 271733878;
51 var e = -1009589776;
52
53 /* BEGIN LOOP */
54 for(var i = 0; i < x.length; i += 16)
55 {
56 var olda = a;
57 var oldb = b;
58 var oldc = c;
59 var oldd = d;
60 var olde = e;
61
62 /* BEGIN LOOP */
63 for(var j = 0; j < 80; j++)
64 {
65 if(j < 16) w[j] = x[i + j];
66 else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
67 var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
68 safe_add(safe_add(e, w[j]), sha1_kt(j)));
69 e = d;
70 d = c;
71 c = rol(b, 30);
72 b = a;
73 a = t;
74 }
75 /* END LOOP */
76
77 a = safe_add(a, olda);
78 b = safe_add(b, oldb);
79 c = safe_add(c, oldc);
80 d = safe_add(d, oldd);
81 e = safe_add(e, olde);
82 }
83 /* END LOOP */
84 return Array(a, b, c, d, e);
85
86 }
87
88 /*
89 * Perform the appropriate triplet combination function for the current
90 * iteration
91 */
92 function sha1_ft(t, b, c, d)
93 {
94 if(t < 20) return (b & c) | ((~b) & d);
95 if(t < 40) return b ^ c ^ d;
96 if(t < 60) return (b & c) | (b & d) | (c & d);
97 return b ^ c ^ d;
98 }
99
100 /*
101 * Determine the appropriate additive constant for the current iteration
102 */
103 function sha1_kt(t)
104 {
105 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
106 (t < 60) ? -1894007588 : -899497514;
107 }
108
109 /*
110 * Calculate the HMAC-SHA1 of a key and some data
111 */
112 function core_hmac_sha1(key, data)
113 {
114 var bkey = str2binb(key);
115 if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
116
117 var ipad = Array(16), opad = Array(16);
118 /* BEGIN LOOP */
119 for(var i = 0; i < 16; i++)
120 {
121 ipad[i] = bkey[i] ^ 0x36363636;
122 opad[i] = bkey[i] ^ 0x5C5C5C5C;
123 }
124 /* END LOOP */
125
126 var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
127 return core_sha1(opad.concat(hash), 512 + 160);
128 }
129
130 /*
131 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
132 * to work around bugs in some JS interpreters.
133 */
134 function safe_add(x, y)
135 {
136 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
137 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
138 return (msw << 16) | (lsw & 0xFFFF);
139 }
140
141 /*
142 * Bitwise rotate a 32-bit number to the left.
143 */
144 function rol(num, cnt)
145 {
146 return (num << cnt) | (num >>> (32 - cnt));
147 }
148
149 /*
150 * Convert an 8-bit or 16-bit string to an array of big-endian words
151 * In 8-bit function, characters >255 have their hi-byte silently ignored.
152 */
153 function str2binb(str)
154 {
155 var bin = Array();
156 var mask = (1 << chrsz) - 1;
157 /* BEGIN LOOP */
158 for(var i = 0; i < str.length * chrsz; i += chrsz)
159 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
160 /* END LOOP */
161 return bin;
162 }
163
164 /*
165 * Convert an array of big-endian words to a string
166 */
167 function binb2str(bin)
168 {
169 var str = "";
170 var mask = (1 << chrsz) - 1;
171 /* BEGIN LOOP */
172 for(var i = 0; i < bin.length * 32; i += chrsz)
173 str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
174 /* END LOOP */
175 return str;
176 }
177
178 /*
179 * Convert an array of big-endian words to a hex string.
180 */
181 function binb2hex(binarray)
182 {
183 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
184 var str = "";
185 /* BEGIN LOOP */
186 for(var i = 0; i < binarray.length * 4; i++)
187 {
188 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
189 hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
190 }
191 /* END LOOP */
192 return str;
193 }
194
195 /*
196 * Convert an array of big-endian words to a base-64 string
197 */
198 function binb2b64(binarray)
199 {
200 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
201 var str = "";
202 /* BEGIN LOOP */
203 for(var i = 0; i < binarray.length * 4; i += 3)
204 {
205 var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
206 | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
207 | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
208 /* BEGIN LOOP */
209 for(var j = 0; j < 4; j++)
210 {
211 if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
212 else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
213 }
214 /* END LOOP */
215 }
216 /* END LOOP */
217 return str;
218 }
219
220
221 var plainText = "Two households, both alike in dignity,\n\
222 In fair Verona, where we lay our scene,\n\
223 From ancient grudge break to new mutiny,\n\
224 Where civil blood makes civil hands unclean.\n\
225 From forth the fatal loins of these two foes\n\
226 A pair of star-cross'd lovers take their life;\n\
227 Whole misadventured piteous overthrows\n\
228 Do with their death bury their parents' strife.\n\
229 The fearful passage of their death-mark'd love,\n\
230 And the continuance of their parents' rage,\n\
231 Which, but their children's end, nought could remove,\n\
232 Is now the two hours' traffic of our stage;\n\
233 The which if you with patient ears attend,\n\
234 What here shall miss, our toil shall strive to mend.";
235
236 /* BEGIN LOOP */
237 for (var i = 0; i <4; i++) {
238 plainText += plainText;
239 }
240 /* END LOOP */
241
242 var sha1Output = hex_sha1(plainText);

mercurial