001package org.apache.commons.ssl.org.bouncycastle.asn1.cmp;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.crmf.EncryptedValue;
011import org.apache.commons.ssl.org.bouncycastle.asn1.crmf.PKIPublicationInfo;
012
013public class CertifiedKeyPair
014    extends ASN1Object
015{
016    private CertOrEncCert certOrEncCert;
017    private EncryptedValue privateKey;
018    private PKIPublicationInfo  publicationInfo;
019
020    private CertifiedKeyPair(ASN1Sequence seq)
021    {
022        certOrEncCert = CertOrEncCert.getInstance(seq.getObjectAt(0));
023
024        if (seq.size() >= 2)
025        {
026            if (seq.size() == 2)
027            {
028                ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(seq.getObjectAt(1));
029                if (tagged.getTagNo() == 0)
030                {
031                    privateKey = EncryptedValue.getInstance(tagged.getObject());
032                }
033                else
034                {
035                    publicationInfo = PKIPublicationInfo.getInstance(tagged.getObject());
036                }
037            }
038            else
039            {
040                privateKey = EncryptedValue.getInstance(ASN1TaggedObject.getInstance(seq.getObjectAt(1)));
041                publicationInfo = PKIPublicationInfo.getInstance(ASN1TaggedObject.getInstance(seq.getObjectAt(2)));
042            }
043        }
044    }
045
046    public static CertifiedKeyPair getInstance(Object o)
047    {
048        if (o instanceof CertifiedKeyPair)
049        {
050            return (CertifiedKeyPair)o;
051        }
052
053        if (o != null)
054        {
055            return new CertifiedKeyPair(ASN1Sequence.getInstance(o));
056        }
057
058        return null;
059    }
060
061    public CertifiedKeyPair(
062        CertOrEncCert certOrEncCert)
063    {
064        this(certOrEncCert, null, null);
065    }
066
067    public CertifiedKeyPair(
068        CertOrEncCert certOrEncCert,
069        EncryptedValue privateKey,
070        PKIPublicationInfo  publicationInfo
071        )
072    {
073        if (certOrEncCert == null)
074        {
075            throw new IllegalArgumentException("'certOrEncCert' cannot be null");
076        }
077
078        this.certOrEncCert = certOrEncCert;
079        this.privateKey = privateKey;
080        this.publicationInfo = publicationInfo;
081    }
082
083    public CertOrEncCert getCertOrEncCert()
084    {
085        return certOrEncCert;
086    }
087
088    public EncryptedValue getPrivateKey()
089    {
090        return privateKey;
091    }
092
093    public PKIPublicationInfo getPublicationInfo()
094    {
095        return publicationInfo;
096    }
097
098    /**
099     * <pre>
100     * CertifiedKeyPair ::= SEQUENCE {
101     *                                  certOrEncCert       CertOrEncCert,
102     *                                  privateKey      [0] EncryptedValue      OPTIONAL,
103     *                                  -- see [CRMF] for comment on encoding
104     *                                  publicationInfo [1] PKIPublicationInfo  OPTIONAL
105     *       }
106     * </pre>
107     * @return a basic ASN.1 object representation.
108     */
109    public ASN1Primitive toASN1Primitive()
110    {
111        ASN1EncodableVector v = new ASN1EncodableVector();
112
113        v.add(certOrEncCert);
114
115        if (privateKey != null)
116        {
117            v.add(new DERTaggedObject(true, 0, privateKey));
118        }
119
120        if (publicationInfo != null)
121        {
122            v.add(new DERTaggedObject(true, 1, publicationInfo));
123        }
124
125        return new DERSequence(v);
126    }
127}