Class CryptoInputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.nio.channels.Channel, java.nio.channels.ReadableByteChannel
    Direct Known Subclasses:
    CtrCryptoInputStream

    public class CryptoInputStream
    extends java.io.InputStream
    implements java.nio.channels.ReadableByteChannel
    CryptoInputStream reads input data and decrypts data in stream manner. It supports any mode of operations such as AES CBC/CTR/GCM mode in concept.It is not thread-safe.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private int bufferSize
      The buffer size.
      (package private) CryptoCipher cipher
      The CryptoCipher instance.
      private boolean closed
      Flag to mark whether the input stream is closed.
      static int EOS
      The index value when the end of the stream has been reached -1.
      private boolean finalDone
      Flag to mark whether do final of the cipher to end the decrypting stream.
      (package private) java.nio.ByteBuffer inBuffer
      Input data buffer.
      (package private) Input input
      The input data.
      (package private) java.security.Key key
      Crypto key for the cipher.
      private static int MIN_BUFFER_SIZE  
      private byte[] oneByteBuf  
      (package private) java.nio.ByteBuffer outBuffer
      The decrypted data buffer.
      private java.security.spec.AlgorithmParameterSpec params
      the algorithm parameters
      private static int STREAM_BUFFER_SIZE_DEFAULT
      The default value of the buffer size for stream.
      static java.lang.String STREAM_BUFFER_SIZE_KEY
      The configuration key of the buffer size for stream.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      protected CryptoInputStream​(java.io.InputStream inputStream, CryptoCipher cipher, int bufferSize, java.security.Key key, java.security.spec.AlgorithmParameterSpec params)
      Constructs a CryptoInputStream.
        CryptoInputStream​(java.lang.String transformation, java.util.Properties properties, java.io.InputStream inputStream, java.security.Key key, java.security.spec.AlgorithmParameterSpec params)
      Constructs a CryptoInputStream.
        CryptoInputStream​(java.lang.String transformation, java.util.Properties properties, java.nio.channels.ReadableByteChannel channel, java.security.Key key, java.security.spec.AlgorithmParameterSpec params)
      Constructs a CryptoInputStream.
      protected CryptoInputStream​(java.nio.channels.ReadableByteChannel channel, CryptoCipher cipher, int bufferSize, java.security.Key key, java.security.spec.AlgorithmParameterSpec params)
      Constructs a CryptoInputStream.
      protected CryptoInputStream​(Input input, CryptoCipher cipher, int bufferSize, java.security.Key key, java.security.spec.AlgorithmParameterSpec params)
      Constructs a CryptoInputStream.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      int available()
      Overrides the InputStream.available().
      (package private) static int checkBufferSize​(CryptoCipher cipher, int bufferSize)
      Checks and floors buffer size.
      protected void checkStream()
      Checks whether the stream is closed.
      (package private) static void checkStreamCipher​(CryptoCipher cipher)
      Checks whether the cipher is supported streaming.
      void close()
      Overrides the InputStream.close().
      protected void decrypt()
      Does the decryption using inBuffer as input and outBuffer as output.
      protected void decryptFinal()
      Does final of the cipher to end the decrypting stream.
      protected int decryptMore()
      Decrypts more data by reading the under layer stream.
      protected void freeBuffers()
      Forcibly free the direct buffers.
      (package private) static void freeDirectBuffer​(java.nio.ByteBuffer buffer)
      Forcibly free the direct buffer.
      protected int getBufferSize()
      Gets the buffer size.
      (package private) static int getBufferSize​(java.util.Properties props)
      Reads crypto buffer size.
      protected CryptoCipher getCipher()
      Gets the internal CryptoCipher.
      protected Input getInput()
      Gets the input.
      protected java.security.Key getKey()
      Gets the key.
      protected java.security.spec.AlgorithmParameterSpec getParams()
      Gets the specification of cryptographic parameters.
      protected void initCipher()
      Initializes the cipher.
      boolean isOpen()
      Overrides the Channel.isOpen().
      boolean markSupported()
      Overrides the InputStream.markSupported().
      int read()
      Overrides the InputStream.read().
      int read​(byte[] array, int off, int len)
      Overrides the InputStream.read(byte[], int, int).
      int read​(java.nio.ByteBuffer dst)
      Overrides the ReadableByteChannel.read(ByteBuffer).
      long skip​(long n)
      Overrides the InputStream.skip(long).
      • Methods inherited from class java.io.InputStream

        mark, read, reset
      • Methods inherited from class java.lang.Object

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

      • STREAM_BUFFER_SIZE_KEY

        public static final java.lang.String STREAM_BUFFER_SIZE_KEY
        The configuration key of the buffer size for stream.
        See Also:
        Constant Field Values
      • STREAM_BUFFER_SIZE_DEFAULT

        private static final int STREAM_BUFFER_SIZE_DEFAULT
        The default value of the buffer size for stream.
        See Also:
        Constant Field Values
      • EOS

        public static final int EOS
        The index value when the end of the stream has been reached -1.
        Since:
        1.1
        See Also:
        Constant Field Values
      • oneByteBuf

        private final byte[] oneByteBuf
      • cipher

        final CryptoCipher cipher
        The CryptoCipher instance.
      • bufferSize

        private final int bufferSize
        The buffer size.
      • key

        final java.security.Key key
        Crypto key for the cipher.
      • params

        private final java.security.spec.AlgorithmParameterSpec params
        the algorithm parameters
      • closed

        private boolean closed
        Flag to mark whether the input stream is closed.
      • finalDone

        private boolean finalDone
        Flag to mark whether do final of the cipher to end the decrypting stream.
      • input

        Input input
        The input data.
      • inBuffer

        java.nio.ByteBuffer inBuffer
        Input data buffer. The data starts at inBuffer.position() and ends at to inBuffer.limit().
      • outBuffer

        java.nio.ByteBuffer outBuffer
        The decrypted data buffer. The data starts at outBuffer.position() and ends at outBuffer.limit().
    • Constructor Detail

      • CryptoInputStream

        protected CryptoInputStream​(Input input,
                                    CryptoCipher cipher,
                                    int bufferSize,
                                    java.security.Key key,
                                    java.security.spec.AlgorithmParameterSpec params)
                             throws java.io.IOException
        Constructs a CryptoInputStream.
        Parameters:
        input - the input data.
        cipher - the cipher instance.
        bufferSize - the bufferSize.
        key - crypto key for the cipher.
        params - the algorithm parameters.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • CryptoInputStream

        protected CryptoInputStream​(java.io.InputStream inputStream,
                                    CryptoCipher cipher,
                                    int bufferSize,
                                    java.security.Key key,
                                    java.security.spec.AlgorithmParameterSpec params)
                             throws java.io.IOException
        Constructs a CryptoInputStream.
        Parameters:
        cipher - the cipher instance.
        inputStream - the input stream.
        bufferSize - the bufferSize.
        key - crypto key for the cipher.
        params - the algorithm parameters.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • CryptoInputStream

        protected CryptoInputStream​(java.nio.channels.ReadableByteChannel channel,
                                    CryptoCipher cipher,
                                    int bufferSize,
                                    java.security.Key key,
                                    java.security.spec.AlgorithmParameterSpec params)
                             throws java.io.IOException
        Constructs a CryptoInputStream.
        Parameters:
        channel - the ReadableByteChannel instance.
        cipher - the cipher instance.
        bufferSize - the bufferSize.
        key - crypto key for the cipher.
        params - the algorithm parameters.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • CryptoInputStream

        public CryptoInputStream​(java.lang.String transformation,
                                 java.util.Properties properties,
                                 java.io.InputStream inputStream,
                                 java.security.Key key,
                                 java.security.spec.AlgorithmParameterSpec params)
                          throws java.io.IOException
        Constructs a CryptoInputStream.
        Parameters:
        transformation - the name of the transformation, e.g., AES/CBC/PKCS5Padding. See the Java Cryptography Architecture Standard Algorithm Name Documentation for information about standard transformation names.
        properties - The Properties class represents a set of properties.
        inputStream - the input stream.
        key - crypto key for the cipher.
        params - the algorithm parameters.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • CryptoInputStream

        public CryptoInputStream​(java.lang.String transformation,
                                 java.util.Properties properties,
                                 java.nio.channels.ReadableByteChannel channel,
                                 java.security.Key key,
                                 java.security.spec.AlgorithmParameterSpec params)
                          throws java.io.IOException
        Constructs a CryptoInputStream.
        Parameters:
        transformation - the name of the transformation, e.g., AES/CBC/PKCS5Padding. See the Java Cryptography Architecture Standard Algorithm Name Documentation for information about standard transformation names.
        properties - The Properties class represents a set of properties.
        channel - the ReadableByteChannel object.
        key - crypto key for the cipher.
        params - the algorithm parameters.
        Throws:
        java.io.IOException - if an I/O error occurs.
    • Method Detail

      • checkBufferSize

        static int checkBufferSize​(CryptoCipher cipher,
                                   int bufferSize)
        Checks and floors buffer size.
        Parameters:
        cipher - the CryptoCipher instance.
        bufferSize - the buffer size.
        Returns:
        the remaining buffer size.
      • checkStreamCipher

        static void checkStreamCipher​(CryptoCipher cipher)
                               throws java.io.IOException
        Checks whether the cipher is supported streaming.
        Parameters:
        cipher - the CryptoCipher instance.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • freeDirectBuffer

        static void freeDirectBuffer​(java.nio.ByteBuffer buffer)
        Forcibly free the direct buffer.
        Parameters:
        buffer - the bytebuffer to be freed.
      • getBufferSize

        static int getBufferSize​(java.util.Properties props)
        Reads crypto buffer size.
        Parameters:
        props - The Properties class represents a set of properties.
        Returns:
        the buffer size.
      • available

        public int available()
                      throws java.io.IOException
        Overrides the InputStream.available(). Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.
        Overrides:
        available in class java.io.InputStream
        Returns:
        an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking or 0 when it reaches the end of the input stream.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • checkStream

        protected void checkStream()
                            throws java.io.IOException
        Checks whether the stream is closed.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • close

        public void close()
                   throws java.io.IOException
        Overrides the InputStream.close(). Closes this input stream and releases any system resources associated with the stream.
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.nio.channels.Channel
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.InputStream
        Throws:
        java.io.IOException - if an I/O error occurs.
      • decrypt

        protected void decrypt()
                        throws java.io.IOException
        Does the decryption using inBuffer as input and outBuffer as output. Upon return, inBuffer is cleared; the decrypted data starts at outBuffer.position() and ends at outBuffer.limit().
        Throws:
        java.io.IOException - if an I/O error occurs.
      • decryptFinal

        protected void decryptFinal()
                             throws java.io.IOException
        Does final of the cipher to end the decrypting stream.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • decryptMore

        protected int decryptMore()
                           throws java.io.IOException
        Decrypts more data by reading the under layer stream. The decrypted data will be put in the output buffer. If the end of the under stream reached, we will do final of the cipher to finish all the decrypting of data.
        Returns:
        The number of decrypted data. return -1 (if end of the decrypted stream) return 0 (no data now, but could have more later)
        Throws:
        java.io.IOException - if an I/O error occurs.
      • freeBuffers

        protected void freeBuffers()
        Forcibly free the direct buffers.
      • getBufferSize

        protected int getBufferSize()
        Gets the buffer size.
        Returns:
        the bufferSize.
      • getCipher

        protected CryptoCipher getCipher()
        Gets the internal CryptoCipher.
        Returns:
        the cipher instance.
      • getInput

        protected Input getInput()
        Gets the input.
        Returns:
        the input.
      • getKey

        protected java.security.Key getKey()
        Gets the key.
        Returns:
        the key.
      • getParams

        protected java.security.spec.AlgorithmParameterSpec getParams()
        Gets the specification of cryptographic parameters.
        Returns:
        the params.
      • initCipher

        protected void initCipher()
                           throws java.io.IOException
        Initializes the cipher.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • isOpen

        public boolean isOpen()
        Overrides the Channel.isOpen().
        Specified by:
        isOpen in interface java.nio.channels.Channel
        Returns:
        true if, and only if, this channel is open.
      • markSupported

        public boolean markSupported()
        Overrides the InputStream.markSupported().
        Overrides:
        markSupported in class java.io.InputStream
        Returns:
        false,the CtrCryptoInputStream don't support the mark method.
      • read

        public int read()
                 throws java.io.IOException
        Overrides the InputStream.read(). Reads the next byte of data from the input stream.
        Specified by:
        read in class java.io.InputStream
        Returns:
        the next byte of data, or EOS (-1) if the end of the stream is reached.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • read

        public int read​(byte[] array,
                        int off,
                        int len)
                 throws java.io.IOException
        Overrides the InputStream.read(byte[], int, int). Decryption is buffer based. If there is data in outBuffer, then read it out of this buffer. If there is no data in outBuffer, then read more from the underlying stream and do the decryption.
        Overrides:
        read in class java.io.InputStream
        Parameters:
        array - the buffer into which the decrypted data is read.
        off - the buffer offset.
        len - the maximum number of decrypted data bytes to read.
        Returns:
        int the total number of decrypted data bytes read into the buffer.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • read

        public int read​(java.nio.ByteBuffer dst)
                 throws java.io.IOException
        Overrides the ReadableByteChannel.read(ByteBuffer). Reads a sequence of bytes from this channel into the given buffer.
        Specified by:
        read in interface java.nio.channels.ReadableByteChannel
        Parameters:
        dst - The buffer into which bytes are to be transferred.
        Returns:
        The number of bytes read, possibly zero, or EOS (-1) if the channel has reached end-of-stream.
        Throws:
        java.io.IOException - if an I/O error occurs.
      • skip

        public long skip​(long n)
                  throws java.io.IOException
        Overrides the InputStream.skip(long). Skips over and discards n bytes of data from this input stream.
        Overrides:
        skip in class java.io.InputStream
        Parameters:
        n - the number of bytes to be skipped.
        Returns:
        the actual number of bytes skipped.
        Throws:
        java.io.IOException - if an I/O error occurs.