1 package org.bouncycastle.asn1.x509; 2 3 import java.util.Enumeration; 4 import java.util.Hashtable; 5 import java.util.Vector; 6 7 import org.bouncycastle.asn1.ASN1Boolean; 8 import org.bouncycastle.asn1.ASN1EncodableVector; 9 import org.bouncycastle.asn1.ASN1Object; 10 import org.bouncycastle.asn1.ASN1ObjectIdentifier; 11 import org.bouncycastle.asn1.ASN1OctetString; 12 import org.bouncycastle.asn1.ASN1Primitive; 13 import org.bouncycastle.asn1.ASN1Sequence; 14 import org.bouncycastle.asn1.ASN1TaggedObject; 15 import org.bouncycastle.asn1.DERSequence; 16 17 /** 18 * @deprecated use Extensions 19 */ 20 public class X509Extensions 21 extends ASN1Object 22 { 23 /** 24 * Subject Directory Attributes 25 * @deprecated use X509Extension value. 26 */ 27 public static final ASN1ObjectIdentifier SubjectDirectoryAttributes = new ASN1ObjectIdentifier("2.5.29.9"); 28 29 /** 30 * Subject Key Identifier 31 * @deprecated use X509Extension value. 32 */ 33 public static final ASN1ObjectIdentifier SubjectKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.14"); 34 35 /** 36 * Key Usage 37 * @deprecated use X509Extension value. 38 */ 39 public static final ASN1ObjectIdentifier KeyUsage = new ASN1ObjectIdentifier("2.5.29.15"); 40 41 /** 42 * Private Key Usage Period 43 * @deprecated use X509Extension value. 44 */ 45 public static final ASN1ObjectIdentifier PrivateKeyUsagePeriod = new ASN1ObjectIdentifier("2.5.29.16"); 46 47 /** 48 * Subject Alternative Name 49 * @deprecated use X509Extension value. 50 */ 51 public static final ASN1ObjectIdentifier SubjectAlternativeName = new ASN1ObjectIdentifier("2.5.29.17"); 52 53 /** 54 * Issuer Alternative Name 55 * @deprecated use X509Extension value. 56 */ 57 public static final ASN1ObjectIdentifier IssuerAlternativeName = new ASN1ObjectIdentifier("2.5.29.18"); 58 59 /** 60 * Basic Constraints 61 * @deprecated use X509Extension value. 62 */ 63 public static final ASN1ObjectIdentifier BasicConstraints = new ASN1ObjectIdentifier("2.5.29.19"); 64 65 /** 66 * CRL Number 67 * @deprecated use X509Extension value. 68 */ 69 public static final ASN1ObjectIdentifier CRLNumber = new ASN1ObjectIdentifier("2.5.29.20"); 70 71 /** 72 * Reason code 73 * @deprecated use X509Extension value. 74 */ 75 public static final ASN1ObjectIdentifier ReasonCode = new ASN1ObjectIdentifier("2.5.29.21"); 76 77 /** 78 * Hold Instruction Code 79 * @deprecated use X509Extension value. 80 */ 81 public static final ASN1ObjectIdentifier InstructionCode = new ASN1ObjectIdentifier("2.5.29.23"); 82 83 /** 84 * Invalidity Date 85 * @deprecated use X509Extension value. 86 */ 87 public static final ASN1ObjectIdentifier InvalidityDate = new ASN1ObjectIdentifier("2.5.29.24"); 88 89 /** 90 * Delta CRL indicator 91 * @deprecated use X509Extension value. 92 */ 93 public static final ASN1ObjectIdentifier DeltaCRLIndicator = new ASN1ObjectIdentifier("2.5.29.27"); 94 95 /** 96 * Issuing Distribution Point 97 * @deprecated use X509Extension value. 98 */ 99 public static final ASN1ObjectIdentifier IssuingDistributionPoint = new ASN1ObjectIdentifier("2.5.29.28"); 100 101 /** 102 * Certificate Issuer 103 * @deprecated use X509Extension value. 104 */ 105 public static final ASN1ObjectIdentifier CertificateIssuer = new ASN1ObjectIdentifier("2.5.29.29"); 106 107 /** 108 * Name Constraints 109 * @deprecated use X509Extension value. 110 */ 111 public static final ASN1ObjectIdentifier NameConstraints = new ASN1ObjectIdentifier("2.5.29.30"); 112 113 /** 114 * CRL Distribution Points 115 * @deprecated use X509Extension value. 116 */ 117 public static final ASN1ObjectIdentifier CRLDistributionPoints = new ASN1ObjectIdentifier("2.5.29.31"); 118 119 /** 120 * Certificate Policies 121 * @deprecated use X509Extension value. 122 */ 123 public static final ASN1ObjectIdentifier CertificatePolicies = new ASN1ObjectIdentifier("2.5.29.32"); 124 125 /** 126 * Policy Mappings 127 * @deprecated use X509Extension value. 128 */ 129 public static final ASN1ObjectIdentifier PolicyMappings = new ASN1ObjectIdentifier("2.5.29.33"); 130 131 /** 132 * Authority Key Identifier 133 * @deprecated use X509Extension value. 134 */ 135 public static final ASN1ObjectIdentifier AuthorityKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.35"); 136 137 /** 138 * Policy Constraints 139 * @deprecated use X509Extension value. 140 */ 141 public static final ASN1ObjectIdentifier PolicyConstraints = new ASN1ObjectIdentifier("2.5.29.36"); 142 143 /** 144 * Extended Key Usage 145 * @deprecated use X509Extension value. 146 */ 147 public static final ASN1ObjectIdentifier ExtendedKeyUsage = new ASN1ObjectIdentifier("2.5.29.37"); 148 149 /** 150 * Freshest CRL 151 * @deprecated use X509Extension value. 152 */ 153 public static final ASN1ObjectIdentifier FreshestCRL = new ASN1ObjectIdentifier("2.5.29.46"); 154 155 /** 156 * Inhibit Any Policy 157 * @deprecated use X509Extension value. 158 */ 159 public static final ASN1ObjectIdentifier InhibitAnyPolicy = new ASN1ObjectIdentifier("2.5.29.54"); 160 161 /** 162 * Authority Info Access 163 * @deprecated use X509Extension value. 164 */ 165 public static final ASN1ObjectIdentifier AuthorityInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.1"); 166 167 /** 168 * Subject Info Access 169 * @deprecated use X509Extension value. 170 */ 171 public static final ASN1ObjectIdentifier SubjectInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.11"); 172 173 /** 174 * Logo Type 175 * @deprecated use X509Extension value. 176 */ 177 public static final ASN1ObjectIdentifier LogoType = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.12"); 178 179 /** 180 * BiometricInfo 181 * @deprecated use X509Extension value. 182 */ 183 public static final ASN1ObjectIdentifier BiometricInfo = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.2"); 184 185 /** 186 * QCStatements 187 * @deprecated use X509Extension value. 188 */ 189 public static final ASN1ObjectIdentifier QCStatements = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.3"); 190 191 /** 192 * Audit identity extension in attribute certificates. 193 * @deprecated use X509Extension value. 194 */ 195 public static final ASN1ObjectIdentifier AuditIdentity = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.4"); 196 197 /** 198 * NoRevAvail extension in attribute certificates. 199 * @deprecated use X509Extension value. 200 */ 201 public static final ASN1ObjectIdentifier NoRevAvail = new ASN1ObjectIdentifier("2.5.29.56"); 202 203 /** 204 * TargetInformation extension in attribute certificates. 205 * @deprecated use X509Extension value. 206 */ 207 public static final ASN1ObjectIdentifier TargetInformation = new ASN1ObjectIdentifier("2.5.29.55"); 208 209 private Hashtable extensions = new Hashtable(); 210 private Vector ordering = new Vector(); 211 212 public static X509Extensions getInstance( 213 ASN1TaggedObject obj, 214 boolean explicit) 215 { 216 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 217 } 218 219 public static X509Extensions getInstance( 220 Object obj) 221 { 222 if (obj == null || obj instanceof X509Extensions) 223 { 224 return (X509Extensions)obj; 225 } 226 227 if (obj instanceof ASN1Sequence) 228 { 229 return new X509Extensions((ASN1Sequence)obj); 230 } 231 232 if (obj instanceof Extensions) 233 { 234 return new X509Extensions((ASN1Sequence)((Extensions)obj).toASN1Primitive()); 235 } 236 237 if (obj instanceof ASN1TaggedObject) 238 { 239 return getInstance(((ASN1TaggedObject)obj).getObject()); 240 } 241 242 throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 243 } 244 245 /** 246 * Constructor from ASN1Sequence. 247 * 248 * the extensions are a list of constructed sequences, either with (OID, OctetString) or (OID, Boolean, OctetString) 249 */ 250 public X509Extensions( 251 ASN1Sequence seq) 252 { 253 Enumeration e = seq.getObjects(); 254 255 while (e.hasMoreElements()) 256 { 257 ASN1Sequence s = ASN1Sequence.getInstance(e.nextElement()); 258 259 if (s.size() == 3) 260 { 261 extensions.put(s.getObjectAt(0), new X509Extension(ASN1Boolean.getInstance(s.getObjectAt(1)), ASN1OctetString.getInstance(s.getObjectAt(2)))); 262 } 263 else if (s.size() == 2) 264 { 265 extensions.put(s.getObjectAt(0), new X509Extension(false, ASN1OctetString.getInstance(s.getObjectAt(1)))); 266 } 267 else 268 { 269 throw new IllegalArgumentException("Bad sequence size: " + s.size()); 270 } 271 272 ordering.addElement(s.getObjectAt(0)); 273 } 274 } 275 276 /** 277 * constructor from a table of extensions. 278 * <p> 279 * it's is assumed the table contains OID/String pairs. 280 */ 281 public X509Extensions( 282 Hashtable extensions) 283 { 284 this(null, extensions); 285 } 286 287 /** 288 * Constructor from a table of extensions with ordering. 289 * <p> 290 * It's is assumed the table contains OID/String pairs. 291 * @deprecated use Extensions 292 */ 293 public X509Extensions( 294 Vector ordering, 295 Hashtable extensions) 296 { 297 Enumeration e; 298 299 if (ordering == null) 300 { 301 e = extensions.keys(); 302 } 303 else 304 { 305 e = ordering.elements(); 306 } 307 308 while (e.hasMoreElements()) 309 { 310 this.ordering.addElement(ASN1ObjectIdentifier.getInstance(e.nextElement())); 311 } 312 313 e = this.ordering.elements(); 314 315 while (e.hasMoreElements()) 316 { 317 ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(e.nextElement()); 318 X509Extension ext = (X509Extension)extensions.get(oid); 319 320 this.extensions.put(oid, ext); 321 } 322 } 323 324 /** 325 * Constructor from two vectors 326 * 327 * @param objectIDs a vector of the object identifiers. 328 * @param values a vector of the extension values. 329 * @deprecated use Extensions 330 */ 331 public X509Extensions( 332 Vector objectIDs, 333 Vector values) 334 { 335 Enumeration e = objectIDs.elements(); 336 337 while (e.hasMoreElements()) 338 { 339 this.ordering.addElement(e.nextElement()); 340 } 341 342 int count = 0; 343 344 e = this.ordering.elements(); 345 346 while (e.hasMoreElements()) 347 { 348 ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement(); 349 X509Extension ext = (X509Extension)values.elementAt(count); 350 351 this.extensions.put(oid, ext); 352 count++; 353 } 354 } 355 356 /** 357 * return an Enumeration of the extension field's object ids. 358 */ 359 public Enumeration oids() 360 { 361 return ordering.elements(); 362 } 363 364 /** 365 * return the extension represented by the object identifier 366 * passed in. 367 * 368 * @return the extension if it's present, null otherwise. 369 */ 370 public X509Extension getExtension( 371 ASN1ObjectIdentifier oid) 372 { 373 return (X509Extension)extensions.get(oid); 374 } 375 376 /** 377 * <pre> 378 * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension 379 * 380 * Extension ::= SEQUENCE { 381 * extnId EXTENSION.&id ({ExtensionSet}), 382 * critical BOOLEAN DEFAULT FALSE, 383 * extnValue OCTET STRING } 384 * </pre> 385 */ 386 public ASN1Primitive toASN1Primitive() 387 { 388 ASN1EncodableVector vec = new ASN1EncodableVector(); 389 Enumeration e = ordering.elements(); 390 391 while (e.hasMoreElements()) 392 { 393 ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement(); 394 X509Extension ext = (X509Extension)extensions.get(oid); 395 ASN1EncodableVector v = new ASN1EncodableVector(); 396 397 v.add(oid); 398 399 if (ext.isCritical()) 400 { 401 v.add(ASN1Boolean.TRUE); 402 } 403 404 v.add(ext.getValue()); 405 406 vec.add(new DERSequence(v)); 407 } 408 409 return new DERSequence(vec); 410 } 411 412 public boolean equivalent( 413 X509Extensions other) 414 { 415 if (extensions.size() != other.extensions.size()) 416 { 417 return false; 418 } 419 420 Enumeration e1 = extensions.keys(); 421 422 while (e1.hasMoreElements()) 423 { 424 Object key = e1.nextElement(); 425 426 if (!extensions.get(key).equals(other.extensions.get(key))) 427 { 428 return false; 429 } 430 } 431 432 return true; 433 } 434 435 public ASN1ObjectIdentifier[] getExtensionOIDs() 436 { 437 return toOidArray(ordering); 438 } 439 440 public ASN1ObjectIdentifier[] getNonCriticalExtensionOIDs() 441 { 442 return getExtensionOIDs(false); 443 } 444 445 public ASN1ObjectIdentifier[] getCriticalExtensionOIDs() 446 { 447 return getExtensionOIDs(true); 448 } 449 450 private ASN1ObjectIdentifier[] getExtensionOIDs(boolean isCritical) 451 { 452 Vector oidVec = new Vector(); 453 454 for (int i = 0; i != ordering.size(); i++) 455 { 456 Object oid = ordering.elementAt(i); 457 458 if (((X509Extension)extensions.get(oid)).isCritical() == isCritical) 459 { 460 oidVec.addElement(oid); 461 } 462 } 463 464 return toOidArray(oidVec); 465 } 466 467 private ASN1ObjectIdentifier[] toOidArray(Vector oidVec) 468 { 469 ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[oidVec.size()]; 470 471 for (int i = 0; i != oids.length; i++) 472 { 473 oids[i] = (ASN1ObjectIdentifier)oidVec.elementAt(i); 474 } 475 return oids; 476 } 477 } 478