AttributeCertificateInfo.java revision 5db505e1f6a68c8d5dfdb0fed0b8607dea7bed96
1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1Integer;
6import org.bouncycastle.asn1.ASN1Object;
7import org.bouncycastle.asn1.ASN1Primitive;
8import org.bouncycastle.asn1.ASN1Sequence;
9import org.bouncycastle.asn1.ASN1TaggedObject;
10import org.bouncycastle.asn1.DERBitString;
11import org.bouncycastle.asn1.DERSequence;
12
13public class AttributeCertificateInfo
14    extends ASN1Object
15{
16    private ASN1Integer             version;
17    private Holder                  holder;
18    private AttCertIssuer           issuer;
19    private AlgorithmIdentifier     signature;
20    private ASN1Integer              serialNumber;
21    private AttCertValidityPeriod   attrCertValidityPeriod;
22    private ASN1Sequence            attributes;
23    private DERBitString            issuerUniqueID;
24    private Extensions              extensions;
25
26    public static AttributeCertificateInfo getInstance(
27        ASN1TaggedObject obj,
28        boolean          explicit)
29    {
30        return getInstance(ASN1Sequence.getInstance(obj, explicit));
31    }
32
33    public static AttributeCertificateInfo getInstance(
34        Object  obj)
35    {
36        if (obj instanceof AttributeCertificateInfo)
37        {
38            return (AttributeCertificateInfo)obj;
39        }
40        else if (obj != null)
41        {
42            return new AttributeCertificateInfo(ASN1Sequence.getInstance(obj));
43        }
44
45        return null;
46    }
47
48    private AttributeCertificateInfo(
49        ASN1Sequence   seq)
50    {
51        if (seq.size() < 6 || seq.size() > 9)
52        {
53            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
54        }
55
56        int start;
57        if (seq.getObjectAt(0) instanceof ASN1Integer)   // in version 1 certs version is DEFAULT  v1(0)
58        {
59            this.version = ASN1Integer.getInstance(seq.getObjectAt(0));
60            start = 1;
61        }
62        else
63        {
64            this.version = new ASN1Integer(0);
65            start = 0;
66        }
67
68        this.holder = Holder.getInstance(seq.getObjectAt(start));
69        this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(start + 1));
70        this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(start + 2));
71        this.serialNumber = ASN1Integer.getInstance(seq.getObjectAt(start + 3));
72        this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(start + 4));
73        this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(start + 5));
74
75        for (int i = start + 6; i < seq.size(); i++)
76        {
77            ASN1Encodable    obj = seq.getObjectAt(i);
78
79            if (obj instanceof DERBitString)
80            {
81                this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i));
82            }
83            else if (obj instanceof ASN1Sequence || obj instanceof Extensions)
84            {
85                this.extensions = Extensions.getInstance(seq.getObjectAt(i));
86            }
87        }
88    }
89
90    public ASN1Integer getVersion()
91    {
92        return version;
93    }
94
95    public Holder getHolder()
96    {
97        return holder;
98    }
99
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}
181