001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
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.DERSequence;
012
013public class AttributeCertificateInfo
014    extends ASN1Object
015{
016    private ASN1Integer             version;
017    private Holder                  holder;
018    private AttCertIssuer           issuer;
019    private AlgorithmIdentifier     signature;
020    private ASN1Integer              serialNumber;
021    private AttCertValidityPeriod   attrCertValidityPeriod;
022    private ASN1Sequence            attributes;
023    private DERBitString            issuerUniqueID;
024    private Extensions              extensions;
025
026    public static AttributeCertificateInfo getInstance(
027        ASN1TaggedObject obj,
028        boolean          explicit)
029    {
030        return getInstance(ASN1Sequence.getInstance(obj, explicit));
031    }
032
033    public static AttributeCertificateInfo getInstance(
034        Object  obj)
035    {
036        if (obj instanceof AttributeCertificateInfo)
037        {
038            return (AttributeCertificateInfo)obj;
039        }
040        else if (obj != null)
041        {
042            return new AttributeCertificateInfo(ASN1Sequence.getInstance(obj));
043        }
044
045        return null;
046    }
047
048    private AttributeCertificateInfo(
049        ASN1Sequence   seq)
050    {
051        if (seq.size() < 6 || seq.size() > 9)
052        {
053            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
054        }
055
056        int start;
057        if (seq.getObjectAt(0) instanceof ASN1Integer)   // in version 1 certs version is DEFAULT  v1(0)
058        {
059            this.version = ASN1Integer.getInstance(seq.getObjectAt(0));
060            start = 1;
061        }
062        else
063        {
064            this.version = new ASN1Integer(0);
065            start = 0;
066        }
067
068        this.holder = Holder.getInstance(seq.getObjectAt(start));
069        this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(start + 1));
070        this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(start + 2));
071        this.serialNumber = ASN1Integer.getInstance(seq.getObjectAt(start + 3));
072        this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(start + 4));
073        this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(start + 5));
074        
075        for (int i = start + 6; i < seq.size(); i++)
076        {
077            ASN1Encodable    obj = seq.getObjectAt(i);
078
079            if (obj instanceof DERBitString)
080            {
081                this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i));
082            }
083            else if (obj instanceof ASN1Sequence || obj instanceof Extensions)
084            {
085                this.extensions = Extensions.getInstance(seq.getObjectAt(i));
086            }
087        }
088    }
089    
090    public ASN1Integer getVersion()
091    {
092        return version;
093    }
094
095    public Holder getHolder()
096    {
097        return holder;
098    }
099
100    public AttCertIssuer getIssuer()
101    {
102        return issuer;
103    }
104
105    public AlgorithmIdentifier getSignature()
106    {
107        return signature;
108    }
109
110    public ASN1Integer getSerialNumber()
111    {
112        return serialNumber;
113    }
114
115    public AttCertValidityPeriod getAttrCertValidityPeriod()
116    {
117        return attrCertValidityPeriod;
118    }
119
120    public ASN1Sequence getAttributes()
121    {
122        return attributes;
123    }
124
125    public DERBitString getIssuerUniqueID()
126    {
127        return issuerUniqueID;
128    }
129
130    public Extensions getExtensions()
131    {
132        return extensions;
133    }
134
135    /**
136     * Produce an object suitable for an ASN1OutputStream.
137     * <pre>
138     *  AttributeCertificateInfo ::= SEQUENCE {
139     *       version              AttCertVersion -- version is v2,
140     *       holder               Holder,
141     *       issuer               AttCertIssuer,
142     *       signature            AlgorithmIdentifier,
143     *       serialNumber         CertificateSerialNumber,
144     *       attrCertValidityPeriod   AttCertValidityPeriod,
145     *       attributes           SEQUENCE OF Attribute,
146     *       issuerUniqueID       UniqueIdentifier OPTIONAL,
147     *       extensions           Extensions OPTIONAL
148     *  }
149     *
150     *  AttCertVersion ::= INTEGER { v2(1) }
151     * </pre>
152     */
153    public ASN1Primitive toASN1Primitive()
154    {
155        ASN1EncodableVector  v = new ASN1EncodableVector();
156
157        if (version.getValue().intValue() != 0)
158        {
159            v.add(version);
160        }
161        v.add(holder);
162        v.add(issuer);
163        v.add(signature);
164        v.add(serialNumber);
165        v.add(attrCertValidityPeriod);
166        v.add(attributes);
167        
168        if (issuerUniqueID != null)
169        {
170            v.add(issuerUniqueID);
171        }
172        
173        if (extensions != null)
174        {
175            v.add(extensions);
176        }
177        
178        return new DERSequence(v);
179    }
180}