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

package org.bouncycastle.asn1.cmp;

import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.crmf.EncryptedValue;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.crmf.PKIPublicationInfo;
import org.bouncycastle.asn1.crmf.EncryptedKey;
import org.bouncycastle.asn1.ASN1Object;

public class CertifiedKeyPair extends ASN1Object
{
    private final CertOrEncCert certOrEncCert;
    private EncryptedKey privateKey;
    private PKIPublicationInfo publicationInfo;
    
    private CertifiedKeyPair(final ASN1Sequence asn1Sequence) {
        this.certOrEncCert = CertOrEncCert.getInstance(asn1Sequence.getObjectAt(0));
        if (asn1Sequence.size() >= 2) {
            if (asn1Sequence.size() == 2) {
                final ASN1TaggedObject instance = ASN1TaggedObject.getInstance(asn1Sequence.getObjectAt(1), 128);
                if (instance.getTagNo() == 0) {
                    this.privateKey = EncryptedKey.getInstance(instance.getExplicitBaseObject());
                }
                else {
                    this.publicationInfo = PKIPublicationInfo.getInstance(instance.getExplicitBaseObject());
                }
            }
            else {
                this.privateKey = EncryptedKey.getInstance(ASN1TaggedObject.getInstance(asn1Sequence.getObjectAt(1), 128).getExplicitBaseObject());
                this.publicationInfo = PKIPublicationInfo.getInstance(ASN1TaggedObject.getInstance(asn1Sequence.getObjectAt(2), 128).getExplicitBaseObject());
            }
        }
    }
    
    public CertifiedKeyPair(final CertOrEncCert certOrEncCert) {
        this(certOrEncCert, (EncryptedKey)null, null);
    }
    
    public CertifiedKeyPair(final CertOrEncCert certOrEncCert, final EncryptedKey privateKey, final PKIPublicationInfo publicationInfo) {
        if (certOrEncCert == null) {
            throw new IllegalArgumentException("'certOrEncCert' cannot be null");
        }
        this.certOrEncCert = certOrEncCert;
        this.privateKey = privateKey;
        this.publicationInfo = publicationInfo;
    }
    
    public CertifiedKeyPair(final CertOrEncCert certOrEncCert, final EncryptedValue encryptedValue, final PKIPublicationInfo publicationInfo) {
        if (certOrEncCert == null) {
            throw new IllegalArgumentException("'certOrEncCert' cannot be null");
        }
        this.certOrEncCert = certOrEncCert;
        this.privateKey = ((encryptedValue != null) ? new EncryptedKey(encryptedValue) : null);
        this.publicationInfo = publicationInfo;
    }
    
    public static CertifiedKeyPair getInstance(final Object o) {
        if (o instanceof CertifiedKeyPair) {
            return (CertifiedKeyPair)o;
        }
        if (o != null) {
            return new CertifiedKeyPair(ASN1Sequence.getInstance(o));
        }
        return null;
    }
    
    public CertOrEncCert getCertOrEncCert() {
        return this.certOrEncCert;
    }
    
    public EncryptedKey getPrivateKey() {
        return this.privateKey;
    }
    
    public PKIPublicationInfo getPublicationInfo() {
        return this.publicationInfo;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector(3);
        asn1EncodableVector.add(this.certOrEncCert);
        if (this.privateKey != null) {
            asn1EncodableVector.add(new DERTaggedObject(true, 0, this.privateKey));
        }
        if (this.publicationInfo != null) {
            asn1EncodableVector.add(new DERTaggedObject(true, 1, this.publicationInfo));
        }
        return new DERSequence(asn1EncodableVector);
    }
}
