/*

 A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as
 defined in FIPS PUB 180-1

 Distributed and modified under the Gnu Lesser General Public License
 (see http://www.gnu.org/copyleft/lgpl.html)

 Copyright (C) Paul Johnston 2000
 (http://pajhome.org.uk/site/legal.html)

 Originally distributed as sha1.js
 (http://pajhome.org.uk/crypt/md5/sha1src.html)

 Modified by Iain Lamb, $Date: 2003/11/11 21:19:03 $

*/
var sha = {hex_chr : "0123456789abcdef"};
sha.hex = function(num){
	var buf = new Array();
	for(var j = 7; j >= 0; j--)
		buf[buf.length] = sha.hex_chr.charAt((num >> (j * 4)) & 0x0F);
	return buf.join('');
}
sha.getBlocks = function(str){
	var nblk = ((str.length + 8) >> 6) + 1;
	var blks = new Array(nblk * 16);
	for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
	for(i = 0; i < str.length; i++)
    blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8);
	blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8);
	blks[nblk * 16 - 1] = str.length * 8;
	return blks;
}
sha.add = function(x, y) {
	var lsw = (x & 0xFFFF) + (y & 0xFFFF);
	var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
	return (msw << 16) | (lsw & 0xFFFF);
}
sha.rotate = function(num, cnt) {
	return (num << cnt) | (num >>> (32 - cnt));
}
sha.getTripletCombo = function(t, b, c, d) {
	if(t < 20) return (b & c) | ((~b) & d);
	if(t < 40) return b ^ c ^ d;
	if(t < 60) return (b & c) | (b & d) | (c & d);
	return b ^ c ^ d;
}
sha.getAdditiveConstant = function(t) {
	return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 : (t < 60) ? -1894007588 : -899497514;
}
sha.getHexDigest = function(str) {
	var x = sha.getBlocks(str);
	var w = new Array(80);
	var a =  1732584193; var b = -271733879; var c = -1732584194; var d =  271733878; var e = -1009589776;
	for(var i = 0; i < x.length; i += 16){
		var olda = a; var oldb = b; var oldc = c; var oldd = d; var olde = e;
		for(var j = 0; j < 80; j++) {
			if(j < 16) w[j] = x[i + j];
			else w[j] = sha.rotate(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
			t = sha.add(sha.add(sha.rotate(a, 5), sha.getTripletCombo(j, b, c, d)), 
						 sha.add(sha.add(e, w[j]), sha.getAdditiveConstant(j)));
			e = d; d = c; c = sha.rotate(b, 30); b = a; a = t;
		}
		a = sha.add(a, olda); b = sha.add(b, oldb); c = sha.add(c, oldc); d = sha.add(d, oldd); e = sha.add(e, olde);
	}
	return sha.hex(a) + sha.hex(b) + sha.hex(c) + sha.hex(d) + sha.hex(e);
}


