    001package org.apache.commons.ssl.asn1;
    002
    003import java.io.ByteArrayOutputStream;
    004import java.io.IOException;
    005import java.util.Enumeration;
    006
    007public class DERSequence
    008    extends ASN1Sequence {
    009    /** create an empty sequence */
    010    public DERSequence() {
    011    }
    012
    013    /** create a sequence containing one object */
    014    public DERSequence(
    015        DEREncodable obj) {
    016        this.addObject(obj);
    017    }
    018
    019    /** create a sequence containing a vector of objects. */
    020    public DERSequence(
    021        DEREncodableVector v) {
    022        for (int i = 0; i != v.size(); i++) {
    023            this.addObject(v.get(i));
    024        }
    025    }
    026
    027    /** create a sequence containing an array of objects. */
    028    public DERSequence(
    029        ASN1Encodable[] a) {
    030        for (int i = 0; i != a.length; i++) {
    031            this.addObject(a[i]);
    032        }
    033    }
    034
    035    /*
    036    * A note on the implementation:
    037    * <p>
    038    * As DER requires the constructed, definite-length model to
    039    * be used for structured types, this varies slightly from the
    040    * ASN.1 descriptions given. Rather than just outputing SEQUENCE,
    041    * we also have to specify CONSTRUCTED, and the objects length.
    042    */
    043    void encode(
    044        DEROutputStream out)
    045        throws IOException {
    046        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    047        DEROutputStream dOut = new DEROutputStream(bOut);
    048        Enumeration e = this.getObjects();
    049
    050        while (e.hasMoreElements()) {
    051            Object obj = e.nextElement();
    052
    053            dOut.writeObject(obj);
    054        }
    055
    056        dOut.close();
    057
    058        byte[] bytes = bOut.toByteArray();
    059
    060        out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes);
    061    }
    062}