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.x509; 020 021 import org.apache.geronimo.util.asn1.ASN1Encodable; 022 import org.apache.geronimo.util.asn1.ASN1Sequence; 023 import org.apache.geronimo.util.asn1.ASN1TaggedObject; 024 import org.apache.geronimo.util.asn1.DERBitString; 025 import org.apache.geronimo.util.asn1.DERInteger; 026 import org.apache.geronimo.util.asn1.DERObject; 027 import org.apache.geronimo.util.asn1.DERTaggedObject; 028 import org.apache.geronimo.util.asn1.pkcs.PKCSObjectIdentifiers; 029 030 /** 031 * The TBSCertificate object. 032 * <pre> 033 * TBSCertificate ::= SEQUENCE { 034 * version [ 0 ] Version DEFAULT v1(0), 035 * serialNumber CertificateSerialNumber, 036 * signature AlgorithmIdentifier, 037 * issuer Name, 038 * validity Validity, 039 * subject Name, 040 * subjectPublicKeyInfo SubjectPublicKeyInfo, 041 * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL, 042 * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL, 043 * extensions [ 3 ] Extensions OPTIONAL 044 * } 045 * </pre> 046 * <p> 047 * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class 048 * will parse them, but you really shouldn't be creating new ones. 049 */ 050 public class TBSCertificateStructure 051 extends ASN1Encodable 052 implements X509ObjectIdentifiers, PKCSObjectIdentifiers 053 { 054 ASN1Sequence seq; 055 056 DERInteger version; 057 DERInteger serialNumber; 058 AlgorithmIdentifier signature; 059 X509Name issuer; 060 Time startDate, endDate; 061 X509Name subject; 062 SubjectPublicKeyInfo subjectPublicKeyInfo; 063 DERBitString issuerUniqueId; 064 DERBitString subjectUniqueId; 065 X509Extensions extensions; 066 067 public static TBSCertificateStructure getInstance( 068 ASN1TaggedObject obj, 069 boolean explicit) 070 { 071 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 072 } 073 074 public static TBSCertificateStructure getInstance( 075 Object obj) 076 { 077 if (obj instanceof TBSCertificateStructure) 078 { 079 return (TBSCertificateStructure)obj; 080 } 081 else if (obj instanceof ASN1Sequence) 082 { 083 return new TBSCertificateStructure((ASN1Sequence)obj); 084 } 085 086 throw new IllegalArgumentException("unknown object in factory"); 087 } 088 089 public TBSCertificateStructure( 090 ASN1Sequence seq) 091 { 092 int seqStart = 0; 093 094 this.seq = seq; 095 096 // 097 // some certficates don't include a version number - we assume v1 098 // 099 if (seq.getObjectAt(0) instanceof DERTaggedObject) 100 { 101 version = DERInteger.getInstance(seq.getObjectAt(0)); 102 } 103 else 104 { 105 seqStart = -1; // field 0 is missing! 106 version = new DERInteger(0); 107 } 108 109 serialNumber = DERInteger.getInstance(seq.getObjectAt(seqStart + 1)); 110 111 signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2)); 112 issuer = X509Name.getInstance(seq.getObjectAt(seqStart + 3)); 113 114 // 115 // before and after dates 116 // 117 ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4); 118 119 startDate = Time.getInstance(dates.getObjectAt(0)); 120 endDate = Time.getInstance(dates.getObjectAt(1)); 121 122 subject = X509Name.getInstance(seq.getObjectAt(seqStart + 5)); 123 124 // 125 // public key info. 126 // 127 subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6)); 128 129 for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--) 130 { 131 DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras); 132 133 switch (extra.getTagNo()) 134 { 135 case 1: 136 issuerUniqueId = DERBitString.getInstance(extra, false); 137 break; 138 case 2: 139 subjectUniqueId = DERBitString.getInstance(extra, false); 140 break; 141 case 3: 142 extensions = X509Extensions.getInstance(extra); 143 } 144 } 145 } 146 147 public int getVersion() 148 { 149 return version.getValue().intValue() + 1; 150 } 151 152 public DERInteger getVersionNumber() 153 { 154 return version; 155 } 156 157 public DERInteger getSerialNumber() 158 { 159 return serialNumber; 160 } 161 162 public AlgorithmIdentifier getSignature() 163 { 164 return signature; 165 } 166 167 public X509Name getIssuer() 168 { 169 return issuer; 170 } 171 172 public Time getStartDate() 173 { 174 return startDate; 175 } 176 177 public Time getEndDate() 178 { 179 return endDate; 180 } 181 182 public X509Name getSubject() 183 { 184 return subject; 185 } 186 187 public SubjectPublicKeyInfo getSubjectPublicKeyInfo() 188 { 189 return subjectPublicKeyInfo; 190 } 191 192 public DERBitString getIssuerUniqueId() 193 { 194 return issuerUniqueId; 195 } 196 197 public DERBitString getSubjectUniqueId() 198 { 199 return subjectUniqueId; 200 } 201 202 public X509Extensions getExtensions() 203 { 204 return extensions; 205 } 206 207 public DERObject toASN1Object() 208 { 209 return seq; 210 } 211 }