Class DLGenerator

java.lang.Object
org.bouncycastle.asn1.ASN1Generator
org.bouncycastle.asn1.DLGenerator
Direct Known Subclasses:
DLOctetStringGenerator, DLSequenceGenerator

public abstract class DLGenerator extends ASN1Generator
Base class for stream generators for definite-length structures. Unlike the BER generators, which stream indefinite-length encodings, these write a definite-length header up front from a caller-supplied body length and so can stream DL (and, with suitably canonical contents, DER) encodings of structures too large to hold in memory — body lengths are long, so content larger than a Java array can carry is supported.

The body length passed to a generator is a commitment: the matching number of content octets must subsequently be written. Subclasses verify this on close() and fail with an IOException on a mismatch, since a wrongly-sized body silently corrupts every enclosing length.

  • Field Summary

    Fields inherited from class ASN1Generator

    _out
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
     
    protected
    DLGenerator(OutputStream out, int tagNo, boolean isExplicit)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static long
    getDLEncodingLength(long bodyLength)
    Return the total encoded length of a TLV with a single identifier octet (i.e. a tag number below 31) and bodyLength content octets.
    static int
    getLengthOctetCount(long bodyLength)
    Return the number of octets in the definite-length encoding of bodyLength (the length octets only, excluding the identifier).
    Return the actual stream object encodings are written to.
    protected void
    writeDLHeader(int tag, long bodyLength)
    Write the definite-length header(s) for this generator's structure: the base tag with bodyLength, preceded (for an explicit tag) by a context-specific wrapper whose length covers the complete base TLV.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • DLGenerator

      protected DLGenerator(OutputStream out)
    • DLGenerator

      protected DLGenerator(OutputStream out, int tagNo, boolean isExplicit)
  • Method Details

    • getRawOutputStream

      public OutputStream getRawOutputStream()
      Description copied from class: ASN1Generator
      Return the actual stream object encodings are written to.
      Specified by:
      getRawOutputStream in class ASN1Generator
      Returns:
      the stream that is directly encoded to.
    • getLengthOctetCount

      public static int getLengthOctetCount(long bodyLength)
      Return the number of octets in the definite-length encoding of bodyLength (the length octets only, excluding the identifier).
      Parameters:
      bodyLength - number of content octets (>= 0)
      Returns:
      1 for the short form, 1 + number of length octets for the long form
    • getDLEncodingLength

      public static long getDLEncodingLength(long bodyLength)
      Return the total encoded length of a TLV with a single identifier octet (i.e. a tag number below 31) and bodyLength content octets.
      Parameters:
      bodyLength - number of content octets (>= 0)
    • writeDLHeader

      protected void writeDLHeader(int tag, long bodyLength) throws IOException
      Write the definite-length header(s) for this generator's structure: the base tag with bodyLength, preceded (for an explicit tag) by a context-specific wrapper whose length covers the complete base TLV. Tag numbers of 31 and above are supported for the context-specific wrapper of an implicitly tagged structure, but not for an explicit one (the wrapper length arithmetic assumes a single identifier octet).
      Throws:
      IOException