2002/03/21 01:19:32
[org.ibex.core.git] / src / org / bouncycastle / asn1 / DERConstructedSequence.java
diff --git a/src/org/bouncycastle/asn1/DERConstructedSequence.java b/src/org/bouncycastle/asn1/DERConstructedSequence.java
new file mode 100644 (file)
index 0000000..d600d95
--- /dev/null
@@ -0,0 +1,77 @@
+package org.bouncycastle.asn1;
+
+import java.io.*;
+import java.util.*;
+
+public class DERConstructedSequence
+    extends DERObject
+{
+    private Vector seq = new Vector();
+
+    public DERConstructedSequence()
+    {
+    }
+
+    public void addObject(
+        DEREncodable obj)
+    {
+        seq.addElement(obj);
+    }
+
+    public Enumeration getObjects()
+    {
+        return seq.elements();
+    }
+
+    /**
+     * return the object at the sequence postion indicated by index.
+     *
+     * @param the sequence number (starting at zero) of the object
+     * @return the object at the sequence postion indicated by index.
+     */
+    public Object getObjectAt(
+        int index)
+    {
+        return seq.elementAt(index);
+    }
+
+    /**
+     * return the number of objects in this sequence.
+     *
+     * @return the number of objects in this sequence.
+     */
+    public int getSize()
+    {
+        return seq.size();
+    }
+
+    /*
+     * A note on the implementation:
+     * <p>
+     * As DER requires the constructed, definite-length model to
+     * be used for structured types, this varies slightly from the
+     * ASN.1 descriptions given. Rather than just outputing SEQUENCE,
+     * we also have to specify CONSTRUCTED, and the objects length.
+     */
+    void encode(
+        DEROutputStream out)
+        throws IOException
+    {
+        ByteArrayOutputStream   bOut = new ByteArrayOutputStream();
+        DEROutputStream         dOut = new DEROutputStream(bOut);
+        Enumeration             e = getObjects();
+
+        while (e.hasMoreElements())
+        {
+            Object    obj = e.nextElement();
+
+            dOut.writeObject(obj);
+        }
+
+        dOut.close();
+
+        byte[]  bytes = bOut.toByteArray();
+
+        out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes);
+    }
+}