package org.bouncycastle.crypto.engines;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.DataLengthException;
/**
* this does your basic RSA algorithm.
*/
public class RSAEngine implements AsymmetricBlockCipher {
private RSACoreEngine core;
/**
* initialise the RSA engine.
*
* @param forEncryption true if we are encrypting, false otherwise.
* @param param the necessary RSA key parameters.
*/
public void init(boolean forEncryption, CipherParameters param) {
if (core == null) {
core = new RSACoreEngine();
}
core.init(forEncryption, param);
}
/**
* Return the maximum size for an input block to this engine. For RSA this
* is always one byte less than the key size on encryption, and the same
* length as the key size on decryption.
*
* @return maximum size for an input block.
*/
public int getInputBlockSize() {
return core.getInputBlockSize();
}
/**
* Return the maximum size for an output block to this engine. For RSA this
* is always one byte less than the key size on decryption, and the same
* length as the key size on encryption.
*
* @return maximum size for an output block.
*/
public int getOutputBlockSize() {
return core.getOutputBlockSize();
}
/**
* Process a single block using the basic RSA algorithm.
*
* @param in the input array.
* @param inOff the offset into the input buffer where the data starts.
* @param inLen the length of the data to be processed.
* @return the result of the RSA process.
* @exception DataLengthException the input block is too large.
*/
public byte[] processBlock(byte[] in, int inOff, int inLen) {
if (core == null) {
throw new IllegalStateException("RSA engine not initialised");
}
return core.convertOutput(core.processBlock(core.convertInput(in, inOff, inLen)));
}
}