001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.geronimo.util.asn1.pkcs;
020
021 import org.apache.geronimo.util.asn1.ASN1Encodable;
022 import org.apache.geronimo.util.asn1.ASN1EncodableVector;
023 import org.apache.geronimo.util.asn1.ASN1Sequence;
024 import org.apache.geronimo.util.asn1.ASN1Set;
025 import org.apache.geronimo.util.asn1.DERInteger;
026 import org.apache.geronimo.util.asn1.DERObject;
027 import org.apache.geronimo.util.asn1.DERSequence;
028 import org.apache.geronimo.util.asn1.DERTaggedObject;
029 import org.apache.geronimo.util.asn1.x509.SubjectPublicKeyInfo;
030 import org.apache.geronimo.util.asn1.x509.X509Name;
031
032 /**
033 * PKCS10 CertificationRequestInfo object.
034 * <pre>
035 * CertificationRequestInfo ::= SEQUENCE {
036 * version INTEGER { v1(0) } (v1,...),
037 * subject Name,
038 * subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
039 * attributes [0] Attributes{{ CRIAttributes }}
040 * }
041 *
042 * Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}
043 *
044 * Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {
045 * type ATTRIBUTE.&id({IOSet}),
046 * values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
047 * }
048 * </pre>
049 */
050 public class CertificationRequestInfo
051 extends ASN1Encodable
052 {
053 DERInteger version = new DERInteger(0);
054 X509Name subject;
055 SubjectPublicKeyInfo subjectPKInfo;
056 ASN1Set attributes = null;
057
058 public static CertificationRequestInfo getInstance(
059 Object obj)
060 {
061 if (obj instanceof CertificationRequestInfo)
062 {
063 return (CertificationRequestInfo)obj;
064 }
065 else if (obj instanceof ASN1Sequence)
066 {
067 return new CertificationRequestInfo((ASN1Sequence)obj);
068 }
069
070 throw new IllegalArgumentException("unknown object in factory");
071 }
072
073 public CertificationRequestInfo(
074 X509Name subject,
075 SubjectPublicKeyInfo pkInfo,
076 ASN1Set attributes)
077 {
078 this.subject = subject;
079 this.subjectPKInfo = pkInfo;
080 this.attributes = attributes;
081
082 if ((subject == null) || (version == null) || (subjectPKInfo == null))
083 {
084 throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator.");
085 }
086 }
087
088 public CertificationRequestInfo(
089 ASN1Sequence seq)
090 {
091 version = (DERInteger)seq.getObjectAt(0);
092
093 subject = X509Name.getInstance(seq.getObjectAt(1));
094 subjectPKInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(2));
095
096 //
097 // some CertificationRequestInfo objects seem to treat this field
098 // as optional.
099 //
100 if (seq.size() > 3)
101 {
102 DERTaggedObject tagobj = (DERTaggedObject)seq.getObjectAt(3);
103 attributes = ASN1Set.getInstance(tagobj, false);
104 }
105
106 if ((subject == null) || (version == null) || (subjectPKInfo == null))
107 {
108 throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator.");
109 }
110 }
111
112 public DERInteger getVersion()
113 {
114 return version;
115 }
116
117 public X509Name getSubject()
118 {
119 return subject;
120 }
121
122 public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
123 {
124 return subjectPKInfo;
125 }
126
127 public ASN1Set getAttributes()
128 {
129 return attributes;
130 }
131
132 public DERObject toASN1Object()
133 {
134 ASN1EncodableVector v = new ASN1EncodableVector();
135
136 v.add(version);
137 v.add(subject);
138 v.add(subjectPKInfo);
139
140 if (attributes != null)
141 {
142 v.add(new DERTaggedObject(false, 0, attributes));
143 }
144
145 return new DERSequence(v);
146 }
147 }