/*
	SHA-1 Secure Hash Algorithm
	FIPS PUB 180-1
	JavaScript implementation by tavis@email.com
*/


function sha1(msg)
{
	var h0 = 0x67452301;
	var h1 = 0xefcdab89;
	var h2 = 0x98badcfe;
	var h3 = 0x10325476;
	var h4 = 0xc3d2e1f0;

	var length = msg.length * 8;
	
	msg += String.fromCharCode(0x80);
	
	while (msg.length % 64 != 56)
	{
		msg += String.fromCharCode(0);
	}
	
	msg += String.fromCharCode(0);
	msg += String.fromCharCode(0);
	msg += String.fromCharCode(0);
	msg += String.fromCharCode(0);
	msg += String.fromCharCode(length >>> 24);
	msg += String.fromCharCode((length >> 16) & 0xff);
	msg += String.fromCharCode((length >> 8) & 0xff);
	msg += String.fromCharCode(length & 0xff);

	var w = new Array(80);

	for (var j = 0; j < msg.length;)
	{
		for (var i = 0; i < 16; i++)
		{
			w[i] = msg.charCodeAt(j++) << 24;
			w[i] |= msg.charCodeAt(j++) << 16;
			w[i] |= msg.charCodeAt(j++) << 8;
			w[i] |= msg.charCodeAt(j++);
		}
		
		for (var i = 16; i < 80; i++)
		{
			var x = w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16];
			w[i] = (x << 1) | (x >>> 31);
		}

		var a = h0;
		var b = h1;
		var c = h2;
		var d = h3;
		var e = h4;
		
		for (var i = 0; i < 80; i++)
		{
			e += (a << 5) | (a >>> 27);
			
			if (i < 20)      e += (d ^ (b & (c ^ d)))       + 0x5a827999;
			else if (i < 40) e += (b ^ c ^ d)               + 0x6ed9eba1;
			else if (i < 60) e += ((b & c) | (d & (b | c))) + 0x8f1bbcdc;
			else             e += (b ^ c ^ d)               + 0xca62c1d6;
			
			var temp = e + w[i];
			e = d;
			d = c;
			c = (b << 30) | (b >>> 2);
			b = a;
			a = temp;
		}
		
		h0 += a;
		h1 += b;
		h2 += c;
		h3 += d;
		h4 += e;
	}
	
	return word2Hex(h0) + word2Hex(h1) + word2Hex(h2) + word2Hex(h3) + word2Hex(h4);
}

function word2Hex(w)
{
	var hex = "", digits = "0123456789abcdef";
	
	for (var i = 0; i < 8; i++)
	{
		hex = digits.charAt(w & 15) + hex;
		w >>= 4;
	}
	
	return hex;
}
