AttributeCertificateInfo.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
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() < 7 || seq.size() > 9)
52        {
53            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
54        }
55
56        this.version = ASN1Integer.getInstance(seq.getObjectAt(0));
57        this.holder = Holder.getInstance(seq.getObjectAt(1));
58        this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(2));
59        this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(3));
60        this.serialNumber = ASN1Integer.getInstance(seq.getObjectAt(4));
61        this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(5));
62        this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(6));
63
64        for (int i = 7; i < seq.size(); i++)
65        {
66            ASN1Encodable    obj = (ASN1Encodable)seq.getObjectAt(i);
67
68            if (obj instanceof DERBitString)
69            {
70                this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i));
71            }
72            else if (obj instanceof ASN1Sequence || obj instanceof Extensions)
73            {
74                this.extensions = Extensions.getInstance(seq.getObjectAt(i));
75            }
76        }
77    }
78
79    public ASN1Integer getVersion()
80    {
81        return version;
82    }
83
84    public Holder getHolder()
85    {
86        return holder;
87    }
88
89    public AttCertIssuer getIssuer()
90    {
91        return issuer;
92    }
93
94    public AlgorithmIdentifier getSignature()
95    {
96        return signature;
97    }
98
99    public ASN1Integer getSerialNumber()
100    {
101        return serialNumber;
102    }
103
104    public AttCertValidityPeriod getAttrCertValidityPeriod()
105    {
106        return attrCertValidityPeriod;
107    }
108
109    public ASN1Sequence getAttributes()
110    {
111        return attributes;
112    }
113
114    public DERBitString getIssuerUniqueID()
115    {
116        return issuerUniqueID;
117    }
118
119    public Extensions getExtensions()
120    {
121        return extensions;
122    }
123
124    /**
125     * Produce an object suitable for an ASN1OutputStream.
126     * <pre>
127     *  AttributeCertificateInfo ::= SEQUENCE {
128     *       version              AttCertVersion -- version is v2,
129     *       holder               Holder,
130     *       issuer               AttCertIssuer,
131     *       signature            AlgorithmIdentifier,
132     *       serialNumber         CertificateSerialNumber,
133     *       attrCertValidityPeriod   AttCertValidityPeriod,
134     *       attributes           SEQUENCE OF Attribute,
135     *       issuerUniqueID       UniqueIdentifier OPTIONAL,
136     *       extensions           Extensions OPTIONAL
137     *  }
138     *
139     *  AttCertVersion ::= INTEGER { v2(1) }
140     * </pre>
141     */
142    public ASN1Primitive toASN1Primitive()
143    {
144        ASN1EncodableVector  v = new ASN1EncodableVector();
145
146        v.add(version);
147        v.add(holder);
148        v.add(issuer);
149        v.add(signature);
150        v.add(serialNumber);
151        v.add(attrCertValidityPeriod);
152        v.add(attributes);
153
154        if (issuerUniqueID != null)
155        {
156            v.add(issuerUniqueID);
157        }
158
159        if (extensions != null)
160        {
161            v.add(extensions);
162        }
163
164        return new DERSequence(v);
165    }
166}
167