1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1Sequence;
6import org.bouncycastle.asn1.ASN1TaggedObject;
7import org.bouncycastle.asn1.DERBitString;
8import org.bouncycastle.asn1.DERInteger;
9import org.bouncycastle.asn1.DERObject;
10import org.bouncycastle.asn1.DERSequence;
11
12public class AttributeCertificateInfo
13    extends ASN1Encodable
14{
15    private DERInteger              version;
16    private Holder                  holder;
17    private AttCertIssuer           issuer;
18    private AlgorithmIdentifier     signature;
19    private DERInteger              serialNumber;
20    private AttCertValidityPeriod   attrCertValidityPeriod;
21    private ASN1Sequence            attributes;
22    private DERBitString            issuerUniqueID;
23    private X509Extensions          extensions;
24
25    public static AttributeCertificateInfo getInstance(
26        ASN1TaggedObject obj,
27        boolean          explicit)
28    {
29        return getInstance(ASN1Sequence.getInstance(obj, explicit));
30    }
31
32    public static AttributeCertificateInfo getInstance(
33        Object  obj)
34    {
35        if (obj instanceof AttributeCertificateInfo)
36        {
37            return (AttributeCertificateInfo)obj;
38        }
39        else if (obj instanceof ASN1Sequence)
40        {
41            return new AttributeCertificateInfo((ASN1Sequence)obj);
42        }
43
44        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
45    }
46
47    public AttributeCertificateInfo(
48        ASN1Sequence   seq)
49    {
50        if (seq.size() < 7 || seq.size() > 9)
51        {
52            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
53        }
54
55        this.version = DERInteger.getInstance(seq.getObjectAt(0));
56        this.holder = Holder.getInstance(seq.getObjectAt(1));
57        this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(2));
58        this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(3));
59        this.serialNumber = DERInteger.getInstance(seq.getObjectAt(4));
60        this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(5));
61        this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(6));
62
63        for (int i = 7; i < seq.size(); i++)
64        {
65            ASN1Encodable    obj = (ASN1Encodable)seq.getObjectAt(i);
66
67            if (obj instanceof DERBitString)
68            {
69                this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i));
70            }
71            else if (obj instanceof ASN1Sequence || obj instanceof X509Extensions)
72            {
73                this.extensions = X509Extensions.getInstance(seq.getObjectAt(i));
74            }
75        }
76    }
77
78    public DERInteger getVersion()
79    {
80        return version;
81    }
82
83    public Holder getHolder()
84    {
85        return holder;
86    }
87
88    public AttCertIssuer getIssuer()
89    {
90        return issuer;
91    }
92
93    public AlgorithmIdentifier getSignature()
94    {
95        return signature;
96    }
97
98    public DERInteger getSerialNumber()
99    {
100        return serialNumber;
101    }
102
103    public AttCertValidityPeriod getAttrCertValidityPeriod()
104    {
105        return attrCertValidityPeriod;
106    }
107
108    public ASN1Sequence getAttributes()
109    {
110        return attributes;
111    }
112
113    public DERBitString getIssuerUniqueID()
114    {
115        return issuerUniqueID;
116    }
117
118    public X509Extensions getExtensions()
119    {
120        return extensions;
121    }
122
123    /**
124     * Produce an object suitable for an ASN1OutputStream.
125     * <pre>
126     *  AttributeCertificateInfo ::= SEQUENCE {
127     *       version              AttCertVersion -- version is v2,
128     *       holder               Holder,
129     *       issuer               AttCertIssuer,
130     *       signature            AlgorithmIdentifier,
131     *       serialNumber         CertificateSerialNumber,
132     *       attrCertValidityPeriod   AttCertValidityPeriod,
133     *       attributes           SEQUENCE OF Attribute,
134     *       issuerUniqueID       UniqueIdentifier OPTIONAL,
135     *       extensions           Extensions OPTIONAL
136     *  }
137     *
138     *  AttCertVersion ::= INTEGER { v2(1) }
139     * </pre>
140     */
141    public DERObject toASN1Object()
142    {
143        ASN1EncodableVector  v = new ASN1EncodableVector();
144
145        v.add(version);
146        v.add(holder);
147        v.add(issuer);
148        v.add(signature);
149        v.add(serialNumber);
150        v.add(attrCertValidityPeriod);
151        v.add(attributes);
152
153        if (issuerUniqueID != null)
154        {
155            v.add(issuerUniqueID);
156        }
157
158        if (extensions != null)
159        {
160            v.add(extensions);
161        }
162
163        return new DERSequence(v);
164    }
165}
166