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

package org.bouncycastle.cert.cmp;

import org.bouncycastle.operator.OperatorCreationException;
import java.io.IOException;
import java.io.OutputStream;
import org.bouncycastle.operator.DigestCalculator;
import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.ASN1Object;

class CMPUtil
{
    static byte[] calculateCertHash(final ASN1Object asn1Object, final AlgorithmIdentifier algorithmIdentifier, final DigestCalculatorProvider digestCalculatorProvider, final DigestAlgorithmIdentifierFinder digestAlgorithmIdentifierFinder) throws CMPException {
        final AlgorithmIdentifier find = digestAlgorithmIdentifierFinder.find(algorithmIdentifier);
        if (find == null) {
            throw new CMPException("cannot find digest algorithm from signature algorithm");
        }
        return calculateDigest(asn1Object, find, digestCalculatorProvider);
    }
    
    static byte[] calculateDigest(final ASN1Object asn1Object, final AlgorithmIdentifier algorithmIdentifier, final DigestCalculatorProvider digestCalculatorProvider) throws CMPException {
        final DigestCalculator digestCalculator = getDigestCalculator(algorithmIdentifier, digestCalculatorProvider);
        derEncodeToStream(asn1Object, digestCalculator.getOutputStream());
        return digestCalculator.getDigest();
    }
    
    static void derEncodeToStream(final ASN1Object asn1Object, final OutputStream outputStream) {
        try {
            asn1Object.encodeTo(outputStream, "DER");
            outputStream.close();
        }
        catch (final IOException ex) {
            throw new CMPRuntimeException("unable to DER encode object: " + ex.getMessage(), ex);
        }
    }
    
    static DigestCalculator getDigestCalculator(final AlgorithmIdentifier algorithmIdentifier, final DigestCalculatorProvider digestCalculatorProvider) throws CMPException {
        try {
            return digestCalculatorProvider.get(algorithmIdentifier);
        }
        catch (final OperatorCreationException ex) {
            throw new CMPException("unable to create digester: " + ex.getMessage(), ex);
        }
    }
}
