/**
 * SHABase
 * 
 * An ActionScript 3 abstract class for the SHA family of hash functions
 * Copyright (c) 2007 Henri Torgemane
 * 
 * See LICENSE.txt for full license information.
 */
package com.hurlant.crypto.hash
{
    import flash.utils.ByteArray;
    import flash.utils.Endian;

    public class SHABase implements IHash
    {

        public function SHABase() { }

        public var pad_size:int = 40;
        public function getInputSize():uint
        {
            return 64;
        }
        
        public function getHashSize():uint
        {
            return 0;
        }
        
        public function getPadSize():int 
        {
            return pad_size;
        }
        
        public function hash(src:ByteArray):ByteArray
        {
            var savedLength:uint = src.length;
            var savedEndian:String = src.endian;
            
            src.endian = Endian.BIG_ENDIAN;
            var len:uint = savedLength *8;
            // pad to nearest int.
            while (src.length%4!=0) {
                src[src.length]=0;
            }
            // convert ByteArray to an array of uint
            src.position=0;
            var a:Array = [];
            for (var i:uint=0;i<src.length;i+=4) {
                a.push(src.readUnsignedInt());
            }
            var h:Array = core(a, len);
            var out:ByteArray = new ByteArray;
            var words:uint = getHashSize()/4;
            for (i=0;i<words;i++) {
                out.writeUnsignedInt(h[i]);
            }
            // unpad, to leave the source untouched.
            src.length = savedLength;
            src.endian = savedEndian;
            return out;
        }
        protected function core(x:Array, len:uint):Array {
            return null;
        }
        
        public function toString():String {
            return "sha";
        }
    }
}