Class PGPCompressedData

java.lang.Object
org.bouncycastle.openpgp.PGPCompressedData
All Implemented Interfaces:
CompressionAlgorithmTags

public class PGPCompressedData extends Object implements CompressionAlgorithmTags
A PGP compressed data object.
  • Constructor Details

    • PGPCompressedData

      public PGPCompressedData(byte[] encData) throws IOException
      Construct a PGP compressed data object from the passed in byte array.
      Parameters:
      encData - an encoding of PGP compressed data.
      Throws:
      IOException - if an error occurs reading from the PGP input.
    • PGPCompressedData

      public PGPCompressedData(InputStream inStream) throws IOException
      Construct a PGP compressed data object from the passed in input stream.
      Parameters:
      inStream - an input stream containing an encoding of PGP compressed data.
      Throws:
      IOException - if an error occurs reading from the PGP input.
    • PGPCompressedData

      public PGPCompressedData(BCPGInputStream pIn) throws IOException
      Construct a compressed data object, reading a single PacketTags.COMPRESSED_DATA packet from the stream.
      Parameters:
      pIn - a PGP input stream, with a compressed data packet as the current packet.
      Throws:
      IOException - if an error occurs reading the packet from the stream.
  • Method Details

    • getAlgorithm

      public int getAlgorithm()
      Return the compression algorithm used for this packet.
      Returns:
      the compression algorithm code
    • getInputStream

      public InputStream getInputStream()
      Return the raw input stream contained in the object.

      Note that this stream is shared with the decompression stream, so consuming the returned stream will affect decompression.

      Returns:
      the raw data in the compressed data packet.
    • getDataStream

      public InputStream getDataStream() throws PGPException
      Return an input stream that decompresses and returns data in the compressed packet.

      The OpenPGP compressed data packet carries no decompressed-length field, so the returned stream is unbounded: a small compressed packet can expand into an arbitrarily large amount of data (a "decompression bomb"). When processing untrusted input, a caller that buffers the full decompressed output should bound it — by reading incrementally, or by using getDataStream(long) to cap the number of decompressed bytes.

      Returns:
      a stream over the uncompressed data.
      Throws:
      PGPException - if an error occurs constructing the decompression stream.
    • getDataStream

      public InputStream getDataStream(long limit) throws PGPException
      Return an input stream that decompresses and returns data in the compressed packet, failing with a StreamOverflowException (an IOException) once more than limit decompressed bytes have been read. This caps the "decompression bomb" amplification of an untrusted compressed packet for callers that buffer the decompressed output.

      The limit applies to the decompressed byte count. For BZIP2 the underlying decompressor still allocates its fixed working buffers — sized by the packet's block-size header, up to ~4.5MB — when the stream is constructed, independently of this limit.

      Parameters:
      limit - the maximum number of decompressed bytes that may be read, or a negative value for no limit (equivalent to getDataStream()).
      Returns:
      a stream over the uncompressed data, bounded to limit bytes.
      Throws:
      PGPException - if an error occurs constructing the decompression stream.