1 Jek.newPackage('Jek.algorithm'); 2 /** 3 * Calculate the sha1 hash of a string. 4 * 5 * @param {String}string 6 */ 7 Jek.algorithm.sha1 = function(string) { 8 function rotateLeft(val, shift) { 9 return (val << shift) | (val >>> (32 - shift)); 10 } 11 function cvtHex(val) { 12 var jString = new JekString(); 13 var i; 14 var v; 15 for (i = 7; i >= 0; i--) { 16 v = (val >>> (i * 4)) & 0x0f; 17 jString.append(v.toString(16)); 18 } 19 return jString; 20 } 21 var blockstart; 22 var i, j; 23 var W = new Array(80); 24 var H0 = 0x67452301, H1 = 0xEFCDAB89, H2 = 0x98BADCFE, H3 = 0x10325476, H4 = 0xC3D2E1F0; 25 var A, B, C, D, E; 26 var temp; 27 string = Jek.conversion.utf8Encode(string); 28 var s_len = string.length; 29 var w_arr = new Array(); 30 for (i = 0; i < s_len - 3; i += 4) { 31 j = string.charCodeAt(i) << 24 | string.charCodeAt(i + 1) << 16 32 | string.charCodeAt(i + 2) << 8 | string.charCodeAt(i + 3); 33 w_arr.push(j); 34 } 35 switch (s_len % 4) { 36 case 0: 37 i = 0x080000000; 38 break; 39 case 1: 40 i = string.charCodeAt(s_len - 1) << 24 | 0x0800000; 41 break; 42 43 case 2: 44 i = string.charCodeAt(s_len - 2) << 24 45 | string.charCodeAt(s_len - 1) << 16 | 0x08000; 46 break; 47 48 case 3: 49 i = string.charCodeAt(s_len - 3) << 24 50 | string.charCodeAt(s_len - 2) << 16 51 | string.charCodeAt(s_len - 1) << 8 | 0x80; 52 break; 53 } 54 w_arr.push(i); 55 while ((w_arr.length % 16) != 14) 56 w_arr.push(0); 57 w_arr.push(s_len >>> 29); 58 w_arr.push((s_len << 3) & 0x0ffffffff); 59 for (blockstart = 0; blockstart < w_arr.length; blockstart += 16) { 60 for (i = 0; i < 16; i++) 61 W[i] = w_arr[blockstart + i]; 62 for (i = 16; i <= 79; i++) 63 W[i] = rotateLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); 64 A = H0; 65 B = H1; 66 C = H2; 67 D = H3; 68 E = H4; 69 for (i = 0; i <= 19; i++) { 70 temp = (rotateLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; 71 E = D; 72 D = C; 73 C = rotateLeft(B, 30); 74 B = A; 75 A = temp; 76 } 77 for (i = 20; i <= 39; i++) { 78 temp = (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; 79 E = D; 80 D = C; 81 C = rotateLeft(B, 30); 82 B = A; 83 A = temp; 84 } 85 for (i = 40; i <= 59; i++) { 86 temp = (rotateLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; 87 E = D; 88 D = C; 89 C = rotateLeft(B, 30); 90 B = A; 91 A = temp; 92 } 93 for (i = 60; i <= 79; i++) { 94 temp = (rotateLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; 95 E = D; 96 D = C; 97 C = rotateLeft(B, 30); 98 B = A; 99 A = temp; 100 } 101 H0 = (H0 + A) & 0x0ffffffff; 102 H1 = (H1 + B) & 0x0ffffffff; 103 H2 = (H2 + C) & 0x0ffffffff; 104 H3 = (H3 + D) & 0x0ffffffff; 105 H4 = (H4 + E) & 0x0ffffffff; 106 } 107 var res = cvtHex(H0) + cvtHex(H1) + cvtHex(H2) + cvtHex(H3) + cvtHex(H4); 108 return res.toLowerCase(); 109 };