MacCFBBlockCipherpublic class MacCFBBlockCipher extends Object implements a Cipher-FeedBack (CFB) mode on top of a simple cipher. |
Fields Summary |
---|
private byte[] | IV | private byte[] | cfbV | private byte[] | cfbOutV | private int | blockSize | private org.bouncycastle.crypto.BlockCipher | cipher |
Constructors Summary |
---|
public MacCFBBlockCipher(org.bouncycastle.crypto.BlockCipher cipher, int bitBlockSize)Basic constructor.
this.cipher = cipher;
this.blockSize = bitBlockSize / 8;
this.IV = new byte[cipher.getBlockSize()];
this.cfbV = new byte[cipher.getBlockSize()];
this.cfbOutV = new byte[cipher.getBlockSize()];
|
Methods Summary |
---|
public java.lang.String | getAlgorithmName()return the algorithm name and mode.
return cipher.getAlgorithmName() + "/CFB" + (blockSize * 8);
| public int | getBlockSize()return the block size we are operating at.
return blockSize;
| void | getMacBlock(byte[] mac)
cipher.processBlock(cfbV, 0, mac, 0);
| public void | init(org.bouncycastle.crypto.CipherParameters params)Initialise the cipher and, possibly, the initialisation vector (IV).
If an IV isn't passed as part of the parameter, the IV will be all zeros.
An IV which is too short is handled in FIPS compliant fashion.
if (params instanceof ParametersWithIV)
{
ParametersWithIV ivParam = (ParametersWithIV)params;
byte[] iv = ivParam.getIV();
if (iv.length < IV.length)
{
System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length);
}
else
{
System.arraycopy(iv, 0, IV, 0, IV.length);
}
reset();
cipher.init(true, ivParam.getParameters());
}
else
{
reset();
cipher.init(true, params);
}
| public int | processBlock(byte[] in, int inOff, byte[] out, int outOff)Process one block of input from the array in and write it to
the out array.
if ((inOff + blockSize) > in.length)
{
throw new DataLengthException("input buffer too short");
}
if ((outOff + blockSize) > out.length)
{
throw new DataLengthException("output buffer too short");
}
cipher.processBlock(cfbV, 0, cfbOutV, 0);
//
// XOR the cfbV with the plaintext producing the cipher text
//
for (int i = 0; i < blockSize; i++)
{
out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]);
}
//
// change over the input block.
//
System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length - blockSize);
System.arraycopy(out, outOff, cfbV, cfbV.length - blockSize, blockSize);
return blockSize;
| public void | reset()reset the chaining vector back to the IV and reset the underlying
cipher.
System.arraycopy(IV, 0, cfbV, 0, IV.length);
cipher.reset();
|
|