/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.adapter;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.modes.AEADBlockCipher;
import org.cryptacular.CryptoException;
/**
* Adapts a {@link AEADBlockCipherAdapter}.
*
* @author Middleware Services
*/
public class AEADBlockCipherAdapter implements BlockCipherAdapter
{
/** All methods delegate to this instance. */
private final AEADBlockCipher cipherDelegate;
/**
* Creates a new instance that delegates to the given cipher.
*
* @param delegate Adapted cipher.
*/
public AEADBlockCipherAdapter(final AEADBlockCipher delegate)
{
cipherDelegate = delegate;
}
@Override
public int getOutputSize(final int len)
{
return cipherDelegate.getOutputSize(len);
}
@Override
public void init(final boolean forEncryption, final CipherParameters params) throws CryptoException
{
try {
cipherDelegate.init(forEncryption, params);
} catch (RuntimeException e) {
throw new CryptoException("Cipher initialization error", e);
}
}
@Override
public int processBytes(final byte[] in, final int inOff, final int len, final byte[] out, final int outOff)
throws CryptoException
{
try {
return cipherDelegate.processBytes(in, inOff, len, out, outOff);
} catch (RuntimeException e) {
throw new CryptoException("Cipher processing error", e);
}
}
@Override
public int doFinal(final byte[] out, final int outOff) throws CryptoException
{
try {
return cipherDelegate.doFinal(out, outOff);
} catch (InvalidCipherTextException e) {
throw new CryptoException("Error finalizing cipher", e);
}
}
@Override
public void reset()
{
cipherDelegate.reset();
}
}