<?php
//*****************************************************************************
// SHA1
// Checks whether the function sha1() is defined in PHP
// and if not, creates one.
//
// Algorythm ported to PHP by Maxim Poltarak (maxx@xli.net)
//                            at
//                            XL Internet (http://www.xli.net/)
//
// Usage example: echo sha1('abc');
//*****************************************************************************

define('SHA1_HEXCASE',    1);    // hex output format. 0 - lowercase; 1 - uppercase
define('SHA1_CHRSZ',    8);    // bits per input character. 8 - ASCII; 16 - Unicode

class SHA1 {

    
//*************************************************************************
    
function hash$s ) {
        return 
SHA1::binb2hexSHA1::coreSHA1::str2binb($s), strlen($s) * SHA1_CHRSZ ) );
    }

    
//*************************************************************************
    
function core$x$len ) {
        
$x array_pad($xmax(($len >> 5) + 1, (($len 64 >> 9) << 4) + 15), 0);
        
$x[$len >> 5] |= 0x80 << (24 $len 32);
        
$x[(($len 64 >> 9) << 4) + 15] = $len;

        
$w array_pad(array(), 800);
        
$a 1732584193;
        
$b = -271733879;
        
$c = -1732584194;
        
$d 271733878;
        
$e = -1009589776;
        for(
$i=0$i sizeof($x); $i += 16) {

            for(
$l='a'$l != 'f'$l chr(ord($l)+1)) ${'old'.$l} = $$l;

            for(
$j=0$j 80$j++) {
                if(
$j 16$w[$j] = $x[$i $j];
                else 
$w[$j] = SHA1::rol($w[$j-3] ^ $w[$j-8] ^ $w[$j-14] ^ $w[$j-16], 1);
                
$t SHA1::safe_add(
                    
SHA1::safe_add(SHA1::rol($a5), SHA1::ft($j$b$c$d)),
                    
SHA1::safe_add(SHA1::safe_add($e$w[$j]), SHA1::kt($j))
                );

                
$e $d;
                
$d $c;
                
$c SHA1::rol($b30);
                
$b $a;
                
$a $t;
            }

            for(
$l='a'$l != 'f'$l chr(ord($l)+1)) $$l SHA1::safe_add($$l, ${'old'.$l});
        }
        return array(
$a$b$c$d$e);
    }

    
//*************************************************************************
    
function ft$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;
    }

    
//*************************************************************************
    
function kt$t ) {
        return 
$t 20 1518500249 : ($t 40 1859775393 : ($t 60 ? -1894007588 : -899497514));
    }

    
//*************************************************************************
    
function safe_add$x$y ) {
        
$lsw = ($x 0xFFFF) + ($y 0xFFFF);
        
$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
        return (
$msw << 16) | ($lsw 0xFFFF);
    }

    
//*************************************************************************
    
function rol$num$cnt ) {
        return (
$num << $cnt) | SHA1::zf($num, (32 $cnt));
    }

    
//*************************************************************************
    
function str2binb$str ) {
        
$bin array_pad(array(), ((strlen($str) * SHA1_CHRSZ) >> 5) + 10);
        
$mask = (<< SHA1_CHRSZ) - 1;
        for(
$i=0$i strlen($str) * SHA1_CHRSZ$i += SHA1_CHRSZ) {
            
$bin[$i >> 5] |= (ord($str{intval($i SHA1_CHRSZ)}) & $mask) << (24 - ($i 32));
        }
        return 
$bin;
    }

    
//*************************************************************************
    
function binb2hex$binarray ) {
        
$str '';
        foreach(
$binarray as $bin$str .= str_pad(dechex($bin), 8'0'STR_PAD_LEFT);
        return 
SHA1_HEXCASE strtoupper($str) : $str;
    }

    
//*************************************************************************
    
function zf$a$b ) {
        
$z 0x80000000;
        if (
$z $a) {
            
$a >>= 1;
            
$a &= (~ $z);
            
$a |= 0x40000000;
            
$a >>= ($b-1);
        } else {
            
$a >>= $b;
        }
        return 
$a;    
    }

    
//*************************************************************************
}

if(!
function_exists('sha1')) eval('function sha1($str) { return SHA1::hash($str); }');

?>