001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf;
002
003import java.util.Enumeration;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
011import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500Name;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Extensions;
014import org.apache.commons.ssl.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
015
016public class CertTemplate
017    extends ASN1Object
018{
019    private ASN1Sequence seq;
020
021    private ASN1Integer version;
022    private ASN1Integer serialNumber;
023    private AlgorithmIdentifier signingAlg;
024    private X500Name issuer;
025    private OptionalValidity validity;
026    private X500Name subject;
027    private SubjectPublicKeyInfo publicKey;
028    private DERBitString issuerUID;
029    private DERBitString subjectUID;
030    private Extensions extensions;
031
032    private CertTemplate(ASN1Sequence seq)
033    {
034        this.seq = seq;
035
036        Enumeration en = seq.getObjects();
037        while (en.hasMoreElements())
038        {
039            ASN1TaggedObject tObj = (ASN1TaggedObject)en.nextElement();
040
041            switch (tObj.getTagNo())
042            {
043            case 0:
044                version = ASN1Integer.getInstance(tObj, false);
045                break;
046            case 1:
047                serialNumber = ASN1Integer.getInstance(tObj, false);
048                break;
049            case 2:
050                signingAlg = AlgorithmIdentifier.getInstance(tObj, false);
051                break;
052            case 3:
053                issuer = X500Name.getInstance(tObj, true); // CHOICE
054                break;
055            case 4:
056                validity = OptionalValidity.getInstance(ASN1Sequence.getInstance(tObj, false));
057                break;
058            case 5:
059                subject = X500Name.getInstance(tObj, true); // CHOICE
060                break;
061            case 6:
062                publicKey = SubjectPublicKeyInfo.getInstance(tObj, false);
063                break;
064            case 7:
065                issuerUID = DERBitString.getInstance(tObj, false);
066                break;
067            case 8:
068                subjectUID = DERBitString.getInstance(tObj, false);
069                break;
070            case 9:
071                extensions = Extensions.getInstance(tObj, false);
072                break;
073            default:
074                throw new IllegalArgumentException("unknown tag: " + tObj.getTagNo());
075            }
076        }
077    }
078
079    public static CertTemplate getInstance(Object o)
080    {
081        if (o instanceof CertTemplate)
082        {
083            return (CertTemplate)o;
084        }
085        else if (o != null)
086        {
087            return new CertTemplate(ASN1Sequence.getInstance(o));
088        }
089
090        return null;
091    }
092
093    public int getVersion()
094    {
095        return version.getValue().intValue();
096    }
097
098    public ASN1Integer getSerialNumber()
099    {
100        return serialNumber;
101    }
102
103    public AlgorithmIdentifier getSigningAlg()
104    {
105        return signingAlg;
106    }
107
108    public X500Name getIssuer()
109    {
110        return issuer;
111    }
112
113    public OptionalValidity getValidity()
114    {
115        return validity;
116    }
117
118    public X500Name getSubject()
119    {
120        return subject;
121    }
122
123    public SubjectPublicKeyInfo getPublicKey()
124    {
125        return publicKey;
126    }
127
128    public DERBitString getIssuerUID()
129    {
130        return issuerUID;
131    }
132
133    public DERBitString getSubjectUID()
134    {
135        return subjectUID;
136    }
137
138    public Extensions getExtensions()
139    {
140        return extensions;
141    }
142
143    /**
144     * <pre>
145     *  CertTemplate ::= SEQUENCE {
146     *      version      [0] Version               OPTIONAL,
147     *      serialNumber [1] INTEGER               OPTIONAL,
148     *      signingAlg   [2] AlgorithmIdentifier   OPTIONAL,
149     *      issuer       [3] Name                  OPTIONAL,
150     *      validity     [4] OptionalValidity      OPTIONAL,
151     *      subject      [5] Name                  OPTIONAL,
152     *      publicKey    [6] SubjectPublicKeyInfo  OPTIONAL,
153     *      issuerUID    [7] UniqueIdentifier      OPTIONAL,
154     *      subjectUID   [8] UniqueIdentifier      OPTIONAL,
155     *      extensions   [9] Extensions            OPTIONAL }
156     * </pre>
157     * @return a basic ASN.1 object representation.
158     */
159    public ASN1Primitive toASN1Primitive()
160    {
161        return seq;
162    }
163}