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

package org.bouncycastle.cert;

import org.bouncycastle.operator.ContentSigner;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.x509.Extension;
import java.util.Enumeration;
import org.bouncycastle.asn1.x509.Extensions;
import org.bouncycastle.asn1.x509.Attribute;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import java.util.Locale;
import org.bouncycastle.asn1.ASN1GeneralizedTime;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.x509.AttCertIssuer;
import java.util.Date;
import java.math.BigInteger;
import org.bouncycastle.asn1.x509.ExtensionsGenerator;
import org.bouncycastle.asn1.x509.V2AttributeCertificateInfoGenerator;

public class X509v2AttributeCertificateBuilder
{
    private V2AttributeCertificateInfoGenerator acInfoGen;
    private ExtensionsGenerator extGenerator;
    
    public X509v2AttributeCertificateBuilder(final AttributeCertificateHolder attributeCertificateHolder, final AttributeCertificateIssuer attributeCertificateIssuer, final BigInteger bigInteger, final Date date, final Date date2) {
        this.acInfoGen = new V2AttributeCertificateInfoGenerator();
        this.extGenerator = new ExtensionsGenerator();
        this.acInfoGen.setHolder(attributeCertificateHolder.holder);
        this.acInfoGen.setIssuer(AttCertIssuer.getInstance(attributeCertificateIssuer.form));
        this.acInfoGen.setSerialNumber(new ASN1Integer(bigInteger));
        this.acInfoGen.setStartDate(new ASN1GeneralizedTime(date));
        this.acInfoGen.setEndDate(new ASN1GeneralizedTime(date2));
    }
    
    public X509v2AttributeCertificateBuilder(final AttributeCertificateHolder attributeCertificateHolder, final AttributeCertificateIssuer attributeCertificateIssuer, final BigInteger bigInteger, final Date date, final Date date2, final Locale locale) {
        this.acInfoGen = new V2AttributeCertificateInfoGenerator();
        this.extGenerator = new ExtensionsGenerator();
        this.acInfoGen.setHolder(attributeCertificateHolder.holder);
        this.acInfoGen.setIssuer(AttCertIssuer.getInstance(attributeCertificateIssuer.form));
        this.acInfoGen.setSerialNumber(new ASN1Integer(bigInteger));
        this.acInfoGen.setStartDate(new ASN1GeneralizedTime(date, locale));
        this.acInfoGen.setEndDate(new ASN1GeneralizedTime(date2, locale));
    }
    
    public X509v2AttributeCertificateBuilder(final X509AttributeCertificateHolder x509AttributeCertificateHolder) {
        (this.acInfoGen = new V2AttributeCertificateInfoGenerator()).setSerialNumber(new ASN1Integer(x509AttributeCertificateHolder.getSerialNumber()));
        this.acInfoGen.setIssuer(AttCertIssuer.getInstance(x509AttributeCertificateHolder.getIssuer().form));
        this.acInfoGen.setStartDate(new ASN1GeneralizedTime(x509AttributeCertificateHolder.getNotBefore()));
        this.acInfoGen.setEndDate(new ASN1GeneralizedTime(x509AttributeCertificateHolder.getNotAfter()));
        this.acInfoGen.setHolder(x509AttributeCertificateHolder.getHolder().holder);
        final boolean[] issuerUniqueID = x509AttributeCertificateHolder.getIssuerUniqueID();
        if (issuerUniqueID != null) {
            this.acInfoGen.setIssuerUniqueID(CertUtils.booleanToBitString(issuerUniqueID));
        }
        final Attribute[] attributes = x509AttributeCertificateHolder.getAttributes();
        for (int i = 0; i != attributes.length; ++i) {
            this.acInfoGen.addAttribute(attributes[i]);
        }
        this.extGenerator = new ExtensionsGenerator();
        final Extensions extensions = x509AttributeCertificateHolder.getExtensions();
        final Enumeration oids = extensions.oids();
        while (oids.hasMoreElements()) {
            this.extGenerator.addExtension(extensions.getExtension((ASN1ObjectIdentifier)oids.nextElement()));
        }
    }
    
    public boolean hasExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier) {
        return this.doGetExtension(asn1ObjectIdentifier) != null;
    }
    
    public Extension getExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier) {
        return this.doGetExtension(asn1ObjectIdentifier);
    }
    
    private Extension doGetExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier) {
        if (this.extGenerator.isEmpty()) {
            return null;
        }
        return this.extGenerator.generate().getExtension(asn1ObjectIdentifier);
    }
    
    public X509v2AttributeCertificateBuilder addAttribute(final ASN1ObjectIdentifier asn1ObjectIdentifier, final ASN1Encodable asn1Encodable) {
        this.acInfoGen.addAttribute(new Attribute(asn1ObjectIdentifier, new DERSet(asn1Encodable)));
        return this;
    }
    
    public X509v2AttributeCertificateBuilder addAttribute(final ASN1ObjectIdentifier asn1ObjectIdentifier, final ASN1Encodable[] array) {
        this.acInfoGen.addAttribute(new Attribute(asn1ObjectIdentifier, new DERSet(array)));
        return this;
    }
    
    public void setIssuerUniqueId(final boolean[] array) {
        this.acInfoGen.setIssuerUniqueID(CertUtils.booleanToBitString(array));
    }
    
    public X509v2AttributeCertificateBuilder addExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier, final boolean b, final ASN1Encodable asn1Encodable) throws CertIOException {
        CertUtils.addExtension(this.extGenerator, asn1ObjectIdentifier, b, asn1Encodable);
        return this;
    }
    
    public X509v2AttributeCertificateBuilder addExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier, final boolean b, final byte[] array) throws CertIOException {
        this.extGenerator.addExtension(asn1ObjectIdentifier, b, array);
        return this;
    }
    
    public X509v2AttributeCertificateBuilder addExtension(final Extension extension) throws CertIOException {
        this.extGenerator.addExtension(extension);
        return this;
    }
    
    public X509v2AttributeCertificateBuilder replaceExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier, final boolean b, final ASN1Encodable asn1Encodable) throws CertIOException {
        try {
            this.extGenerator = CertUtils.doReplaceExtension(this.extGenerator, new Extension(asn1ObjectIdentifier, b, new DEROctetString(asn1Encodable)));
        }
        catch (final IOException ex) {
            throw new CertIOException("cannot encode extension: " + ex.getMessage(), ex);
        }
        return this;
    }
    
    public X509v2AttributeCertificateBuilder replaceExtension(final Extension extension) throws CertIOException {
        this.extGenerator = CertUtils.doReplaceExtension(this.extGenerator, extension);
        return this;
    }
    
    public X509v2AttributeCertificateBuilder replaceExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier, final boolean b, final byte[] array) throws CertIOException {
        this.extGenerator = CertUtils.doReplaceExtension(this.extGenerator, new Extension(asn1ObjectIdentifier, b, array));
        return this;
    }
    
    public X509v2AttributeCertificateBuilder removeExtension(final ASN1ObjectIdentifier asn1ObjectIdentifier) {
        this.extGenerator = CertUtils.doRemoveExtension(this.extGenerator, asn1ObjectIdentifier);
        return this;
    }
    
    public X509AttributeCertificateHolder build(final ContentSigner contentSigner) {
        this.acInfoGen.setSignature(contentSigner.getAlgorithmIdentifier());
        if (!this.extGenerator.isEmpty()) {
            this.acInfoGen.setExtensions(this.extGenerator.generate());
        }
        return CertUtils.generateFullAttrCert(contentSigner, this.acInfoGen.generateAttributeCertificateInfo());
    }
}
