Top Description Fields Constructors Methods
org.bouncycastle.jcajce.io

public Class CipherInputStream

extends FilterInputStream
Class Inheritance
Imports
java.io.FilterInputStream, .IOException, .InputStream, java.security.GeneralSecurityException, javax.crypto.BadPaddingException, .Cipher, .IllegalBlockSizeException, org.bouncycastle.crypto.io.InvalidCipherTextIOException

A CipherInputStream is composed of an InputStream and a cipher so that read() methods return data that are read in from the underlying InputStream but have been additionally processed by the Cipher. The cipher must be fully initialized before being used by a CipherInputStream.

For example, if the Cipher is initialized for decryption, the CipherInputStream will attempt to read in data and decrypt them, before returning the decrypted data.

This is a reimplementation of javax.crypto.CipherInputStream that is safe for use with AEAD block ciphers, and does not silently catch BadPaddingException and IllegalBlockSizeException errors. Any errors that occur during finalisation are rethrown wrapped in an InvalidCipherTextIOException.

Field Summary

Modifier and TypeField and Description
private byte[]
private int
private final Cipher
private boolean
private final byte[]
private int
Inherited from java.io.FilterInputStream:
in

Constructor Summary

AccessConstructor and Description
public
CipherInputStream(InputStream input, Cipher cipher)

Constructs a CipherInputStream from an InputStream and an initialised Cipher.

Method Summary

Modifier and TypeMethod and Description
public int
available()

Overrides java.io.FilterInputStream.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 caller of a method for this input stream.
public void
close()

Overrides java.io.FilterInputStream.close.

Implements java.io.Closeable.close.

Closes the underlying input stream, and then finalises the processing of the data by the cipher.
private byte[]
public void
mark(int
the maximum limit of bytes that can be read before the mark position becomes invalid.
readlimit
)

Overrides java.io.FilterInputStream.mark.

Marks the current position in this input stream.
public boolean
markSupported()

Overrides java.io.FilterInputStream.markSupported.

Tests if this input stream supports the mark and reset methods.
private int

Returns:

-1 to indicate end of stream, or the number of bytes (> 0) available.
nextChunk
()

Read data from underlying stream and process with cipher until end of stream or some data is available after cipher processing.

public int
read()

Overrides java.io.FilterInputStream.read.

Reads data from the underlying stream and processes it with the cipher until the cipher outputs data, and returns the next available byte.
public int

Returns:

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
read
(byte[]
the buffer into which the data is read.
b
,
int
the start offset in the destination array b
off
,
int
the maximum number of bytes read.
len
)

Overrides java.io.FilterInputStream.read.

Reads data from the underlying stream and processes it with the cipher until the cipher outputs data, and then returns up to len bytes in the provided array.
public void
reset()

Overrides java.io.FilterInputStream.reset.

Repositions this stream to the position at the time the mark method was last called on this input stream.
public long
skip(long
the number of bytes to be skipped.
n
)

Overrides java.io.FilterInputStream.skip.

Skips over and discards n bytes of data from the input stream.
Inherited from java.io.FilterInputStream:
read

Field Detail

bufback to summary
private byte[] buf
bufOffback to summary
private int bufOff
cipherback to summary
private final Cipher cipher
finalizedback to summary
private boolean finalized
inputBufferback to summary
private final byte[] inputBuffer
maxBufback to summary
private int maxBuf

Constructor Detail

CipherInputStreamback to summary
public CipherInputStream(InputStream input, Cipher cipher)

Constructs a CipherInputStream from an InputStream and an initialised Cipher.

Method Detail

availableback to summary
public int available() throws IOException

Overrides java.io.FilterInputStream.available.

Doc from java.io.FilterInputStream.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 caller of a method for this input stream. The next caller might be the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes.

Returns:int

an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking.

Exceptions
IOException:
if an I/O error occurs.
closeback to summary
public void close() throws IOException

Overrides java.io.FilterInputStream.close.

Implements java.io.Closeable.close.

Closes the underlying input stream, and then finalises the processing of the data by the cipher.

Exceptions
IOException:
if there was an error closing the input stream.
InvalidCipherTextIOException:
if the data read from the stream was invalid ciphertext (e.g. the cipher is an AEAD cipher and the ciphertext tag check fails).
finaliseCipherback to summary
private byte[] finaliseCipher() throws InvalidCipherTextIOException
markback to summary
public void mark(int readlimit)

Overrides java.io.FilterInputStream.mark.

Doc from java.io.FilterInputStream.mark.

Marks the current position in this input stream. A subsequent call to the reset method repositions this stream at the last marked position so that subsequent reads re-read the same bytes.

The readlimit argument tells this input stream to allow that many bytes to be read before the mark position gets invalidated.

Parameters
readlimit:int

the maximum limit of bytes that can be read before the mark position becomes invalid.

markSupportedback to summary
public boolean markSupported()

Overrides java.io.FilterInputStream.markSupported.

Doc from java.io.FilterInputStream.markSupported.

Tests if this input stream supports the mark and reset methods.

Returns:boolean

true if this stream type supports the mark and reset method; false otherwise.

nextChunkback to summary
private int nextChunk() throws IOException

Read data from underlying stream and process with cipher until end of stream or some data is available after cipher processing.

Returns:int

-1 to indicate end of stream, or the number of bytes (> 0) available.

readback to summary
public int read() throws IOException

Overrides java.io.FilterInputStream.read.

Reads data from the underlying stream and processes it with the cipher until the cipher outputs data, and returns the next available byte.

If the underlying stream is exhausted by this call, the cipher will be finalised.

Returns:int

Doc from java.io.FilterInputStream.read.

the next byte of data, or -1 if the end of the stream is reached.

Exceptions
IOException:
if there was an error closing the input stream.
InvalidCipherTextIOException:
if the data read from the stream was invalid ciphertext (e.g. the cipher is an AEAD cipher and the ciphertext tag check fails).
readback to summary
public int read(byte[] b, int off, int len) throws IOException

Overrides java.io.FilterInputStream.read.

Reads data from the underlying stream and processes it with the cipher until the cipher outputs data, and then returns up to len bytes in the provided array.

If the underlying stream is exhausted by this call, the cipher will be finalised.

Parameters
b:byte[]

the buffer into which the data is read.

off:int

the start offset in the destination array b

len:int

the maximum number of bytes read.

Returns:int

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.

Exceptions
IOException:
if there was an error closing the input stream.
InvalidCipherTextIOException:
if the data read from the stream was invalid ciphertext (e.g. the cipher is an AEAD cipher and the ciphertext tag check fails).
resetback to summary
public void reset() throws IOException

Overrides java.io.FilterInputStream.reset.

Doc from java.io.FilterInputStream.reset.

Repositions this stream to the position at the time the mark method was last called on this input stream.

Stream marks are intended to be used in situations where you need to read ahead a little to see what's in the stream. Often this is most easily done by invoking some general parser. If the stream is of the type handled by the parse, it just chugs along happily. If the stream is not of that type, the parser should toss an exception when it fails. If this happens within readlimit bytes, it allows the outer code to reset the stream and try another parser.

Exceptions
IOException:
if this stream has not been marked or if the mark has been invalidated.
skipback to summary
public long skip(long n) throws IOException

Overrides java.io.FilterInputStream.skip.

Doc from java.io.FilterInputStream.skip.

Skips over and discards n bytes of data from the input stream. The skip method may, for a variety of reasons, end up skipping over some smaller number of bytes, possibly 0. The actual number of bytes skipped is returned.

Parameters
n:long

the number of bytes to be skipped.

Returns:long

the actual number of bytes skipped.

Exceptions
IOException:
if in.skip(n) throws an IOException.