package org.bouncycastle.jce.provider;

import java.security.MessageDigest;

import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.*;

public class JDKMessageDigest
    extends MessageDigest
{
    Digest  digest;

    protected JDKMessageDigest(
        Digest  digest)
    {
        super(digest.getAlgorithmName());

        this.digest = digest;
    }

    public void engineReset() 
    {
        digest.reset();
    }

    public void engineUpdate(
        byte    input) 
    {
        digest.update(input);
    }

    public void engineUpdate(
        byte[]  input,
        int     offset,
        int     len) 
    {
        digest.update(input, offset, len);
    }

    public byte[] engineDigest() 
    {
        byte[]  digestBytes = new byte[digest.getDigestSize()];

        digest.doFinal(digestBytes, 0);

        return digestBytes;
    }

    /**
     * classes that extend directly off us.
     */
    static public class SHA1
        extends JDKMessageDigest
        implements Cloneable
    {
        public SHA1()
        {
            super(new SHA1Digest());
        }

        public Object clone()
            throws CloneNotSupportedException
        {
            SHA1 d = (SHA1)super.clone();
            d.digest = new SHA1Digest((SHA1Digest)digest);

            return d;
        }
    }

    static public class SHA224
        extends JDKMessageDigest
        implements Cloneable
    {
        public SHA224()
        {
            super(new SHA224Digest());
        }

        public Object clone()
            throws CloneNotSupportedException
        {
            SHA224 d = (SHA224)super.clone();
            d.digest = new SHA224Digest((SHA224Digest)digest);

            return d;
        }
    }

    static public class SHA256
        extends JDKMessageDigest
        implements Cloneable
    {
        public SHA256()
        {
            super(new SHA256Digest());
        }

        public Object clone()
            throws CloneNotSupportedException
        {
            SHA256 d = (SHA256)super.clone();
            d.digest = new SHA256Digest((SHA256Digest)digest);

            return d;
        }
    }

    static public class SHA384
        extends JDKMessageDigest
        implements Cloneable
    {
        public SHA384()
        {
            super(new SHA384Digest());
        }

        public Object clone()
            throws CloneNotSupportedException
        {
            SHA384 d = (SHA384)super.clone();
            d.digest = new SHA384Digest((SHA384Digest)digest);

            return d;
        }
    }

    static public class SHA512
        extends JDKMessageDigest
        implements Cloneable
    {
        public SHA512()
        {
            super(new SHA512Digest());
        }

        public Object clone()
            throws CloneNotSupportedException
        {
            SHA512 d = (SHA512)super.clone();
            d.digest = new SHA512Digest((SHA512Digest)digest);

            return d;
        }
    }

// BEGIN android-removed
//    static public class MD2
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public MD2()
//        {
//            super(new MD2Digest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            MD2 d = (MD2)super.clone();
//            d.digest = new MD2Digest((MD2Digest)digest);
//
//            return d;
//        }
//    }
//
//    static public class MD4
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public MD4()
//        {
//            super(new MD4Digest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            MD4 d = (MD4)super.clone();
//            d.digest = new MD4Digest((MD4Digest)digest);
//
//            return d;
//        }
//    }
// END android-removed

    static public class MD5
        extends JDKMessageDigest
        implements Cloneable
    {
        public MD5()
        {
            super(new MD5Digest());
        }

        public Object clone()
            throws CloneNotSupportedException
        {
            MD5 d = (MD5)super.clone();
            d.digest = new MD5Digest((MD5Digest)digest);

            return d;
        }
    }

// BEGIN android-removed
//    static public class RIPEMD128
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public RIPEMD128()
//        {
//            super(new RIPEMD128Digest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            RIPEMD128 d = (RIPEMD128)super.clone();
//            d.digest = new RIPEMD128Digest((RIPEMD128Digest)digest);
//
//            return d;
//        }
//    }
//
//    static public class RIPEMD160
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public RIPEMD160()
//        {
//            super(new RIPEMD160Digest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            RIPEMD160 d = (RIPEMD160)super.clone();
//            d.digest = new RIPEMD160Digest((RIPEMD160Digest)digest);
//
//            return d;
//        }
//    }
//    
//    static public class RIPEMD256
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public RIPEMD256()
//        {
//            super(new RIPEMD256Digest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            RIPEMD256 d = (RIPEMD256)super.clone();
//            d.digest = new RIPEMD256Digest((RIPEMD256Digest)digest);
//
//            return d;
//        }
//    }
//    
//    static public class RIPEMD320
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public RIPEMD320()
//        {
//            super(new RIPEMD320Digest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            RIPEMD320 d = (RIPEMD320)super.clone();
//            d.digest = new RIPEMD320Digest((RIPEMD320Digest)digest);
//
//            return d;
//        }
//    }
//    
//    static public class Tiger
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public Tiger()
//        {
//            super(new TigerDigest());
//        }
//
//        public Object clone()
//            throws CloneNotSupportedException
//        {
//            Tiger d = (Tiger)super.clone();
//            d.digest = new TigerDigest((TigerDigest)digest);
//
//            return d;
//        }
//    }
//    
//    static public class GOST3411
//        extends JDKMessageDigest
//        implements Cloneable
//    {
//        public GOST3411()
//        {
//            super(new GOST3411Digest());
//        }
//    
//        public Object clone()
//        throws CloneNotSupportedException
//        {
//            GOST3411 d = (GOST3411)super.clone();
//            d.digest = new GOST3411Digest((GOST3411Digest)digest);
//
//            return d;
//        }
//    }
//    
//    static public class Whirlpool
//       extends JDKMessageDigest
//       implements Cloneable
//    {
//        public Whirlpool()
//        {
//            super(new WhirlpoolDigest());
//        }
//        
//        public Object clone()
//        throws CloneNotSupportedException
//        {
//            Whirlpool d = (Whirlpool)super.clone();
//            d.digest = new WhirlpoolDigest((WhirlpoolDigest)digest);
//            
//            return d;
//        }
//    }
// END android-removed
}
