CertificationRequestInfo.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.asn1.pkcs;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1Integer;
5import org.bouncycastle.asn1.ASN1Object;
6import org.bouncycastle.asn1.ASN1Primitive;
7import org.bouncycastle.asn1.ASN1Sequence;
8import org.bouncycastle.asn1.ASN1Set;
9import org.bouncycastle.asn1.DERSequence;
10import org.bouncycastle.asn1.DERTaggedObject;
11import org.bouncycastle.asn1.x500.X500Name;
12import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
13import org.bouncycastle.asn1.x509.X509Name;
14
15/**
16 * PKCS10 CertificationRequestInfo object.
17 * <pre>
18 *  CertificationRequestInfo ::= SEQUENCE {
19 *   version             INTEGER { v1(0) } (v1,...),
20 *   subject             Name,
21 *   subjectPKInfo   SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
22 *   attributes          [0] Attributes{{ CRIAttributes }}
23 *  }
24 *
25 *  Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}
26 *
27 *  Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {
28 *    type    ATTRIBUTE.&id({IOSet}),
29 *    values  SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
30 *  }
31 * </pre>
32 */
33public class CertificationRequestInfo
34    extends ASN1Object
35{
36    ASN1Integer              version = new ASN1Integer(0);
37    X500Name                subject;
38    SubjectPublicKeyInfo    subjectPKInfo;
39    ASN1Set                 attributes = null;
40
41    public static CertificationRequestInfo getInstance(
42        Object  obj)
43    {
44        if (obj instanceof CertificationRequestInfo)
45        {
46            return (CertificationRequestInfo)obj;
47        }
48        else if (obj != null)
49        {
50            return new CertificationRequestInfo(ASN1Sequence.getInstance(obj));
51        }
52
53        return null;
54    }
55
56    public CertificationRequestInfo(
57        X500Name subject,
58        SubjectPublicKeyInfo    pkInfo,
59        ASN1Set                 attributes)
60    {
61        this.subject = subject;
62        this.subjectPKInfo = pkInfo;
63        this.attributes = attributes;
64
65        if ((subject == null) || (version == null) || (subjectPKInfo == null))
66        {
67            throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator.");
68        }
69    }
70
71    /**
72     * @deprecated use X500Name method.
73     */
74    public CertificationRequestInfo(
75        X509Name                subject,
76        SubjectPublicKeyInfo    pkInfo,
77        ASN1Set                 attributes)
78    {
79        this.subject = X500Name.getInstance(subject.toASN1Primitive());
80        this.subjectPKInfo = pkInfo;
81        this.attributes = attributes;
82
83        if ((subject == null) || (version == null) || (subjectPKInfo == null))
84        {
85            throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator.");
86        }
87    }
88
89    public CertificationRequestInfo(
90        ASN1Sequence  seq)
91    {
92        version = (ASN1Integer)seq.getObjectAt(0);
93
94        subject = X500Name.getInstance(seq.getObjectAt(1));
95        subjectPKInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(2));
96
97        //
98        // some CertificationRequestInfo objects seem to treat this field
99        // as optional.
100        //
101        if (seq.size() > 3)
102        {
103            DERTaggedObject tagobj = (DERTaggedObject)seq.getObjectAt(3);
104            attributes = ASN1Set.getInstance(tagobj, false);
105        }
106
107        if ((subject == null) || (version == null) || (subjectPKInfo == null))
108        {
109            throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator.");
110        }
111    }
112
113    public ASN1Integer getVersion()
114    {
115        return version;
116    }
117
118    public X500Name getSubject()
119    {
120        return subject;
121    }
122
123    public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
124    {
125        return subjectPKInfo;
126    }
127
128    public ASN1Set getAttributes()
129    {
130        return attributes;
131    }
132
133    public ASN1Primitive toASN1Primitive()
134    {
135        ASN1EncodableVector  v = new ASN1EncodableVector();
136
137        v.add(version);
138        v.add(subject);
139        v.add(subjectPKInfo);
140
141        if (attributes != null)
142        {
143            v.add(new DERTaggedObject(false, 0, attributes));
144        }
145
146        return new DERSequence(v);
147    }
148}
149