001package org.apache.commons.ssl.org.bouncycastle.asn1.cmp;
002
003import java.util.Enumeration;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
012import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
013
014public class KeyRecRepContent
015    extends ASN1Object
016{
017    private PKIStatusInfo status;
018    private CMPCertificate newSigCert;
019    private ASN1Sequence caCerts;
020    private ASN1Sequence keyPairHist;
021
022    private KeyRecRepContent(ASN1Sequence seq)
023    {
024        Enumeration en = seq.getObjects();
025
026        status = PKIStatusInfo.getInstance(en.nextElement());
027
028        while (en.hasMoreElements())
029        {
030            ASN1TaggedObject tObj = ASN1TaggedObject.getInstance(en.nextElement());
031
032            switch (tObj.getTagNo())
033            {
034            case 0:
035                newSigCert = CMPCertificate.getInstance(tObj.getObject());
036                break;
037            case 1:
038                caCerts = ASN1Sequence.getInstance(tObj.getObject());
039                break;
040            case 2:
041                keyPairHist = ASN1Sequence.getInstance(tObj.getObject());
042                break;
043            default:
044                throw new IllegalArgumentException("unknown tag number: " + tObj.getTagNo());
045            }
046        }
047    }
048
049    public static KeyRecRepContent getInstance(Object o)
050    {
051        if (o instanceof KeyRecRepContent)
052        {
053            return (KeyRecRepContent)o;
054        }
055
056        if (o != null)
057        {
058            return new KeyRecRepContent(ASN1Sequence.getInstance(o));
059        }
060
061        return null;
062    }
063
064
065    public PKIStatusInfo getStatus()
066    {
067        return status;
068    }
069
070    public CMPCertificate getNewSigCert()
071    {
072        return newSigCert;
073    }
074
075    public CMPCertificate[] getCaCerts()
076    {
077        if (caCerts == null)
078        {
079            return null;
080        }
081
082        CMPCertificate[] results = new CMPCertificate[caCerts.size()];
083
084        for (int i = 0; i != results.length; i++)
085        {
086            results[i] = CMPCertificate.getInstance(caCerts.getObjectAt(i));
087        }
088
089        return results;
090    }
091
092    public CertifiedKeyPair[] getKeyPairHist()
093    {
094        if (keyPairHist == null)
095        {
096            return null;
097        }
098
099        CertifiedKeyPair[] results = new CertifiedKeyPair[keyPairHist.size()];
100
101        for (int i = 0; i != results.length; i++)
102        {
103            results[i] = CertifiedKeyPair.getInstance(keyPairHist.getObjectAt(i));
104        }
105
106        return results;
107    }
108
109    /**
110     * <pre>
111     * KeyRecRepContent ::= SEQUENCE {
112     *                         status                  PKIStatusInfo,
113     *                         newSigCert          [0] CMPCertificate OPTIONAL,
114     *                         caCerts             [1] SEQUENCE SIZE (1..MAX) OF
115     *                                                           CMPCertificate OPTIONAL,
116     *                         keyPairHist         [2] SEQUENCE SIZE (1..MAX) OF
117     *                                                           CertifiedKeyPair OPTIONAL
118     *              }
119     * </pre> 
120     * @return a basic ASN.1 object representation.
121     */
122    public ASN1Primitive toASN1Primitive()
123    {
124        ASN1EncodableVector v = new ASN1EncodableVector();
125
126        v.add(status);
127
128        addOptional(v, 0, newSigCert);
129        addOptional(v, 1, caCerts);
130        addOptional(v, 2, keyPairHist);
131
132        return new DERSequence(v);
133    }
134
135    private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj)
136    {
137        if (obj != null)
138        {
139            v.add(new DERTaggedObject(true, tagNo, obj));
140        }
141    }
142}