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

package org.bouncycastle.cms.jcajce;

import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.cms.SignerInfoGeneratorBuilder;
import java.security.cert.CertificateEncodingException;
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import java.security.cert.X509Certificate;
import org.bouncycastle.cms.SignerInfoGenerator;
import org.bouncycastle.cert.X509CertificateHolder;
import java.security.PrivateKey;
import org.bouncycastle.cms.DefaultSignedAttributeTableGenerator;
import org.bouncycastle.asn1.cms.AttributeTable;
import java.security.Provider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.cms.CMSAttributeTableGenerator;

public class JcaSimpleSignerInfoGeneratorBuilder
{
    private Helper helper;
    private boolean hasNoSignedAttributes;
    private CMSAttributeTableGenerator signedGen;
    private CMSAttributeTableGenerator unsignedGen;
    private AlgorithmIdentifier contentDigest;
    
    public JcaSimpleSignerInfoGeneratorBuilder() throws OperatorCreationException {
        this.helper = new Helper();
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setProvider(final String s) throws OperatorCreationException {
        this.helper = new NamedHelper(s);
        return this;
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setProvider(final Provider provider) throws OperatorCreationException {
        this.helper = new ProviderHelper(provider);
        return this;
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setDirectSignature(final boolean hasNoSignedAttributes) {
        this.hasNoSignedAttributes = hasNoSignedAttributes;
        return this;
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setContentDigest(final AlgorithmIdentifier contentDigest) {
        this.contentDigest = contentDigest;
        return this;
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setSignedAttributeGenerator(final CMSAttributeTableGenerator signedGen) {
        this.signedGen = signedGen;
        return this;
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setSignedAttributeGenerator(final AttributeTable attributeTable) {
        this.signedGen = new DefaultSignedAttributeTableGenerator(attributeTable);
        return this;
    }
    
    public JcaSimpleSignerInfoGeneratorBuilder setUnsignedAttributeGenerator(final CMSAttributeTableGenerator unsignedGen) {
        this.unsignedGen = unsignedGen;
        return this;
    }
    
    public SignerInfoGenerator build(final String s, PrivateKey cleanPrivateKey, final X509CertificateHolder x509CertificateHolder) throws OperatorCreationException {
        cleanPrivateKey = CMSUtils.cleanPrivateKey(cleanPrivateKey);
        return this.configureAndBuild().build(this.helper.createContentSigner(s, cleanPrivateKey), x509CertificateHolder);
    }
    
    public SignerInfoGenerator build(final String s, PrivateKey cleanPrivateKey, final X509Certificate x509Certificate) throws OperatorCreationException, CertificateEncodingException {
        cleanPrivateKey = CMSUtils.cleanPrivateKey(cleanPrivateKey);
        return this.configureAndBuild().build(this.helper.createContentSigner(s, cleanPrivateKey), new JcaX509CertificateHolder(x509Certificate));
    }
    
    public SignerInfoGenerator build(final String s, PrivateKey cleanPrivateKey, final byte[] array) throws OperatorCreationException {
        cleanPrivateKey = CMSUtils.cleanPrivateKey(cleanPrivateKey);
        return this.configureAndBuild().build(this.helper.createContentSigner(s, cleanPrivateKey), array);
    }
    
    private SignerInfoGeneratorBuilder configureAndBuild() throws OperatorCreationException {
        final SignerInfoGeneratorBuilder signerInfoGeneratorBuilder = new SignerInfoGeneratorBuilder(this.helper.createDigestCalculatorProvider());
        signerInfoGeneratorBuilder.setDirectSignature(this.hasNoSignedAttributes);
        signerInfoGeneratorBuilder.setContentDigest(this.contentDigest);
        signerInfoGeneratorBuilder.setSignedAttributeGenerator(this.signedGen);
        signerInfoGeneratorBuilder.setUnsignedAttributeGenerator(this.unsignedGen);
        return signerInfoGeneratorBuilder;
    }
    
    private static class Helper
    {
        ContentSigner createContentSigner(final String s, PrivateKey cleanPrivateKey) throws OperatorCreationException {
            cleanPrivateKey = CMSUtils.cleanPrivateKey(cleanPrivateKey);
            return new JcaContentSignerBuilder(s).build(cleanPrivateKey);
        }
        
        DigestCalculatorProvider createDigestCalculatorProvider() throws OperatorCreationException {
            return new JcaDigestCalculatorProviderBuilder().build();
        }
    }
    
    private static class NamedHelper extends Helper
    {
        private final String providerName;
        
        public NamedHelper(final String providerName) {
            this.providerName = providerName;
        }
        
        @Override
        ContentSigner createContentSigner(final String s, PrivateKey cleanPrivateKey) throws OperatorCreationException {
            cleanPrivateKey = CMSUtils.cleanPrivateKey(cleanPrivateKey);
            return new JcaContentSignerBuilder(s).setProvider(this.providerName).build(cleanPrivateKey);
        }
        
        @Override
        DigestCalculatorProvider createDigestCalculatorProvider() throws OperatorCreationException {
            return new JcaDigestCalculatorProviderBuilder().setProvider(this.providerName).build();
        }
    }
    
    private static class ProviderHelper extends Helper
    {
        private final Provider provider;
        
        public ProviderHelper(final Provider provider) {
            this.provider = provider;
        }
        
        @Override
        ContentSigner createContentSigner(final String s, PrivateKey cleanPrivateKey) throws OperatorCreationException {
            cleanPrivateKey = CMSUtils.cleanPrivateKey(cleanPrivateKey);
            return new JcaContentSignerBuilder(s).setProvider(this.provider).build(cleanPrivateKey);
        }
        
        @Override
        DigestCalculatorProvider createDigestCalculatorProvider() throws OperatorCreationException {
            return new JcaDigestCalculatorProviderBuilder().setProvider(this.provider).build();
        }
    }
}
