OLD | NEW |
(Empty) | |
| 1 /** |
| 2 * |
| 3 * Secure Hash Algorithm (SHA1) |
| 4 * http://www.webtoolkit.info/ |
| 5 * |
| 6 **/ |
| 7 |
| 8 function SHA1(msg) { |
| 9 |
| 10 function rotate_left(n,s) { |
| 11 var t4 = ( n<<s ) | (n>>>(32-s)); |
| 12 return t4; |
| 13 }; |
| 14 |
| 15 function lsb_hex(val) { |
| 16 var str=""; |
| 17 var i; |
| 18 var vh; |
| 19 var vl; |
| 20 |
| 21 for( i=0; i<=6; i+=2 ) { |
| 22 vh = (val>>>(i*4+4))&0x0f; |
| 23 vl = (val>>>(i*4))&0x0f; |
| 24 str += vh.toString(16) + vl.toString(16); |
| 25 } |
| 26 return str; |
| 27 }; |
| 28 |
| 29 function cvt_hex(val) { |
| 30 var str=""; |
| 31 var i; |
| 32 var v; |
| 33 |
| 34 for( i=7; i>=0; i-- ) { |
| 35 v = (val>>>(i*4))&0x0f; |
| 36 str += v.toString(16); |
| 37 } |
| 38 return str; |
| 39 }; |
| 40 |
| 41 |
| 42 function Utf8Encode(string) { |
| 43 string = string.replace(/\r\n/g,"\n"); |
| 44 var utftext = ""; |
| 45 |
| 46 for (var n = 0; n < string.length; n++) { |
| 47 |
| 48 var c = string.charCodeAt(n); |
| 49 |
| 50 if (c < 128) { |
| 51 utftext += String.fromCharCode(c); |
| 52 } |
| 53 else if((c > 127) && (c < 2048)) { |
| 54 utftext += String.fromCharCode((c >> 6) | 192); |
| 55 utftext += String.fromCharCode((c & 63) | 128); |
| 56 } |
| 57 else { |
| 58 utftext += String.fromCharCode((c >> 12) | 224); |
| 59 utftext += String.fromCharCode(((c >> 6) & 63) |
128); |
| 60 utftext += String.fromCharCode((c & 63) | 128); |
| 61 } |
| 62 |
| 63 } |
| 64 |
| 65 return utftext; |
| 66 }; |
| 67 |
| 68 var blockstart; |
| 69 var i, j; |
| 70 var W = new Array(80); |
| 71 var H0 = 0x67452301; |
| 72 var H1 = 0xEFCDAB89; |
| 73 var H2 = 0x98BADCFE; |
| 74 var H3 = 0x10325476; |
| 75 var H4 = 0xC3D2E1F0; |
| 76 var A, B, C, D, E; |
| 77 var temp; |
| 78 |
| 79 msg = Utf8Encode(msg); |
| 80 |
| 81 var msg_len = msg.length; |
| 82 |
| 83 var word_array = new Array(); |
| 84 for( i=0; i<msg_len-3; i+=4 ) { |
| 85 j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 | |
| 86 msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3); |
| 87 word_array.push( j ); |
| 88 } |
| 89 |
| 90 switch( msg_len % 4 ) { |
| 91 case 0: |
| 92 i = 0x080000000; |
| 93 break; |
| 94 case 1: |
| 95 i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000; |
| 96 break; |
| 97 |
| 98 case 2: |
| 99 i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_l
en-1)<<16 | 0x08000; |
| 100 break; |
| 101 |
| 102 case 3: |
| 103 i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_l
en-2)<<16 | msg.charCodeAt(msg_len-1)<<8 | 0x80; |
| 104 break; |
| 105 } |
| 106 |
| 107 word_array.push( i ); |
| 108 |
| 109 while( (word_array.length % 16) != 14 ) word_array.push( 0 ); |
| 110 |
| 111 word_array.push( msg_len>>>29 ); |
| 112 word_array.push( (msg_len<<3)&0x0ffffffff ); |
| 113 |
| 114 |
| 115 for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) { |
| 116 |
| 117 for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i]; |
| 118 for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i
-14] ^ W[i-16], 1); |
| 119 |
| 120 A = H0; |
| 121 B = H1; |
| 122 C = H2; |
| 123 D = H3; |
| 124 E = H4; |
| 125 |
| 126 for( i= 0; i<=19; i++ ) { |
| 127 temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] +
0x5A827999) & 0x0ffffffff; |
| 128 E = D; |
| 129 D = C; |
| 130 C = rotate_left(B,30); |
| 131 B = A; |
| 132 A = temp; |
| 133 } |
| 134 |
| 135 for( i=20; i<=39; i++ ) { |
| 136 temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6E
D9EBA1) & 0x0ffffffff; |
| 137 E = D; |
| 138 D = C; |
| 139 C = rotate_left(B,30); |
| 140 B = A; |
| 141 A = temp; |
| 142 } |
| 143 |
| 144 for( i=40; i<=59; i++ ) { |
| 145 temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E +
W[i] + 0x8F1BBCDC) & 0x0ffffffff; |
| 146 E = D; |
| 147 D = C; |
| 148 C = rotate_left(B,30); |
| 149 B = A; |
| 150 A = temp; |
| 151 } |
| 152 |
| 153 for( i=60; i<=79; i++ ) { |
| 154 temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA
62C1D6) & 0x0ffffffff; |
| 155 E = D; |
| 156 D = C; |
| 157 C = rotate_left(B,30); |
| 158 B = A; |
| 159 A = temp; |
| 160 } |
| 161 |
| 162 H0 = (H0 + A) & 0x0ffffffff; |
| 163 H1 = (H1 + B) & 0x0ffffffff; |
| 164 H2 = (H2 + C) & 0x0ffffffff; |
| 165 H3 = (H3 + D) & 0x0ffffffff; |
| 166 H4 = (H4 + E) & 0x0ffffffff; |
| 167 |
| 168 } |
| 169 |
| 170 var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_h
ex(H4); |
| 171 |
| 172 return temp.toLowerCase(); |
| 173 } |
OLD | NEW |