3 <script src=
"../htmlrunner.js"></script>
6 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
8 * Version 2.1a Copyright Paul Johnston 2000 - 2002.
9 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
10 * Distributed under the BSD License
11 * See http://pajhome.org.uk/crypt/md5 for details.
15 * Configurable variables. You may need to tweak these to be compatible with
16 * the server-side, but the defaults work in most cases.
18 var hexcase
= 0; /* hex output format. 0 - lowercase; 1 - uppercase */
19 var b64pad
= ""; /* base-64 pad character. "=" for strict RFC compliance */
20 var chrsz
= 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
23 * These are the functions you'll usually want to call
24 * They take string arguments and return either hex or base-64 encoded strings
26 function hex_sha1(s
){return binb2hex(core_sha1(str2binb(s
),s
.length
* chrsz
));}
27 function b64_sha1(s
){return binb2b64(core_sha1(str2binb(s
),s
.length
* chrsz
));}
28 function str_sha1(s
){return binb2str(core_sha1(str2binb(s
),s
.length
* chrsz
));}
29 function hex_hmac_sha1(key
, data
){ return binb2hex(core_hmac_sha1(key
, data
));}
30 function b64_hmac_sha1(key
, data
){ return binb2b64(core_hmac_sha1(key
, data
));}
31 function str_hmac_sha1(key
, data
){ return binb2str(core_hmac_sha1(key
, data
));}
34 * Perform a simple self-test to see if the VM is working
36 function sha1_vm_test()
38 return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
42 * Calculate the SHA-1 of an array of big-endian words, and a bit length
44 function core_sha1(x
, len
)
47 x
[len
>> 5] |= 0x80 << (24 - len
% 32);
48 x
[((len
+ 64 >> 9) << 4) + 15] = len
;
57 for(var i
= 0; i
< x
.length
; i
+= 16)
65 for(var j
= 0; j
< 80; j
++)
67 if(j
< 16) w
[j
] = x
[i
+ j
];
68 else w
[j
] = rol(w
[j
-3] ^ w
[j
-8] ^ w
[j
-14] ^ w
[j
-16], 1);
69 var t
= safe_add(safe_add(rol(a
, 5), sha1_ft(j
, b
, c
, d
)),
70 safe_add(safe_add(e
, w
[j
]), sha1_kt(j
)));
78 a
= safe_add(a
, olda
);
79 b
= safe_add(b
, oldb
);
80 c
= safe_add(c
, oldc
);
81 d
= safe_add(d
, oldd
);
82 e
= safe_add(e
, olde
);
84 return Array(a
, b
, c
, d
, e
);
89 * Perform the appropriate triplet combination function for the current
92 function sha1_ft(t
, b
, c
, d
)
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
);
101 * Determine the appropriate additive constant for the current iteration
105 return (t
< 20) ? 1518500249 : (t
< 40) ? 1859775393 :
106 (t
< 60) ? -1894007588 : -899497514;
110 * Calculate the HMAC-SHA1 of a key and some data
112 function core_hmac_sha1(key
, data
)
114 var bkey
= str2binb(key
);
115 if(bkey
.length
> 16) bkey
= core_sha1(bkey
, key
.length
* chrsz
);
117 var ipad
= Array(16), opad
= Array(16);
118 for(var i
= 0; i
< 16; i
++)
120 ipad
[i
] = bkey
[i
] ^ 0x36363636;
121 opad
[i
] = bkey
[i
] ^ 0x5C5C5C5C;
124 var hash
= core_sha1(ipad
.concat(str2binb(data
)), 512 + data
.length
* chrsz
);
125 return core_sha1(opad
.concat(hash
), 512 + 160);
129 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
130 * to work around bugs in some JS interpreters.
132 function safe_add(x
, y
)
134 var lsw
= (x
& 0xFFFF) + (y
& 0xFFFF);
135 var msw
= (x
>> 16) + (y
>> 16) + (lsw
>> 16);
136 return (msw
<< 16) | (lsw
& 0xFFFF);
140 * Bitwise rotate a 32-bit number to the left.
142 function rol(num
, cnt
)
144 return (num
<< cnt
) | (num
>>> (32 - cnt
));
148 * Convert an 8-bit or 16-bit string to an array of big-endian words
149 * In 8-bit function, characters >255 have their hi-byte silently ignored.
151 function str2binb(str
)
154 var mask
= (1 << chrsz
) - 1;
155 for(var i
= 0; i
< str
.length
* chrsz
; i
+= chrsz
)
156 bin
[i
>>5] |= (str
.charCodeAt(i
/ chrsz
) & mask
) << (32 - chrsz
- i
%32);
161 * Convert an array of big-endian words to a string
163 function binb2str(bin
)
166 var mask
= (1 << chrsz
) - 1;
167 for(var i
= 0; i
< bin
.length
* 32; i
+= chrsz
)
168 str
+= String
.fromCharCode((bin
[i
>>5] >>> (32 - chrsz
- i
%32)) & mask
);
173 * Convert an array of big-endian words to a hex string.
175 function binb2hex(binarray
)
177 var hex_tab
= hexcase
? "0123456789ABCDEF" : "0123456789abcdef";
179 for(var i
= 0; i
< binarray
.length
* 4; i
++)
181 str
+= hex_tab
.charAt((binarray
[i
>>2] >> ((3 - i
%4)*8+4)) & 0xF) +
182 hex_tab
.charAt((binarray
[i
>>2] >> ((3 - i
%4)*8 )) & 0xF);
188 * Convert an array of big-endian words to a base-64 string
190 function binb2b64(binarray
)
192 var tab
= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
194 for(var i
= 0; i
< binarray
.length
* 4; i
+= 3)
196 var triplet
= (((binarray
[i
>> 2] >> 8 * (3 - i
%4)) & 0xFF) << 16)
197 | (((binarray
[i
+1 >> 2] >> 8 * (3 - (i
+1)%4)) & 0xFF) << 8 )
198 | ((binarray
[i
+2 >> 2] >> 8 * (3 - (i
+2)%4)) & 0xFF);
199 for(var j
= 0; j
< 4; j
++)
201 if(i
* 8 + j
* 6 > binarray
.length
* 32) str
+= b64pad
;
202 else str
+= tab
.charAt((triplet
>> 6*(3-j
)) & 0x3F);
209 var plainText
= "Two households, both alike in dignity,\n\
210 In fair Verona, where we lay our scene,\n\
211 From ancient grudge break to new mutiny,\n\
212 Where civil blood makes civil hands unclean.\n\
213 From forth the fatal loins of these two foes\n\
214 A pair of star-cross'd lovers take their life;\n\
215 Whole misadventured piteous overthrows\n\
216 Do with their death bury their parents' strife.\n\
217 The fearful passage of their death-mark'd love,\n\
218 And the continuance of their parents' rage,\n\
219 Which, but their children's end, nought could remove,\n\
220 Is now the two hours' traffic of our stage;\n\
221 The which if you with patient ears attend,\n\
222 What here shall miss, our toil shall strive to mend.";
224 for (var i
= 0; i
<2; i
++) {
225 plainText
+= plainText
;
228 window
.onload = function(){ startTest("sunspider-crypto-sha1", 'b1fc168a');
230 test("SHA1 Hashing", function(){
231 var sha1Output
= hex_sha1(plainText
);