1 Jek.newPackage('Jek.algorithm');
   2 /**
   3  * Calculate the md5 hash of a string.
   4  * 
   5  * @param {String}string
   6  */
   7 Jek.algorithm.md5 = function(string) {
   8 	function rotateLeft(val, shift) {
   9 		return (val << shift) | (val >>> (32 - shift));
  10 	}
  11 	function addUnsig(lX, lY) {
  12 		var lX4, lY4, lX8, lY8, lRes;
  13 		lX8 = (lX & 0x80000000);
  14 		lY8 = (lY & 0x80000000);
  15 		lX4 = (lX & 0x40000000);
  16 		lY4 = (lY & 0x40000000);
  17 		lRes = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
  18 		if (lX4 & lY4) {
  19 			return (lRes ^ 0x80000000 ^ lX8 ^ lY8);
  20 		}
  21 		if (lX4 | lY4) {
  22 			if (lRes & 0x40000000) {
  23 				return (lRes ^ 0xC0000000 ^ lX8 ^ lY8);
  24 			} else {
  25 				return (lRes ^ 0x40000000 ^ lX8 ^ lY8);
  26 			}
  27 		} else {
  28 			return (lRes ^ lX8 ^ lY8);
  29 		}
  30 	}
  31 	function F(x, y, z) {
  32 		return (x & y) | ((~x) & z);
  33 	}
  34 	function G(x, y, z) {
  35 		return (x & z) | (y & (~z));
  36 	}
  37 	function H(x, y, z) {
  38 		return (x ^ y ^ z);
  39 	}
  40 	function I(x, y, z) {
  41 		return (y ^ (x | (~z)));
  42 	}
  43 	function FF(a, b, c, d, x, s, ac) {
  44 		a = addUnsig(a, addUnsig(addUnsig(F(b, c, d), x), ac));
  45 		return addUnsig(rotateLeft(a, s), b);
  46 	}
  47 	function GG(a, b, c, d, x, s, ac) {
  48 		a = addUnsig(a, addUnsig(addUnsig(G(b, c, d), x), ac));
  49 		return addUnsig(rotateLeft(a, s), b);
  50 	}
  51 	function HH(a, b, c, d, x, s, ac) {
  52 		a = addUnsig(a, addUnsig(addUnsig(H(b, c, d), x), ac));
  53 		return addUnsig(rotateLeft(a, s), b);
  54 	}
  55 	function II(a, b, c, d, x, s, ac) {
  56 		a = addUnsig(a, addUnsig(addUnsig(I(b, c, d), x), ac));
  57 		return addUnsig(rotateLeft(a, s), b);
  58 	}
  59 	function convertToWordArray(string) {
  60 		var lWordCount;
  61 		var lMessageLength = string.length;
  62 		var lNumberOfWords_temp1 = lMessageLength + 8;
  63 		var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
  64 		var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
  65 		var lWordArray = Array(lNumberOfWords - 1);
  66 		var lBytePosition = 0;
  67 		var lByteCount = 0;
  68 		while (lByteCount < lMessageLength) {
  69 			lWordCount = (lByteCount - (lByteCount % 4)) / 4;
  70 			lBytePosition = (lByteCount % 4) * 8;
  71 			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string
  72 					.charCodeAt(lByteCount) << lBytePosition));
  73 			lByteCount++;
  74 		}
  75 		lWordCount = (lByteCount - (lByteCount % 4)) / 4;
  76 		lBytePosition = (lByteCount % 4) * 8;
  77 		lWordArray[lWordCount] = lWordArray[lWordCount]
  78 				| (0x80 << lBytePosition);
  79 		lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
  80 		lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
  81 		return lWordArray;
  82 	}
  83 	function wordToHex(lValue) {
  84 		var wordToHexValue = "", wordToHexValue_temp = "", lByte, lCount;
  85 		for (lCount = 0; lCount <= 3; lCount++) {
  86 			lByte = (lValue >>> (lCount * 8)) & 255;
  87 			wordToHexValue_temp = "0" + lByte.toString(16);
  88 			wordToHexValue = wordToHexValue
  89 					+ wordToHexValue_temp.substr(
  90 							wordToHexValue_temp.length - 2, 2);
  91 		}
  92 		return wordToHexValue;
  93 	}
  94 	var x = Array();
  95 	var k, AA, BB, CC, DD, a, b, c, d;
  96 	var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
  97 	var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
  98 	var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
  99 	var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
 100 	string = Jek.conversion.utf8Encode(string);
 101 	x = convertToWordArray(string);
 102 	a = 0x67452301;
 103 	b = 0xEFCDAB89;
 104 	c = 0x98BADCFE;
 105 	d = 0x10325476;
 106 	for (k = 0; k < x.length; k += 16) {
 107 		AA = a;
 108 		BB = b;
 109 		CC = c;
 110 		DD = d;
 111 		a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
 112 		d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
 113 		c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
 114 		b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
 115 		a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
 116 		d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
 117 		c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
 118 		b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
 119 		a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
 120 		d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
 121 		c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
 122 		b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
 123 		a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
 124 		d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
 125 		c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
 126 		b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
 127 		a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
 128 		d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
 129 		c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
 130 		b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
 131 		a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
 132 		d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
 133 		c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
 134 		b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
 135 		a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
 136 		d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
 137 		c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
 138 		b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
 139 		a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
 140 		d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
 141 		c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
 142 		b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
 143 		a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
 144 		d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
 145 		c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
 146 		b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
 147 		a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
 148 		d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
 149 		c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
 150 		b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
 151 		a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
 152 		d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
 153 		c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
 154 		b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
 155 		a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
 156 		d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
 157 		c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
 158 		b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
 159 		a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
 160 		d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
 161 		c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
 162 		b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
 163 		a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
 164 		d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
 165 		c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
 166 		b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
 167 		a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
 168 		d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
 169 		c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
 170 		b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
 171 		a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
 172 		d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
 173 		c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
 174 		b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
 175 		a = addUnsig(a, AA);
 176 		b = addUnsig(b, BB);
 177 		c = addUnsig(c, CC);
 178 		d = addUnsig(d, DD);
 179 	}
 180 	var res = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
 181 	return res.toLowerCase();
 182 };