Search in sources :

Example 1 with BlockCipher

use of org.gudy.bouncycastle.crypto.BlockCipher in project BiglyBT by BiglySoftware.

the class CTSBlockCipher method doFinal.

/**
 * Process the last block in the buffer.
 *
 * @param out the array the block currently being held is copied into.
 * @param outOff the offset at which the copying starts.
 * @return the number of output bytes copied to out.
 * @exception DataLengthException if there is insufficient space in out for
 * the output.
 * @exception IllegalStateException if the underlying cipher is not
 * initialised.
 * @exception InvalidCipherTextException if cipher text decrypts wrongly (in
 * case the exception will never get thrown).
 */
@Override
public int doFinal(byte[] out, int outOff) throws DataLengthException, IllegalStateException, InvalidCipherTextException {
    if (bufOff + outOff > out.length) {
        throw new DataLengthException("output buffer to small in doFinal");
    }
    int blockSize = cipher.getBlockSize();
    int len = bufOff - blockSize;
    byte[] block = new byte[blockSize];
    if (forEncryption) {
        cipher.processBlock(buf, 0, block, 0);
        for (int i = bufOff; i != buf.length; i++) {
            buf[i] = block[i - blockSize];
        }
        for (int i = blockSize; i != bufOff; i++) {
            buf[i] ^= block[i - blockSize];
        }
        if (cipher instanceof CBCBlockCipher) {
            BlockCipher c = ((CBCBlockCipher) cipher).getUnderlyingCipher();
            c.processBlock(buf, blockSize, out, outOff);
        } else {
            cipher.processBlock(buf, blockSize, out, outOff);
        }
        System.arraycopy(block, 0, out, outOff + blockSize, len);
    } else {
        byte[] lastBlock = new byte[blockSize];
        if (cipher instanceof CBCBlockCipher) {
            BlockCipher c = ((CBCBlockCipher) cipher).getUnderlyingCipher();
            c.processBlock(buf, 0, block, 0);
        } else {
            cipher.processBlock(buf, 0, block, 0);
        }
        for (int i = blockSize; i != bufOff; i++) {
            lastBlock[i - blockSize] = (byte) (block[i - blockSize] ^ buf[i]);
        }
        System.arraycopy(buf, blockSize, block, 0, len);
        cipher.processBlock(block, 0, out, outOff);
        System.arraycopy(lastBlock, 0, out, outOff + blockSize, len);
    }
    int offset = bufOff;
    reset();
    return offset;
}
Also used : BufferedBlockCipher(org.gudy.bouncycastle.crypto.BufferedBlockCipher) BlockCipher(org.gudy.bouncycastle.crypto.BlockCipher) DataLengthException(org.gudy.bouncycastle.crypto.DataLengthException)

Aggregations

BlockCipher (org.gudy.bouncycastle.crypto.BlockCipher)1 BufferedBlockCipher (org.gudy.bouncycastle.crypto.BufferedBlockCipher)1 DataLengthException (org.gudy.bouncycastle.crypto.DataLengthException)1