1 package org.bouncycastle.asn1.x509;
5 import org.bouncycastle.asn1.*;
7 public class X509Extensions
8 implements DEREncodable
11 * Subject Key Identifier
13 public static final DERObjectIdentifier SubjectKeyIdentifier = new DERObjectIdentifier("2.5.29.14");
18 public static final DERObjectIdentifier KeyUsage = new DERObjectIdentifier("2.5.29.15");
21 * Private Key Usage Period
23 public static final DERObjectIdentifier PrivateKeyUsagePeriod = new DERObjectIdentifier("2.5.29.16");
26 * Subject Alternative Name
28 public static final DERObjectIdentifier SubjectAlternativeName = new DERObjectIdentifier("2.5.29.17");
31 * Issuer Alternative Name
33 public static final DERObjectIdentifier IssuerAlternativeName = new DERObjectIdentifier("2.5.29.18");
38 public static final DERObjectIdentifier BasicConstraints = new DERObjectIdentifier("2.5.29.19");
43 public static final DERObjectIdentifier CRLNumber = new DERObjectIdentifier("2.5.29.20");
48 public static final DERObjectIdentifier ReasonCode = new DERObjectIdentifier("2.5.29.21");
51 * Hold Instruction Code
53 public static final DERObjectIdentifier InstructionCode = new DERObjectIdentifier("2.5.29.23");
58 public static final DERObjectIdentifier InvalidityDate = new DERObjectIdentifier("2.5.29.24");
63 public static final DERObjectIdentifier DeltaCRLIndicator = new DERObjectIdentifier("2.5.29.27");
66 * Issuing Distribution Point
68 public static final DERObjectIdentifier IssuingDistributionPoint = new DERObjectIdentifier("2.5.29.28");
73 public static final DERObjectIdentifier CertificateIssuer = new DERObjectIdentifier("2.5.29.29");
78 public static final DERObjectIdentifier NameConstraints = new DERObjectIdentifier("2.5.29.30");
81 * CRL Distribution Points
83 public static final DERObjectIdentifier CRLDistributionPoints = new DERObjectIdentifier("2.5.29.31");
86 * Certificate Policies
88 public static final DERObjectIdentifier CertificatePolicies = new DERObjectIdentifier("2.5.29.32");
93 public static final DERObjectIdentifier PolicyMappings = new DERObjectIdentifier("2.5.29.33");
96 * Authority Key Identifier
98 public static final DERObjectIdentifier AuthorityKeyIdentifier = new DERObjectIdentifier("2.5.29.35");
103 public static final DERObjectIdentifier PolicyConstraints = new DERObjectIdentifier("2.5.29.36");
108 public static final DERObjectIdentifier ExtendedKeyUsage = new DERObjectIdentifier("2.5.29.37");
110 private Hashtable extensions = new Hashtable();
111 private Vector ordering = new Vector();
113 public static X509Extensions getInstance(
114 ASN1TaggedObject obj,
117 return getInstance(ASN1Sequence.getInstance(obj, explicit));
120 public static X509Extensions getInstance(
123 if (obj == null || obj instanceof X509Extensions)
125 return (X509Extensions)obj;
128 if (obj instanceof ASN1Sequence)
130 return new X509Extensions((ASN1Sequence)obj);
133 if (obj instanceof ASN1TaggedObject)
135 return getInstance(((ASN1TaggedObject)obj).getObject());
138 throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
142 * Constructor from DERConstructedSequence.
144 * the extensions are a list of constructed sequences, either with (OID, OctetString) or (OID, Boolean, OctetString)
146 public X509Extensions(
149 Enumeration e = seq.getObjects();
151 while (e.hasMoreElements())
153 ASN1Sequence s = (ASN1Sequence)e.nextElement();
154 Enumeration e1 = s.getObjects();
158 extensions.put(s.getObjectAt(0), new X509Extension((DERBoolean)s.getObjectAt(1), (DEROctetString)s.getObjectAt(2)));
162 extensions.put(s.getObjectAt(0), new X509Extension(false, (DEROctetString)s.getObjectAt(1)));
165 ordering.addElement(s.getObjectAt(0));
170 * constructor from a table of extensions.
172 * it's is assumed the table contains OID/String pairs.
174 public X509Extensions(
175 Hashtable extensions)
177 this(null, extensions);
181 * constructor from a table of extensions with ordering
183 * it's is assumed the table contains OID/String pairs.
185 public X509Extensions(
187 Hashtable extensions)
191 if (ordering == null)
193 e = extensions.keys();
197 e = ordering.elements();
200 while (e.hasMoreElements())
202 this.ordering.addElement(e.nextElement());
205 e = this.ordering.elements();
207 while (e.hasMoreElements())
209 DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement();
210 X509Extension ext = (X509Extension)extensions.get(oid);
212 this.extensions.put(oid, ext);
217 * return an Enumeration of the extension field's object ids.
219 public Enumeration oids()
221 return ordering.elements();
225 * return the extension represented by the object identifier
228 * @return the extension if it's present, null otherwise.
230 public X509Extension getExtension(
231 DERObjectIdentifier oid)
233 return (X509Extension)extensions.get(oid);
236 public DERObject getDERObject()
238 DEREncodableVector vec = new DEREncodableVector();
239 Enumeration e = ordering.elements();
241 while (e.hasMoreElements())
243 DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement();
244 X509Extension ext = (X509Extension)extensions.get(oid);
245 DEREncodableVector v = new DEREncodableVector();
249 if (ext.isCritical())
251 v.add(new DERBoolean(true));
254 v.add(ext.getValue());
256 vec.add(new DERSequence(v));
259 return new DERSequence(vec);
262 public int hashCode()
264 Enumeration e = extensions.keys();
267 while (e.hasMoreElements())
269 Object o = e.nextElement();
271 hashCode ^= o.hashCode();
272 hashCode ^= extensions.get(o).hashCode();
278 public boolean equals(
281 if (o == null || !(o instanceof X509Extensions))
286 X509Extensions other = (X509Extensions)o;
288 Enumeration e1 = extensions.keys();
289 Enumeration e2 = other.extensions.keys();
291 while (e1.hasMoreElements() && e2.hasMoreElements())
293 Object o1 = e1.nextElement();
294 Object o2 = e2.nextElement();
302 if (e1.hasMoreElements() || e2.hasMoreElements())