package org.bouncycastle.operator.bc;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

// BEGIN android-removed
// import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
// END android-removed
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.crypto.ExtendedDigest;
// BEGIN android-removed
// import org.bouncycastle.crypto.digests.GOST3411Digest;
// import org.bouncycastle.crypto.digests.MD2Digest;
// import org.bouncycastle.crypto.digests.MD4Digest;
// END android-removed
import org.bouncycastle.crypto.digests.MD5Digest;
// BEGIN android-removed
// import org.bouncycastle.crypto.digests.RIPEMD128Digest;
// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
// import org.bouncycastle.crypto.digests.RIPEMD256Digest;
// END android-removed
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.digests.SHA224Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.digests.SHA384Digest;
// BEGIN android-removed
// import org.bouncycastle.crypto.digests.SHA3Digest;
// END android-removed
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.operator.OperatorCreationException;

public class BcDefaultDigestProvider
    implements BcDigestProvider
{
    private static final Map lookup = createTable();

    private static Map createTable()
    {
        Map table = new HashMap();

        table.put(OIWObjectIdentifiers.idSHA1, new BcDigestProvider()
        {
            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
            {
                return new SHA1Digest();
            }
        });
        table.put(NISTObjectIdentifiers.id_sha224, new BcDigestProvider()
        {
            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
            {
                return new SHA224Digest();
            }
        });
        table.put(NISTObjectIdentifiers.id_sha256, new BcDigestProvider()
        {
            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
            {
                return new SHA256Digest();
            }
        });
        table.put(NISTObjectIdentifiers.id_sha384, new BcDigestProvider()
        {
            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
            {
                return new SHA384Digest();
            }
        });
        table.put(NISTObjectIdentifiers.id_sha512, new BcDigestProvider()
        {
            public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
            {
                return new SHA512Digest();
            }
        });
        // BEGIN android-removed
        // table.put(NISTObjectIdentifiers.id_sha3_224, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new SHA3Digest(224);
        //     }
        // });
        // table.put(NISTObjectIdentifiers.id_sha3_256, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new SHA3Digest(256);
        //     }
        // });
        // table.put(NISTObjectIdentifiers.id_sha3_384, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new SHA3Digest(384);
        //     }
        // });
        // table.put(NISTObjectIdentifiers.id_sha3_512, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new SHA3Digest(512);
        //     }
        // });
        // table.put(PKCSObjectIdentifiers.md5, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new MD5Digest();
        //     }
        // });
        // table.put(PKCSObjectIdentifiers.md4, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new MD4Digest();
        //     }
        // });
        // table.put(PKCSObjectIdentifiers.md2, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new MD2Digest();
        //     }
        // });
        // table.put(CryptoProObjectIdentifiers.gostR3411, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new GOST3411Digest();
        //     }
        // });
        // table.put(TeleTrusTObjectIdentifiers.ripemd128, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new RIPEMD128Digest();
        //     }
        // });
        // table.put(TeleTrusTObjectIdentifiers.ripemd160, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new RIPEMD160Digest();
        //     }
        // });
        // table.put(TeleTrusTObjectIdentifiers.ripemd256, new BcDigestProvider()
        // {
        //     public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        //     {
        //         return new RIPEMD256Digest();
        //     }
        // });
        // END android-removed

        return Collections.unmodifiableMap(table);
    }

    public static final BcDigestProvider INSTANCE = new BcDefaultDigestProvider();

    private BcDefaultDigestProvider()
    {

    }

    public ExtendedDigest get(AlgorithmIdentifier digestAlgorithmIdentifier)
        throws OperatorCreationException
    {
        BcDigestProvider extProv = (BcDigestProvider)lookup.get(digestAlgorithmIdentifier.getAlgorithm());

        if (extProv == null)
        {
            throw new OperatorCreationException("cannot recognise digest");
        }

        return extProv.get(digestAlgorithmIdentifier);
    }
}
