OFBBlockCipherpublic class OFBBlockCipher extends Object implements org.bouncycastle.crypto.BlockCipherimplements a Output-FeedBack (OFB) mode on top of a simple cipher. |
Fields Summary |
---|
private byte[] | IV | private byte[] | ofbV | private byte[] | ofbOutV | private int | blockSize | private org.bouncycastle.crypto.BlockCipher | cipher | private boolean | encrypting |
Constructors Summary |
---|
public OFBBlockCipher(org.bouncycastle.crypto.BlockCipher cipher, int blockSize)Basic constructor.
this.cipher = cipher;
this.blockSize = blockSize / 8;
this.IV = new byte[cipher.getBlockSize()];
this.ofbV = new byte[cipher.getBlockSize()];
this.ofbOutV = new byte[cipher.getBlockSize()];
|
Methods Summary |
---|
public java.lang.String | getAlgorithmName()return the algorithm name and mode.
return cipher.getAlgorithmName() + "/OFB" + (blockSize * 8);
| public int | getBlockSize()return the block size we are operating at (in bytes).
return blockSize;
| public org.bouncycastle.crypto.BlockCipher | getUnderlyingCipher()return the underlying block cipher that we are wrapping.
return cipher;
| public void | init(boolean encrypting, 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.
this.encrypting = encrypting;
if (params instanceof ParametersWithIV)
{
ParametersWithIV ivParam = (ParametersWithIV)params;
byte[] iv = ivParam.getIV();
if (iv.length < IV.length)
{
// prepend the supplied IV with zeros (per FIPS PUB 81)
System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length);
for (int i = 0; i < IV.length - iv.length; i++)
{
IV[i] = 0;
}
}
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(ofbV, 0, ofbOutV, 0);
//
// XOR the ofbV with the plaintext producing the cipher text (and
// the next input block).
//
for (int i = 0; i < blockSize; i++)
{
out[outOff + i] = (byte)(ofbOutV[i] ^ in[inOff + i]);
}
//
// change over the input block.
//
System.arraycopy(ofbV, blockSize, ofbV, 0, ofbV.length - blockSize);
System.arraycopy(ofbOutV, 0, ofbV, ofbV.length - blockSize, blockSize);
return blockSize;
| public void | reset()reset the feedback vector back to the IV and reset the underlying
cipher.
System.arraycopy(IV, 0, ofbV, 0, IV.length);
cipher.reset();
|
|