return out;
}
private int calculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock)
{
Mac cMac = new CBCBlockCipherMac(cipher, params.getMacSize());
byte[] nonce = params.getNonce();
byte[] associatedText = params.getAssociatedText();
cMac.init(params.getKey());
//
// build b0
//
byte[] b0 = new byte[16];
if (associatedText != null && associatedText.length != 0)
{
b0[0] |= 0x40;
}
b0[0] |= (((cMac.getMacSize() - 2) / 2) & 0x7) << 3;
b0[0] |= ((15 - nonce.length) - 1) & 0x7;
System.arraycopy(nonce, 0, b0, 1, nonce.length);
int q = dataLen;
int count = 1;
while (q > 0)
{
b0[b0.length - count] = (byte)(q & 0xff);
q >>>= 8;
count++;
}
cMac.update(b0, 0, b0.length);
//
// process associated text
//
if (associatedText != null)
{
int extra;
if (associatedText.length < ((1 << 16) - (1 << 8)))
{
cMac.update((byte)(associatedText.length >> 8));
cMac.update((byte)associatedText.length);
extra = 2;
}
else // can't go any higher than 2^32
{
cMac.update((byte)0xff);
cMac.update((byte)0xfe);
cMac.update((byte)(associatedText.length >> 24));
cMac.update((byte)(associatedText.length >> 16));
cMac.update((byte)(associatedText.length >> 8));
cMac.update((byte)associatedText.length);
extra = 6;
}
cMac.update(associatedText, 0, associatedText.length);
extra = (extra + associatedText.length) % 16;
if (extra != 0)
{
for (int i = 0; i != 16 - extra; i++)
{
cMac.update((byte)0x00);
}
}
}
//
// add the text
//
cMac.update(data, dataOff, dataLen);
return cMac.doFinal(macBlock, 0);
}