org.bouncycastle.crypto

## Class BufferedBlockCipher

- java.lang.Object
- - org.bouncycastle.crypto.BufferedBlockCipher

Direct Known Subclasses:
  CTSBlockCipher, PaddedBlockCipher, PaddedBufferedBlockCipher

    public class BufferedBlockCipher
    extends java.lang.Object

A wrapper class that allows block ciphers to be used to process data in a piecemeal fashion. The BufferedBlockCipher outputs a block only when the buffer is full and more data is being added, or on a doFinal.

Note: in the case where the underlying cipher is either a CFB cipher or an OFB one the last block may not be a multiple of the block size.

### Field Summary

Fields
`protected byte[]` `buf`
`protected int` `bufOff`
`protected BlockCipher` `cipher`
`protected boolean` `forEncryption`
`protected boolean` `partialBlockOkay`
`protected boolean` `pgpCFB`

### Constructor Summary

Constructors
`protected` `BufferedBlockCipher()` constructor for subclasses
`` `BufferedBlockCipher(BlockCipher cipher)` Create a buffered block cipher without padding.

### Method Summary

Methods
`int` `doFinal(byte[] out, int outOff)` Process the last block in the buffer.
`int` `getBlockSize()` return the blocksize for the underlying cipher.
`int` `getOutputSize(int length)` return the size of the output buffer required for an update plus a doFinal with an input of 'length' bytes.
`BlockCipher` `getUnderlyingCipher()` return the cipher this object wraps.
`int` `getUpdateOutputSize(int len)` return the size of the output buffer required for an update an input of len bytes.
`void` `init(boolean forEncryption, CipherParameters params)` initialise the cipher.
`int` `processByte(byte in, byte[] out, int outOff)` process a single byte, producing an output block if neccessary.
`int` `processBytes(byte[] in, int inOff, int len, byte[] out, int outOff)` process an array of bytes, producing output if necessary.
`void` `reset()` Reset the buffer and cipher.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Field Detail

#### buf

    protected byte[] buf

#### bufOff

    protected int bufOff

#### forEncryption

    protected boolean forEncryption

#### cipher

    protected BlockCipher cipher

#### partialBlockOkay

    protected boolean partialBlockOkay

#### pgpCFB

    protected boolean pgpCFB

### Constructor Detail

#### BufferedBlockCipher

    protected BufferedBlockCipher()

constructor for subclasses

#### BufferedBlockCipher

    public BufferedBlockCipher(BlockCipher cipher)

Create a buffered block cipher without padding.

Parameters:
  `cipher` - the underlying block cipher this buffering object wraps.

### Method Detail

#### getUnderlyingCipher

    public BlockCipher getUnderlyingCipher()

return the cipher this object wraps.

Returns:
  the cipher this object wraps.

#### init

    public void init(boolean forEncryption,
            CipherParameters params)
              throws java.lang.IllegalArgumentException

initialise the cipher.

Parameters:
  `forEncryption` - if true the cipher is initialised for encryption, if false for decryption.
  `params` - the key and other data required by the cipher.
Throws:
  `java.lang.IllegalArgumentException` - if the params argument is inappropriate.

#### getBlockSize

    public int getBlockSize()

return the blocksize for the underlying cipher.

Returns:
  the blocksize for the underlying cipher.

#### getUpdateOutputSize

    public int getUpdateOutputSize(int len)

return the size of the output buffer required for an update an input of len bytes.

Parameters:
  `len` - the length of the input.
Returns:
  the space required to accommodate a call to update with len bytes of input.

#### getOutputSize

    public int getOutputSize(int length)

return the size of the output buffer required for an update plus a doFinal with an input of 'length' bytes.

Parameters:
  `length` - the length of the input.
Returns:
  the space required to accommodate a call to update and doFinal with 'length' bytes of input.

#### processByte

    public int processByte(byte in,
                  byte[] out,
                  int outOff)
                    throws DataLengthException,
                           java.lang.IllegalStateException

process a single byte, producing an output block if neccessary.

Parameters:
  `in` - the input byte.
  `out` - the space for any output that might be produced.
  `outOff` - the offset from which the output will be copied.
Returns:
  the number of output bytes copied to out.
Throws:
  `DataLengthException` - if there isn't enough space in out.
  `java.lang.IllegalStateException` - if the cipher isn't initialised.

#### processBytes

    public int processBytes(byte[] in,
                   int inOff,
                   int len,
                   byte[] out,
                   int outOff)
                     throws DataLengthException,
                            java.lang.IllegalStateException

process an array of bytes, producing output if necessary.

Parameters:
  `in` - the input byte array.
  `inOff` - the offset at which the input data starts.
  `len` - the number of bytes to be copied out of the input array.
  `out` - the space for any output that might be produced.
  `outOff` - the offset from which the output will be copied.
Returns:
  the number of output bytes copied to out.
Throws:
  `DataLengthException` - if there isn't enough space in out.
  `java.lang.IllegalStateException` - if the cipher isn't initialised.

#### doFinal

    public int doFinal(byte[] out,
              int outOff)
                throws DataLengthException,
                       java.lang.IllegalStateException,
                       InvalidCipherTextException

Process the last block in the buffer.

Parameters:
  `out` - the array the block currently being held is copied into.
  `outOff` - the offset at which the copying starts.
Returns:
  the number of output bytes copied to out.
Throws:
  `DataLengthException` - if there is insufficient space in out for the output, or the input is not block size aligned and should be.
  `java.lang.IllegalStateException` - if the underlying cipher is not initialised.
  `InvalidCipherTextException` - if padding is expected and not found.
  `DataLengthException` - if the input is not block size aligned.

#### reset

    public void reset()

Reset the buffer and cipher. After resetting the object is in the same state as it was after the last init (if there was one).