CBCBlockCipherMacpublic class CBCBlockCipherMac extends Object implements org.bouncycastle.crypto.Macstandard CBC Block Cipher MAC - if no padding is specified the default of
pad of zeroes is used. |
Fields Summary |
---|
private byte[] | mac | private byte[] | buf | private int | bufOff | private org.bouncycastle.crypto.BlockCipher | cipher | private org.bouncycastle.crypto.paddings.BlockCipherPadding | padding | private int | macSize |
Constructors Summary |
---|
public CBCBlockCipherMac(org.bouncycastle.crypto.BlockCipher cipher)create a standard MAC based on a CBC block cipher. This will produce an
authentication code half the length of the block size of the cipher.
this(cipher, (cipher.getBlockSize() * 8) / 2, null);
| public CBCBlockCipherMac(org.bouncycastle.crypto.BlockCipher cipher, org.bouncycastle.crypto.paddings.BlockCipherPadding padding)create a standard MAC based on a CBC block cipher. This will produce an
authentication code half the length of the block size of the cipher.
this(cipher, (cipher.getBlockSize() * 8) / 2, padding);
| public CBCBlockCipherMac(org.bouncycastle.crypto.BlockCipher cipher, int macSizeInBits)create a standard MAC based on a block cipher with the size of the
MAC been given in bits. This class uses CBC mode as the basis for the
MAC generation.
Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
or 16 bits if being used as a data authenticator (FIPS Publication 113),
and in general should be less than the size of the block cipher as it reduces
the chance of an exhaustive attack (see Handbook of Applied Cryptography).
this(cipher, macSizeInBits, null);
| public CBCBlockCipherMac(org.bouncycastle.crypto.BlockCipher cipher, int macSizeInBits, org.bouncycastle.crypto.paddings.BlockCipherPadding padding)create a standard MAC based on a block cipher with the size of the
MAC been given in bits. This class uses CBC mode as the basis for the
MAC generation.
Note: the size of the MAC must be at least 24 bits (FIPS Publication 81),
or 16 bits if being used as a data authenticator (FIPS Publication 113),
and in general should be less than the size of the block cipher as it reduces
the chance of an exhaustive attack (see Handbook of Applied Cryptography).
if ((macSizeInBits % 8) != 0)
{
throw new IllegalArgumentException("MAC size must be multiple of 8");
}
this.cipher = new CBCBlockCipher(cipher);
this.padding = padding;
this.macSize = macSizeInBits / 8;
mac = new byte[cipher.getBlockSize()];
buf = new byte[cipher.getBlockSize()];
bufOff = 0;
|
Methods Summary |
---|
public int | doFinal(byte[] out, int outOff)
int blockSize = cipher.getBlockSize();
if (padding == null)
{
//
// pad with zeroes
//
while (bufOff < blockSize)
{
buf[bufOff] = 0;
bufOff++;
}
}
else
{
if (bufOff == blockSize)
{
cipher.processBlock(buf, 0, mac, 0);
bufOff = 0;
}
padding.addPadding(buf, bufOff);
}
cipher.processBlock(buf, 0, mac, 0);
System.arraycopy(mac, 0, out, outOff, macSize);
reset();
return macSize;
| public java.lang.String | getAlgorithmName()
return cipher.getAlgorithmName();
| public int | getMacSize()
return macSize;
| public void | init(org.bouncycastle.crypto.CipherParameters params)
reset();
cipher.init(true, params);
| public void | reset()Reset the mac generator.
/*
* clean the buffer.
*/
for (int i = 0; i < buf.length; i++)
{
buf[i] = 0;
}
bufOff = 0;
/*
* reset the underlying cipher.
*/
cipher.reset();
| public void | update(byte in)
int resultLen = 0;
if (bufOff == buf.length)
{
resultLen = cipher.processBlock(buf, 0, mac, 0);
bufOff = 0;
}
buf[bufOff++] = in;
| public void | update(byte[] in, int inOff, int len)
if (len < 0)
{
throw new IllegalArgumentException("Can't have a negative input length!");
}
int blockSize = cipher.getBlockSize();
int resultLen = 0;
int gapLen = blockSize - bufOff;
if (len > gapLen)
{
System.arraycopy(in, inOff, buf, bufOff, gapLen);
resultLen += cipher.processBlock(buf, 0, mac, 0);
bufOff = 0;
len -= gapLen;
inOff += gapLen;
while (len > blockSize)
{
resultLen += cipher.processBlock(in, inOff, mac, 0);
len -= blockSize;
inOff += blockSize;
}
}
System.arraycopy(in, inOff, buf, bufOff, len);
bufOff += len;
|
|