// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.operator.bc;

import org.bouncycastle.operator.OperatorCreationException;
import java.util.Collections;
import org.bouncycastle.crypto.digests.Blake3Digest;
import org.bouncycastle.asn1.misc.MiscObjectIdentifiers;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.asn1.gm.GMObjectIdentifiers;
import org.bouncycastle.crypto.digests.RIPEMD256Digest;
import org.bouncycastle.crypto.digests.RIPEMD160Digest;
import org.bouncycastle.crypto.digests.RIPEMD128Digest;
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
import org.bouncycastle.crypto.digests.GOST3411_2012_512Digest;
import org.bouncycastle.crypto.digests.GOST3411_2012_256Digest;
import org.bouncycastle.asn1.rosstandart.RosstandartObjectIdentifiers;
import org.bouncycastle.crypto.digests.GOST3411Digest;
import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
import org.bouncycastle.crypto.digests.MD2Digest;
import org.bouncycastle.crypto.digests.MD4Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.crypto.Xof;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.crypto.digests.SHAKEDigest;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.crypto.digests.SHA384Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.digests.SHA224Digest;
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
import java.util.HashMap;
import java.util.Map;

public class BcDefaultDigestProvider implements BcDigestProvider
{
    private static final Map lookup;
    public static final BcDigestProvider INSTANCE;
    
    private static Map createTable() {
        final HashMap m = new HashMap();
        m.put(OIWObjectIdentifiers.idSHA1, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA1Digest();
            }
        });
        m.put(NISTObjectIdentifiers.id_sha224, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA224Digest();
            }
        });
        m.put(NISTObjectIdentifiers.id_sha256, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA256Digest();
            }
        });
        m.put(NISTObjectIdentifiers.id_sha384, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA384Digest();
            }
        });
        m.put(NISTObjectIdentifiers.id_sha512, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA512Digest();
            }
        });
        m.put(NISTObjectIdentifiers.id_sha3_224, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA3Digest(224);
            }
        });
        m.put(NISTObjectIdentifiers.id_sha3_256, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA3Digest(256);
            }
        });
        m.put(NISTObjectIdentifiers.id_sha3_384, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA3Digest(384);
            }
        });
        m.put(NISTObjectIdentifiers.id_sha3_512, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHA3Digest(512);
            }
        });
        m.put(NISTObjectIdentifiers.id_shake128, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHAKEDigest(128);
            }
        });
        m.put(NISTObjectIdentifiers.id_shake256, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SHAKEDigest(256);
            }
        });
        m.put(NISTObjectIdentifiers.id_shake128_len, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new AdjustedXof(new SHAKEDigest(128), ASN1Integer.getInstance(algorithmIdentifier.getParameters()).intValueExact());
            }
        });
        m.put(NISTObjectIdentifiers.id_shake256_len, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new AdjustedXof(new SHAKEDigest(256), ASN1Integer.getInstance(algorithmIdentifier.getParameters()).intValueExact());
            }
        });
        m.put(PKCSObjectIdentifiers.md5, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new MD5Digest();
            }
        });
        m.put(PKCSObjectIdentifiers.md4, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new MD4Digest();
            }
        });
        m.put(PKCSObjectIdentifiers.md2, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new MD2Digest();
            }
        });
        m.put(CryptoProObjectIdentifiers.gostR3411, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new GOST3411Digest();
            }
        });
        m.put(RosstandartObjectIdentifiers.id_tc26_gost_3411_12_256, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new GOST3411_2012_256Digest();
            }
        });
        m.put(RosstandartObjectIdentifiers.id_tc26_gost_3411_12_512, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new GOST3411_2012_512Digest();
            }
        });
        m.put(TeleTrusTObjectIdentifiers.ripemd128, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new RIPEMD128Digest();
            }
        });
        m.put(TeleTrusTObjectIdentifiers.ripemd160, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new RIPEMD160Digest();
            }
        });
        m.put(TeleTrusTObjectIdentifiers.ripemd256, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new RIPEMD256Digest();
            }
        });
        m.put(GMObjectIdentifiers.sm3, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new SM3Digest();
            }
        });
        m.put(MiscObjectIdentifiers.blake3_256, new BcDigestProvider() {
            @Override
            public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) {
                return new Blake3Digest(256);
            }
        });
        return Collections.unmodifiableMap((Map<?, ?>)m);
    }
    
    private BcDefaultDigestProvider() {
    }
    
    @Override
    public ExtendedDigest get(final AlgorithmIdentifier algorithmIdentifier) throws OperatorCreationException {
        final BcDigestProvider bcDigestProvider = BcDefaultDigestProvider.lookup.get(algorithmIdentifier.getAlgorithm());
        if (bcDigestProvider == null) {
            throw new OperatorCreationException("cannot recognise digest");
        }
        return bcDigestProvider.get(algorithmIdentifier);
    }
    
    static {
        lookup = createTable();
        INSTANCE = new BcDefaultDigestProvider();
    }
    
    private static class AdjustedXof implements Xof
    {
        private final Xof xof;
        private final int length;
        
        AdjustedXof(final Xof xof, final int length) {
            this.xof = xof;
            this.length = length;
        }
        
        @Override
        public String getAlgorithmName() {
            return this.xof.getAlgorithmName() + "-" + this.length;
        }
        
        @Override
        public int getDigestSize() {
            return (this.length + 7) / 8;
        }
        
        @Override
        public void update(final byte b) {
            this.xof.update(b);
        }
        
        @Override
        public void update(final byte[] array, final int n, final int n2) {
            this.xof.update(array, n, n2);
        }
        
        @Override
        public int doFinal(final byte[] array, final int n) {
            return this.doFinal(array, n, this.getDigestSize());
        }
        
        @Override
        public void reset() {
            this.xof.reset();
        }
        
        @Override
        public int getByteLength() {
            return this.xof.getByteLength();
        }
        
        @Override
        public int doFinal(final byte[] array, final int n, final int n2) {
            return this.xof.doFinal(array, n, n2);
        }
        
        @Override
        public int doOutput(final byte[] array, final int n, final int n2) {
            return this.xof.doOutput(array, n, n2);
        }
    }
}
