001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.crypto.asn1.x509;
019
020 import org.apache.geronimo.crypto.asn1.ASN1Encodable;
021 import org.apache.geronimo.crypto.asn1.ASN1Sequence;
022 import org.apache.geronimo.crypto.asn1.ASN1TaggedObject;
023 import org.apache.geronimo.crypto.asn1.DERBitString;
024 import org.apache.geronimo.crypto.asn1.DERInteger;
025 import org.apache.geronimo.crypto.asn1.DERObject;
026 import org.apache.geronimo.crypto.asn1.DERTaggedObject;
027 import org.apache.geronimo.crypto.asn1.pkcs.PKCSObjectIdentifiers;
028
029 /**
030 * The TBSCertificate object.
031 * <pre>
032 * TBSCertificate ::= SEQUENCE {
033 * version [ 0 ] Version DEFAULT v1(0),
034 * serialNumber CertificateSerialNumber,
035 * signature AlgorithmIdentifier,
036 * issuer Name,
037 * validity Validity,
038 * subject Name,
039 * subjectPublicKeyInfo SubjectPublicKeyInfo,
040 * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
041 * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
042 * extensions [ 3 ] Extensions OPTIONAL
043 * }
044 * </pre>
045 * <p>
046 * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class
047 * will parse them, but you really shouldn't be creating new ones.
048 */
049 public class TBSCertificateStructure
050 extends ASN1Encodable
051 implements X509ObjectIdentifiers, PKCSObjectIdentifiers
052 {
053 ASN1Sequence seq;
054
055 DERInteger version;
056 DERInteger serialNumber;
057 AlgorithmIdentifier signature;
058 X509Name issuer;
059 Time startDate, endDate;
060 X509Name subject;
061 SubjectPublicKeyInfo subjectPublicKeyInfo;
062 DERBitString issuerUniqueId;
063 DERBitString subjectUniqueId;
064 X509Extensions extensions;
065
066 public static TBSCertificateStructure getInstance(
067 ASN1TaggedObject obj,
068 boolean explicit)
069 {
070 return getInstance(ASN1Sequence.getInstance(obj, explicit));
071 }
072
073 public static TBSCertificateStructure getInstance(
074 Object obj)
075 {
076 if (obj instanceof TBSCertificateStructure)
077 {
078 return (TBSCertificateStructure)obj;
079 }
080 else if (obj instanceof ASN1Sequence)
081 {
082 return new TBSCertificateStructure((ASN1Sequence)obj);
083 }
084
085 throw new IllegalArgumentException("unknown object in factory");
086 }
087
088 public TBSCertificateStructure(
089 ASN1Sequence seq)
090 {
091 int seqStart = 0;
092
093 this.seq = seq;
094
095 //
096 // some certficates don't include a version number - we assume v1
097 //
098 if (seq.getObjectAt(0) instanceof DERTaggedObject)
099 {
100 version = DERInteger.getInstance(seq.getObjectAt(0));
101 }
102 else
103 {
104 seqStart = -1; // field 0 is missing!
105 version = new DERInteger(0);
106 }
107
108 serialNumber = DERInteger.getInstance(seq.getObjectAt(seqStart + 1));
109
110 signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2));
111 issuer = X509Name.getInstance(seq.getObjectAt(seqStart + 3));
112
113 //
114 // before and after dates
115 //
116 ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4);
117
118 startDate = Time.getInstance(dates.getObjectAt(0));
119 endDate = Time.getInstance(dates.getObjectAt(1));
120
121 subject = X509Name.getInstance(seq.getObjectAt(seqStart + 5));
122
123 //
124 // public key info.
125 //
126 subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6));
127
128 for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--)
129 {
130 DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras);
131
132 switch (extra.getTagNo())
133 {
134 case 1:
135 issuerUniqueId = DERBitString.getInstance(extra, false);
136 break;
137 case 2:
138 subjectUniqueId = DERBitString.getInstance(extra, false);
139 break;
140 case 3:
141 extensions = X509Extensions.getInstance(extra);
142 }
143 }
144 }
145
146 public int getVersion()
147 {
148 return version.getValue().intValue() + 1;
149 }
150
151 public DERInteger getVersionNumber()
152 {
153 return version;
154 }
155
156 public DERInteger getSerialNumber()
157 {
158 return serialNumber;
159 }
160
161 public AlgorithmIdentifier getSignature()
162 {
163 return signature;
164 }
165
166 public X509Name getIssuer()
167 {
168 return issuer;
169 }
170
171 public Time getStartDate()
172 {
173 return startDate;
174 }
175
176 public Time getEndDate()
177 {
178 return endDate;
179 }
180
181 public X509Name getSubject()
182 {
183 return subject;
184 }
185
186 public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
187 {
188 return subjectPublicKeyInfo;
189 }
190
191 public DERBitString getIssuerUniqueId()
192 {
193 return issuerUniqueId;
194 }
195
196 public DERBitString getSubjectUniqueId()
197 {
198 return subjectUniqueId;
199 }
200
201 public X509Extensions getExtensions()
202 {
203 return extensions;
204 }
205
206 public DERObject toASN1Object()
207 {
208 return seq;
209 }
210 }