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