package org.bouncycastle.asn1;

import java.io.IOException;
import java.util.Enumeration;

The DLSequence encodes a SEQUENCE using definite length form.
/** * The DLSequence encodes a SEQUENCE using definite length form. */
public class DLSequence extends ASN1Sequence { private int bodyLength = -1;
Create an empty sequence
/** * Create an empty sequence */
public DLSequence() { }
create a sequence containing one object
Params:
  • obj – the object to go in the sequence.
/** * create a sequence containing one object * @param obj the object to go in the sequence. */
public DLSequence( ASN1Encodable obj) { super(obj); }
create a sequence containing a vector of objects.
Params:
  • v – the vector of objects to make up the sequence.
/** * create a sequence containing a vector of objects. * @param v the vector of objects to make up the sequence. */
public DLSequence( ASN1EncodableVector v) { super(v); }
create a sequence containing an array of objects.
Params:
  • array – the array of objects to make up the sequence.
/** * create a sequence containing an array of objects. * @param array the array of objects to make up the sequence. */
public DLSequence( ASN1Encodable[] array) { super(array); } private int getBodyLength() throws IOException { if (bodyLength < 0) { int length = 0; for (Enumeration e = this.getObjects(); e.hasMoreElements();) { Object obj = e.nextElement(); length += ((ASN1Encodable)obj).toASN1Primitive().toDLObject().encodedLength(); } bodyLength = length; } return bodyLength; } int encodedLength() throws IOException { int length = getBodyLength(); return 1 + StreamUtil.calculateBodyLength(length) + length; }
A note on the implementation:

As DL requires the constructed, definite-length model to be used for structured types, this varies slightly from the ASN.1 descriptions given. Rather than just outputting SEQUENCE, we also have to specify CONSTRUCTED, and the objects length.

/** * A note on the implementation: * <p> * As DL requires the constructed, definite-length model to * be used for structured types, this varies slightly from the * ASN.1 descriptions given. Rather than just outputting SEQUENCE, * we also have to specify CONSTRUCTED, and the objects length. */
void encode( ASN1OutputStream out) throws IOException { ASN1OutputStream dOut = out.getDLSubStream(); int length = getBodyLength(); out.write(BERTags.SEQUENCE | BERTags.CONSTRUCTED); out.writeLength(length); for (Enumeration e = this.getObjects(); e.hasMoreElements();) { Object obj = e.nextElement(); dOut.writeObject((ASN1Encodable)obj); } } }