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

package org.bouncycastle.cert.cmp;

import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.asn1.cmp.POPODecKeyChallContent;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.cms.CMSEnvelopedData;
import java.io.OutputStream;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.cms.EnvelopedData;
import org.bouncycastle.cms.CMSTypedData;
import org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.asn1.cmp.Challenge;
import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.cms.RecipientInfoGenerator;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.operator.DigestCalculator;

public class POPODecryptionKeyChallengeContentBuilder
{
    private final DigestCalculator owfCalculator;
    private final ASN1ObjectIdentifier challengeEncAlg;
    private ASN1EncodableVector challenges;
    
    public POPODecryptionKeyChallengeContentBuilder(final DigestCalculator owfCalculator, final ASN1ObjectIdentifier challengeEncAlg) {
        this.challenges = new ASN1EncodableVector();
        this.owfCalculator = owfCalculator;
        this.challengeEncAlg = challengeEncAlg;
    }
    
    public POPODecryptionKeyChallengeContentBuilder addChallenge(final RecipientInfoGenerator recipientInfoGenerator, final GeneralName generalName, final byte[] array) throws CMPException {
        final byte[] clone = Arrays.clone(array);
        try {
            final OutputStream outputStream = this.owfCalculator.getOutputStream();
            outputStream.write(new ASN1Integer(clone).getEncoded());
            outputStream.close();
        }
        catch (final IOException ex) {
            throw new CMPException("unable to calculate witness", ex);
        }
        CMSEnvelopedData generate;
        try {
            final CMSEnvelopedDataGenerator cmsEnvelopedDataGenerator = new CMSEnvelopedDataGenerator();
            cmsEnvelopedDataGenerator.addRecipientInfoGenerator(recipientInfoGenerator);
            generate = cmsEnvelopedDataGenerator.generate(new CMSProcessableByteArray(new Challenge.Rand(array, generalName).getEncoded()), new JceCMSContentEncryptorBuilder(this.challengeEncAlg).setProvider("BC").build());
        }
        catch (final Exception ex2) {
            throw new CMPException("unable to encrypt challenge", ex2);
        }
        final EnvelopedData instance = EnvelopedData.getInstance(generate.toASN1Structure().getContent());
        if (this.challenges.size() == 0) {
            this.challenges.add(new Challenge(this.owfCalculator.getAlgorithmIdentifier(), this.owfCalculator.getDigest(), instance));
        }
        else {
            this.challenges.add(new Challenge(this.owfCalculator.getDigest(), instance));
        }
        return this;
    }
    
    public POPODecryptionKeyChallengeContent build() {
        return new POPODecryptionKeyChallengeContent(POPODecKeyChallContent.getInstance(new DERSequence(this.challenges)), new DigestCalculatorProvider() {
            @Override
            public DigestCalculator get(final AlgorithmIdentifier algorithmIdentifier) throws OperatorCreationException {
                return POPODecryptionKeyChallengeContentBuilder.this.owfCalculator;
            }
        });
    }
}
