1
15
16 import com.sekati.crypt.IHash;
17
18
21 class com.sekati.crypt.SHA1 implements IHash {
22
23
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 }