1  /**
     2   * com.sekati.crypt.SHA1
     3   * @version 1.0.1
     4   * @author jason m horwitz | sekati.com
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   * 
     8   * Sourced from ascrypt for dependencies only - version 2.0, author Mika Pamu
     9   * Original Javascript implementation:
    10   * Secure Hash Algorithm, SHA-1, as defined in FIPS PUB 180-1
    11   * Version 2.1 Copyright Paul Johnston 2000 - 2002
    12   * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
    13   * @see <a href="http://pajhome.org.uk/crypt/md5">http://pajhome.org.uk/crypt/md5</a> for more info.
    14   */
    15  
    16  import com.sekati.crypt.IHash;
    17  
    18  /**
    19   * Calculates the SHA1 checksum.
    20   */
    21  class com.sekati.crypt.SHA1 implements IHash {
    22  
    23  	/**
    24  	 * Calculates the SHA1 checksum.
    25  	 * @param src (String) string to hash
    26  	 * @return String
    27  	 */
    28  	public static function calculate(src:String):String {
    29  		return hex_sha1( src );
    30  	}
    31  
    32  	private static function hex_sha1(src:String):String {
    33  		return binb2hex( core_sha1( str2binb( src ), src.length * 8 ) );
    34  	}
    35  
    36  	private static function core_sha1(x:Array, len:Number):Array {
    37  		x[len >> 5] |= 0x80 << (24 - len % 32);
    38  		x[((len + 64 >> 9) << 4) + 15] = len;
    39  		var w:Array = new Array( 80 ), a:Number = 1732584193;
    40  		var b:Number = -271733879, c:Number = -1732584194;
    41  		var d:Number = 271733878, e:Number = -1009589776;
    42  		for (var i:Number = 0; i < x.length ; i += 16) {
    43  			var olda:Number = a, oldb:Number = b;
    44  			var oldc:Number = c, oldd:Number = d, olde:Number = e;
    45  			for (var j:Number = 0; j < 80 ; j++) {
    46  				if (j < 16) w[j] = x[i + j];
    47  				else w[j] = rol( w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1 );
    48  				var t:Number = safe_add( safe_add( rol( a, 5 ), sha1_ft( j, b, c, d ) ), safe_add( safe_add( e, w[j] ), sha1_kt( j ) ) );
    49  				e = d; 
    50  				d = c;
    51  				c = rol( b, 30 );
    52  				b = a; 
    53  				a = t;
    54  			}
    55  			a = safe_add( a, olda );
    56  			b = safe_add( b, oldb );
    57  			c = safe_add( c, oldc );
    58  			d = safe_add( d, oldd );
    59  			e = safe_add( e, olde );
    60  		}
    61  		return new Array( a, b, c, d, e );
    62  	}
    63  
    64  	private static function sha1_ft(t:Number, b:Number, c:Number, d:Number):Number {
    65  		if (t < 20) return (b & c) | ((~b) & d);
    66  		if (t < 40) return b ^ c ^ d;
    67  		if (t < 60) return (b & c) | (b & d) | (c & d);
    68  		return b ^ c ^ d;
    69  	}
    70  
    71  	private static function sha1_kt(t:Number):Number {
    72  		return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
    73  	}
    74  
    75  	private static function safe_add(x:Number, y:Number):Number {
    76  		var lsw:Number = (x & 0xFFFF) + (y & 0xFFFF);
    77  		var msw:Number = (x >> 16) + (y >> 16) + (lsw >> 16);
    78  		return (msw << 16) | (lsw & 0xFFFF);
    79  	}
    80  
    81  	private static function rol(num:Number, cnt:Number):Number {
    82  		return (num << cnt) | (num >>> (32 - cnt));
    83  	}
    84  
    85  	private static function str2binb(str:String):Array {
    86  		var bin:Array = new Array( );
    87  		var mask:Number = (1 << 8) - 1;
    88  		for (var i:Number = 0; i < str.length * 8 ; i += 8) {
    89  			bin[i >> 5] |= (str.charCodeAt( i / 8 ) & mask) << (24 - i % 32);
    90  		}
    91  		return bin;
    92  	}
    93  
    94  	private static function binb2hex(binarray:Array):String {
    95  		var str:String = new String( "" );
    96  		var tab:String = new String( "0123456789abcdef" );
    97  		for (var i:Number = 0; i < binarray.length * 4 ; i++) {
    98  			str += tab.charAt( (binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF ) + tab.charAt( (binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF );
    99  		}
   100  		return str;
   101  	}
   102  
   103  	private function SHA1() {
   104  	}
   105  }