Class DerOutputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable, DerEncoder

    public class DerOutputStream
    extends java.io.ByteArrayOutputStream
    implements DerEncoder
    Output stream marshaling DER-encoded data. This is eventually provided in the form of a byte array; there is no advance limit on the size of that byte array.

    At this time, this class supports only a subset of the types of DER data encodings which are defined. That subset is sufficient for generating most X.509 certificates.

    Version:
    1.32
    Author:
    David Brownell, Amit Kapoor, Hemma Prafullchandra
    • Field Summary

      • Fields inherited from class java.io.ByteArrayOutputStream

        buf, count
    • Constructor Summary

      Constructors 
      Constructor Description
      DerOutputStream()
      Construct an DER output stream.
      DerOutputStream​(int size)
      Construct an DER output stream.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void derEncode​(java.io.OutputStream out)
      Write the current contents of this DerOutputStream to an OutputStream.
      byte[] getDateBytes​(java.util.Date d, boolean UTC)  
      void putBitString​(byte[] bits)
      Marshals a DER bit string on the output stream.
      void putBMPString​(java.lang.String s)
      Marshals a string which is consists of BMP (unicode) characters
      void putBoolean​(boolean val)
      Marshals a DER boolean on the output stream.
      void putDerValue​(DerValue val)
      Marshals pre-encoded DER value onto the output stream.
      void putEnumerated​(int i)
      Marshals a DER enumerated value on the output stream.
      void putGeneralizedTime​(java.util.Date d)
      Marshals a DER Generalized Time/date value.
      void putGeneralString​(java.lang.String s)  
      void putIA5String​(java.lang.String s)
      Marshals a string which is consists of IA5(ASCII) characters
      void putInteger​(BigInt i)
      Marshals a DER unsigned integer on the output stream.
      void putLength​(int len)
      Put the encoding of the length in the stream.
      void putNull()
      Marshals a DER "null" value on the output stream.
      void putOctetString​(byte[] octets)
      DER-encodes an ASN.1 OCTET STRING value on the output stream.
      void putOID​(ObjectIdentifier oid)
      Marshals an object identifier (OID) on the output stream.
      void putOrderedSet​(byte tag, DerEncoder[] set)
      Marshals the contents of a set on the output stream.
      void putOrderedSetOf​(byte tag, DerEncoder[] set)
      Marshals the contents of a set on the output stream.
      void putPrintableString​(java.lang.String s)
      Converts string to printable and writes to der output stream.
      void putSequence​(DerValue[] seq)
      Marshals a sequence on the output stream.
      void putSet​(byte tag, DerEncoder[] set)
      NSCP : Like putOrderSetOf, except not sorted.
      void putSet​(DerValue[] set)
      Marshals the contents of a set on the output stream without ordering the elements.
      void putStringType​(byte tag, java.lang.String s)  
      void putTag​(byte tagClass, boolean form, byte val)
      Put the tag of the attribute in the stream.
      void putUnalignedBitString​(boolean[] bitString)
      Marshals a DER bit string on the output stream.
      void putUnalignedBitString​(byte[] bitString)
      Marshals a DER bit string on the output stream.
      void putUnalignedBitString​(BitArray ba)
      Marshals a DER bit string on the output stream.
      void putUnsignedInteger​(byte[] integerBytes)
      Marshals a DER unsigned integer on the output stream.
      void putUTCTime​(java.util.Date d)
      Marshals a DER UTC time/date value.
      void putUTF8String​(java.lang.String s)  
      void putVisibleString​(java.lang.String s)  
      void write​(byte tag, byte[] buf)
      Writes tagged, pre-marshaled data.
      void write​(byte tag, DerOutputStream out)
      Writes tagged data using buffer-to-buffer copy.
      void writeImplicit​(byte tag, DerOutputStream value)
      Writes implicitly tagged data using buffer-to-buffer copy.
      • Methods inherited from class java.io.ByteArrayOutputStream

        close, reset, size, toByteArray, toString, toString, toString, toString, write, write, writeBytes, writeTo
      • Methods inherited from class java.io.OutputStream

        flush, nullOutputStream, write
      • Methods inherited from class java.lang.Object

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

      • DerOutputStream

        public DerOutputStream​(int size)
        Construct an DER output stream.
        Parameters:
        size - how large a buffer to preallocate.
      • DerOutputStream

        public DerOutputStream()
        Construct an DER output stream.
    • Method Detail

      • write

        public void write​(byte tag,
                          byte[] buf)
                   throws java.io.IOException
        Writes tagged, pre-marshaled data. This calcuates and encodes the length, so that the output data is the standard triple of { tag, length, data } used by all DER values.
        Parameters:
        tag - the DER value tag for the data, such as DerValue.tag_Sequence
        buf - buffered data, which must be DER-encoded
        Throws:
        java.io.IOException
      • write

        public void write​(byte tag,
                          DerOutputStream out)
                   throws java.io.IOException
        Writes tagged data using buffer-to-buffer copy. As above, this writes a standard DER record. This is often used when efficiently encapsulating values in sequences.
        Parameters:
        tag - the DER value tag for the data, such as DerValue.tag_Sequence
        out - buffered data
        Throws:
        java.io.IOException
      • writeImplicit

        public void writeImplicit​(byte tag,
                                  DerOutputStream value)
                           throws java.io.IOException
        Writes implicitly tagged data using buffer-to-buffer copy. As above, this writes a standard DER record. This is often used when efficiently encapsulating implicitly tagged values.
        Parameters:
        tag - the DER value of the context-specific tag that replaces original tag of the value in the output , such as in
                  [N] IMPLICIT 
         
        For example, FooLength [1] IMPLICIT INTEGER, with value=4; would be encoded as "81 01 04" whereas in explicit tagging it would be encoded as "A1 03 02 01 04". Notice that the tag is A1 and not 81, this is because with explicit tagging the form is always constructed.
        value - original value being implicitly tagged
        Throws:
        java.io.IOException
      • putDerValue

        public void putDerValue​(DerValue val)
                         throws java.io.IOException
        Marshals pre-encoded DER value onto the output stream.
        Throws:
        java.io.IOException
      • putBoolean

        public void putBoolean​(boolean val)
                        throws java.io.IOException
        Marshals a DER boolean on the output stream.
        Throws:
        java.io.IOException
      • putInteger

        public void putInteger​(BigInt i)
                        throws java.io.IOException
        Marshals a DER unsigned integer on the output stream.
        Throws:
        java.io.IOException
      • putUnsignedInteger

        public void putUnsignedInteger​(byte[] integerBytes)
                                throws java.io.IOException
        Marshals a DER unsigned integer on the output stream.
        Throws:
        java.io.IOException
      • putEnumerated

        public void putEnumerated​(int i)
                           throws java.io.IOException
        Marshals a DER enumerated value on the output stream.
        Throws:
        java.io.IOException
      • putBitString

        public void putBitString​(byte[] bits)
                          throws java.io.IOException
        Marshals a DER bit string on the output stream. The bit string must be byte-aligned.
        Parameters:
        bits - the bit string, MSB first
        Throws:
        java.io.IOException
      • putUnalignedBitString

        public void putUnalignedBitString​(BitArray ba)
                                   throws java.io.IOException
        Marshals a DER bit string on the output stream. The bit strings need not be byte-aligned.
        Parameters:
        bits - the bit string, MSB first
        Throws:
        java.io.IOException
      • putUnalignedBitString

        public void putUnalignedBitString​(byte[] bitString)
                                   throws java.io.IOException
        Marshals a DER bit string on the output stream. All trailing 0 bits will be stripped off in accordance with DER encoding.
        Parameters:
        bits - the bit string, MSB first
        Throws:
        java.io.IOException
      • putUnalignedBitString

        public void putUnalignedBitString​(boolean[] bitString)
                                   throws java.io.IOException
        Marshals a DER bit string on the output stream. All trailing 0 bits will be stripped off in accordance with DER encoding.
        Parameters:
        bits - the bit string as an array of booleans.
        Throws:
        java.io.IOException
      • putOctetString

        public void putOctetString​(byte[] octets)
                            throws java.io.IOException
        DER-encodes an ASN.1 OCTET STRING value on the output stream.
        Parameters:
        octets - the octet string
        Throws:
        java.io.IOException
      • putNull

        public void putNull()
                     throws java.io.IOException
        Marshals a DER "null" value on the output stream. These are often used to indicate optional values which have been omitted.
        Throws:
        java.io.IOException
      • putOID

        public void putOID​(ObjectIdentifier oid)
                    throws java.io.IOException
        Marshals an object identifier (OID) on the output stream. Corresponds to the ASN.1 "OBJECT IDENTIFIER" construct.
        Throws:
        java.io.IOException
      • putSequence

        public void putSequence​(DerValue[] seq)
                         throws java.io.IOException
        Marshals a sequence on the output stream. This supports both the ASN.1 "SEQUENCE" (zero to N values) and "SEQUENCE OF" (one to N values) constructs.
        Throws:
        java.io.IOException
      • putSet

        public void putSet​(DerValue[] set)
                    throws java.io.IOException
        Marshals the contents of a set on the output stream without ordering the elements. Ok for BER encoding, but not for DER encoding. For DER encoding, use orderedPutSet() or orderedPutSetOf().
        Throws:
        java.io.IOException
      • putSet

        public void putSet​(byte tag,
                           DerEncoder[] set)
                    throws java.io.IOException
        NSCP : Like putOrderSetOf, except not sorted. This may defy DER encoding but is needed for compatibility with communicator.
        Throws:
        java.io.IOException
      • putOrderedSetOf

        public void putOrderedSetOf​(byte tag,
                                    DerEncoder[] set)
                             throws java.io.IOException
        Marshals the contents of a set on the output stream. Sets are semantically unordered, but DER requires that encodings of set elements be sorted into ascending lexicographical order before being output. Hence sets with the same tags and elements have the same DER encoding. This method supports the ASN.1 "SET OF" construct, but not "SET", which uses a different order.
        Throws:
        java.io.IOException
      • putOrderedSet

        public void putOrderedSet​(byte tag,
                                  DerEncoder[] set)
                           throws java.io.IOException
        Marshals the contents of a set on the output stream. Sets are semantically unordered, but DER requires that encodings of set elements be sorted into ascending tag order before being output. Hence sets with the same tags and elements have the same DER encoding. This method supports the ASN.1 "SET" construct, but not "SET OF", which uses a different order.
        Throws:
        java.io.IOException
      • putPrintableString

        public void putPrintableString​(java.lang.String s)
                                throws java.io.IOException
        Converts string to printable and writes to der output stream.
        Throws:
        java.io.IOException
      • putVisibleString

        public void putVisibleString​(java.lang.String s)
                              throws java.io.IOException
        Throws:
        java.io.IOException
      • putBMPString

        public void putBMPString​(java.lang.String s)
                          throws java.io.IOException
        Marshals a string which is consists of BMP (unicode) characters
        Throws:
        java.io.IOException
      • putGeneralString

        public void putGeneralString​(java.lang.String s)
                              throws java.io.IOException
        Throws:
        java.io.IOException
      • putIA5String

        public void putIA5String​(java.lang.String s)
                          throws java.io.IOException
        Marshals a string which is consists of IA5(ASCII) characters
        Throws:
        java.io.IOException
      • putUTF8String

        public void putUTF8String​(java.lang.String s)
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • putStringType

        public void putStringType​(byte tag,
                                  java.lang.String s)
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • getDateBytes

        public byte[] getDateBytes​(java.util.Date d,
                                   boolean UTC)
      • putUTCTime

        public void putUTCTime​(java.util.Date d)
                        throws java.io.IOException
        Marshals a DER UTC time/date value.

        YYMMDDhhmmss{Z|+hhmm|-hhmm} ... emits only using Zulu time and with seconds (even if seconds=0) as per IETF-PKIX partI.

        Throws:
        java.io.IOException
      • putGeneralizedTime

        public void putGeneralizedTime​(java.util.Date d)
                                throws java.io.IOException
        Marshals a DER Generalized Time/date value.

        YYYYMMDDhhmmss{Z|+hhmm|-hhmm} ... emits only using Zulu time and with seconds (even if seconds=0) as per IETF-PKIX partI.

        Throws:
        java.io.IOException
      • putLength

        public void putLength​(int len)
                       throws java.io.IOException
        Put the encoding of the length in the stream.
        Parameters:
        len - the length of the attribute.
        Throws:
        java.io.IOException - on writing errors.
      • putTag

        public void putTag​(byte tagClass,
                           boolean form,
                           byte val)
        Put the tag of the attribute in the stream.
        Parameters:
        class - the tag class type, one of UNIVERSAL, CONTEXT, APPLICATION or PRIVATE
        form - if true, the value is constructed, otherwise it is primitive.
        val - the tag value
      • derEncode

        public void derEncode​(java.io.OutputStream out)
                       throws java.io.IOException
        Write the current contents of this DerOutputStream to an OutputStream.
        Specified by:
        derEncode in interface DerEncoder
        Parameters:
        out - the stream on which the DER encoding is written.
        Throws:
        java.io.IOException - on output error.