BlockCipherMacpublic class BlockCipherMac extends Object implements org.bouncycastle.crypto.Mac
Fields Summary |
---|
private byte[] | mac | private byte[] | buf | private int | bufOff | private org.bouncycastle.crypto.BlockCipher | cipher | private int | macSize |
Constructors Summary |
---|
public BlockCipherMac(org.bouncycastle.crypto.BlockCipher cipher)create a standard MAC based on a block cipher. This will produce an
authentication code half the length of the block size of the cipher.
this(cipher, (cipher.getBlockSize() * 8) / 2);
| public BlockCipherMac(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.
Note: the size of the MAC must be at least 16 bits (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.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();
//
// pad with zeroes
//
while (bufOff < blockSize)
{
buf[bufOff] = 0;
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;
|
|