FileDocCategorySizeDatePackage
BlockCipherMac.javaAPI DocAndroid 1.5 API4128Wed May 06 22:41:06 BST 2009org.bouncycastle.crypto.macs

BlockCipherMac

public 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.

param
cipher the cipher to be used as the basis of the MAC generation.
deprecated
use CBCBlockCipherMac

        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).

param
cipher the cipher to be used as the basis of the MAC generation.
param
macSizeInBits the size of the MAC in bits, must be a multiple of 8.
deprecated
use CBCBlockCipherMac

        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 intdoFinal(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.StringgetAlgorithmName()

        return cipher.getAlgorithmName();
    
public intgetMacSize()

        return macSize;
    
public voidinit(org.bouncycastle.crypto.CipherParameters params)

        reset();

        cipher.init(true, params);
    
public voidreset()
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 voidupdate(byte in)

        int         resultLen = 0;

        if (bufOff == buf.length)
        {
            resultLen = cipher.processBlock(buf, 0, mac, 0);
            bufOff = 0;
        }

        buf[bufOff++] = in;
    
public voidupdate(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;