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

package org.bouncycastle.cert;

import java.util.Enumeration;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x509.ExtensionsGenerator;
import org.bouncycastle.asn1.x509.Validity;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.x509.Extensions;
import org.bouncycastle.asn1.ASN1BitString;
import org.bouncycastle.asn1.x509.TBSCertificate;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.x509.DeltaCertificateDescriptor;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.Certificate;

public class DeltaCertificateTool
{
    public static Extension makeDeltaCertificateExtension(final boolean b, final Certificate certificate) throws IOException {
        return new Extension(Extension.deltaCertificateDescriptor, b, new DEROctetString(new DeltaCertificateDescriptor(certificate.getSerialNumber(), certificate.getSignatureAlgorithm(), certificate.getIssuer(), certificate.getValidity(), certificate.getSubject(), certificate.getSubjectPublicKeyInfo(), certificate.getExtensions(), certificate.getSignature()).getEncoded("DER")));
    }
    
    public static Extension makeDeltaCertificateExtension(final boolean b, final X509CertificateHolder x509CertificateHolder) throws IOException {
        return makeDeltaCertificateExtension(b, x509CertificateHolder.toASN1Structure());
    }
    
    public static Certificate extractDeltaCertificate(final TBSCertificate tbsCertificate) {
        final Extensions extensions = tbsCertificate.getExtensions();
        final Extension extension = extensions.getExtension(Extension.deltaCertificateDescriptor);
        if (extension == null) {
            throw new IllegalStateException("no deltaCertificateDescriptor present");
        }
        final DeltaCertificateDescriptor instance = DeltaCertificateDescriptor.getInstance(extension.getParsedValue());
        final ASN1Integer version = tbsCertificate.getVersion();
        final ASN1Integer serialNumber = instance.getSerialNumber();
        AlgorithmIdentifier algorithmIdentifier = instance.getSignature();
        if (algorithmIdentifier == null) {
            algorithmIdentifier = tbsCertificate.getSignature();
        }
        X500Name x500Name = instance.getIssuer();
        if (x500Name == null) {
            x500Name = tbsCertificate.getIssuer();
        }
        Validity validity = instance.getValidityObject();
        if (validity == null) {
            validity = tbsCertificate.getValidity();
        }
        X500Name x500Name2 = instance.getSubject();
        if (x500Name2 == null) {
            x500Name2 = tbsCertificate.getSubject();
        }
        return new Certificate(new TBSCertificate(version, serialNumber, algorithmIdentifier, x500Name, validity, x500Name2, instance.getSubjectPublicKeyInfo(), null, null, extractDeltaExtensions(instance.getExtensions(), extensions)), algorithmIdentifier, instance.getSignatureValue());
    }
    
    public static X509CertificateHolder extractDeltaCertificate(final X509CertificateHolder x509CertificateHolder) {
        return new X509CertificateHolder(extractDeltaCertificate(x509CertificateHolder.getTBSCertificate()));
    }
    
    public static DeltaCertificateDescriptor trimDeltaCertificateDescriptor(final DeltaCertificateDescriptor deltaCertificateDescriptor, final TBSCertificate tbsCertificate, final Extensions extensions) {
        return deltaCertificateDescriptor.trimTo(tbsCertificate, extensions);
    }
    
    private static Extensions extractDeltaExtensions(final Extensions extensions, final Extensions extensions2) {
        final ExtensionsGenerator extensionsGenerator = new ExtensionsGenerator();
        final Enumeration oids = extensions2.oids();
        while (oids.hasMoreElements()) {
            final ASN1ObjectIdentifier asn1ObjectIdentifier = oids.nextElement();
            if (!Extension.deltaCertificateDescriptor.equals(asn1ObjectIdentifier)) {
                extensionsGenerator.addExtension(extensions2.getExtension(asn1ObjectIdentifier));
            }
        }
        if (extensions != null) {
            final Enumeration oids2 = extensions.oids();
            while (oids2.hasMoreElements()) {
                extensionsGenerator.replaceExtension(extensions.getExtension((ASN1ObjectIdentifier)oids2.nextElement()));
            }
        }
        return extensionsGenerator.isEmpty() ? null : extensionsGenerator.generate();
    }
}
