Class 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.

    • Constructor Summary

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

      All Methods Static Methods Instance Methods Concrete Methods 
      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).
      java.io.OutputStream getRawOutputStream()
      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 java.lang.Object

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

      • DLGenerator

        protected DLGenerator​(java.io.OutputStream out)
      • DLGenerator

        protected DLGenerator​(java.io.OutputStream out,
                              int tagNo,
                              boolean isExplicit)
    • Method Detail

      • getRawOutputStream

        public java.io.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 java.io.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:
        java.io.IOException