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

package org.bouncycastle.asn1.cmp;

import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.DERSequence;
import java.util.Enumeration;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1BitString;
import org.bouncycastle.asn1.ASN1Object;

public class PKIMessage extends ASN1Object
{
    private final PKIHeader header;
    private final PKIBody body;
    private final ASN1BitString protection;
    private final ASN1Sequence extraCerts;
    
    private PKIMessage(final ASN1Sequence asn1Sequence) {
        final Enumeration objects = asn1Sequence.getObjects();
        this.header = PKIHeader.getInstance(objects.nextElement());
        if (objects.hasMoreElements()) {
            this.body = PKIBody.getInstance(objects.nextElement());
            ASN1BitString instance = null;
            ASN1Sequence instance2 = null;
            while (objects.hasMoreElements()) {
                final ASN1TaggedObject asn1TaggedObject = objects.nextElement();
                if (asn1TaggedObject.getTagNo() == 0) {
                    instance = ASN1BitString.getInstance(asn1TaggedObject, true);
                }
                else {
                    instance2 = ASN1Sequence.getInstance(asn1TaggedObject, true);
                }
            }
            this.protection = instance;
            this.extraCerts = instance2;
            return;
        }
        throw new IllegalArgumentException("PKIMessage missing PKIBody structure");
    }
    
    public PKIMessage(final PKIHeader header, final PKIBody body, final ASN1BitString protection, final CMPCertificate[] array) {
        this.header = header;
        this.body = body;
        this.protection = protection;
        if (array != null) {
            this.extraCerts = new DERSequence(array);
        }
        else {
            this.extraCerts = null;
        }
    }
    
    public PKIMessage(final PKIHeader pkiHeader, final PKIBody pkiBody, final ASN1BitString asn1BitString) {
        this(pkiHeader, pkiBody, asn1BitString, null);
    }
    
    public PKIMessage(final PKIHeader pkiHeader, final PKIBody pkiBody) {
        this(pkiHeader, pkiBody, null, null);
    }
    
    public static PKIMessage getInstance(final Object o) {
        if (o instanceof PKIMessage) {
            return (PKIMessage)o;
        }
        if (o != null) {
            return new PKIMessage(ASN1Sequence.getInstance(o));
        }
        return null;
    }
    
    public PKIHeader getHeader() {
        return this.header;
    }
    
    public PKIBody getBody() {
        return this.body;
    }
    
    public ASN1BitString getProtection() {
        return this.protection;
    }
    
    public CMPCertificate[] getExtraCerts() {
        if (this.extraCerts == null) {
            return null;
        }
        final CMPCertificate[] array = new CMPCertificate[this.extraCerts.size()];
        for (int i = 0; i < array.length; ++i) {
            array[i] = CMPCertificate.getInstance(this.extraCerts.getObjectAt(i));
        }
        return array;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector(4);
        asn1EncodableVector.add(this.header);
        asn1EncodableVector.add(this.body);
        this.addOptional(asn1EncodableVector, 0, this.protection);
        this.addOptional(asn1EncodableVector, 1, this.extraCerts);
        return new DERSequence(asn1EncodableVector);
    }
    
    private void addOptional(final ASN1EncodableVector asn1EncodableVector, final int n, final ASN1Encodable asn1Encodable) {
        if (asn1Encodable != null) {
            asn1EncodableVector.add(new DERTaggedObject(true, n, asn1Encodable));
        }
    }
}
