2003/02/12 06:21:04
[org.ibex.core.git] / src / org / bouncycastle / asn1 / x509 / X509Extensions.java
index 7fb75f6..6528529 100644 (file)
@@ -103,9 +103,41 @@ public class X509Extensions
      */
     public static final DERObjectIdentifier PolicyConstraints = new DERObjectIdentifier("2.5.29.36");
 
+    /**
+     * Extended Key Usage 
+     */
+    public static final DERObjectIdentifier ExtendedKeyUsage = new DERObjectIdentifier("2.5.29.37");
+
     private Hashtable               extensions = new Hashtable();
     private Vector                  ordering = new Vector();
-    private DERConstructedSequence  seq;
+
+    public static X509Extensions getInstance(
+        ASN1TaggedObject obj,
+        boolean          explicit)
+    {
+        return getInstance(ASN1Sequence.getInstance(obj, explicit));
+    }
+
+    public static X509Extensions getInstance(
+        Object  obj)
+    {
+        if (obj == null || obj instanceof X509Extensions)
+        {
+            return (X509Extensions)obj;
+        }
+
+        if (obj instanceof ASN1Sequence)
+        {
+            return new X509Extensions((ASN1Sequence)obj);
+        }
+
+        if (obj instanceof ASN1TaggedObject)
+        {
+            return getInstance(((ASN1TaggedObject)obj).getObject());
+        }
+
+        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+    }
 
     /**
      * Constructor from DERConstructedSequence.
@@ -113,18 +145,16 @@ public class X509Extensions
      * the extensions are a list of constructed sequences, either with (OID, OctetString) or (OID, Boolean, OctetString)
      */
     public X509Extensions(
-        DERConstructedSequence  seq)
+        ASN1Sequence  seq)
     {
-        this.seq = seq; 
-
         Enumeration e = seq.getObjects();
 
         while (e.hasMoreElements())
         {
-            DERConstructedSequence  s = (DERConstructedSequence)e.nextElement();
+            ASN1Sequence            s = (ASN1Sequence)e.nextElement();
             Enumeration             e1 = s.getObjects();
 
-            if (s.getSize() == 3)
+            if (s.size() == 3)
             {
                 extensions.put(s.getObjectAt(0), new X509Extension((DERBoolean)s.getObjectAt(1), (DEROctetString)s.getObjectAt(2)));
             }
@@ -157,38 +187,30 @@ public class X509Extensions
         Vector      ordering,
         Hashtable   extensions)
     {
-        this.seq = new DERConstructedSequence(); 
+        Enumeration e;
 
         if (ordering == null)
         {
-            Enumeration e = extensions.keys();
-
-            ordering = this.ordering;
+            e = extensions.keys();
+        }
+        else
+        {
+            e = ordering.elements();
+        }
 
-            while (e.hasMoreElements())
-            {
-                this.ordering.addElement(e.nextElement()); 
-            }
+        while (e.hasMoreElements())
+        {
+            this.ordering.addElement(e.nextElement()); 
         }
 
-        Enumeration     e = ordering.elements();
+        e = this.ordering.elements();
 
         while (e.hasMoreElements())
         {
             DERObjectIdentifier     oid = (DERObjectIdentifier)e.nextElement();
             X509Extension           ext = (X509Extension)extensions.get(oid);
-            DERConstructedSequence  s = new DERConstructedSequence();
-
-            s.addObject(oid);
-
-            if (ext.isCritical())
-            {
-                s.addObject(new DERBoolean(true));
-            }
-
-            s.addObject(ext.getValue());
 
-            seq.addObject(s);
+            this.extensions.put(oid, ext);
         }
     }
 
@@ -214,7 +236,28 @@ public class X509Extensions
 
     public DERObject getDERObject()
     {
-        return seq;
+        DEREncodableVector      vec = new DEREncodableVector();
+        Enumeration             e = ordering.elements();
+
+        while (e.hasMoreElements())
+        {
+            DERObjectIdentifier     oid = (DERObjectIdentifier)e.nextElement();
+            X509Extension           ext = (X509Extension)extensions.get(oid);
+            DEREncodableVector      v = new DEREncodableVector();
+
+            v.add(oid);
+
+            if (ext.isCritical())
+            {
+                v.add(new DERBoolean(true));
+            }
+
+            v.add(ext.getValue());
+
+            vec.add(new DERSequence(v));
+        }
+
+        return new DERSequence(vec);
     }
 
     public int hashCode()