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 };