Search in sources :

Example 1 with CBCBlockCipherMac

use of org.bouncycastle.crypto.macs.CBCBlockCipherMac in project robovm by robovm.

the class CCMBlockCipher method calculateMac.

private int calculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock) {
    Mac cMac = new CBCBlockCipherMac(cipher, macSize * 8);
    cMac.init(keyParam);
    //
    // build b0
    //
    byte[] b0 = new byte[16];
    if (hasAssociatedText()) {
        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);
    //
    if (hasAssociatedText()) {
        int extra;
        int textLength = getAssociatedTextLength();
        if (textLength < ((1 << 16) - (1 << 8))) {
            cMac.update((byte) (textLength >> 8));
            cMac.update((byte) textLength);
            extra = 2;
        } else // can't go any higher than 2^32
        {
            cMac.update((byte) 0xff);
            cMac.update((byte) 0xfe);
            cMac.update((byte) (textLength >> 24));
            cMac.update((byte) (textLength >> 16));
            cMac.update((byte) (textLength >> 8));
            cMac.update((byte) textLength);
            extra = 6;
        }
        if (initialAssociatedText != null) {
            cMac.update(initialAssociatedText, 0, initialAssociatedText.length);
        }
        if (associatedText.size() > 0) {
            byte[] tmp = associatedText.toByteArray();
            cMac.update(tmp, 0, tmp.length);
        }
        extra = (extra + textLength) % 16;
        if (extra != 0) {
            for (int i = extra; i != 16; i++) {
                cMac.update((byte) 0x00);
            }
        }
    }
    //
    // add the text
    //
    cMac.update(data, dataOff, dataLen);
    return cMac.doFinal(macBlock, 0);
}
Also used : CBCBlockCipherMac(org.bouncycastle.crypto.macs.CBCBlockCipherMac) CBCBlockCipherMac(org.bouncycastle.crypto.macs.CBCBlockCipherMac) Mac(org.bouncycastle.crypto.Mac)

Example 2 with CBCBlockCipherMac

use of org.bouncycastle.crypto.macs.CBCBlockCipherMac in project XobotOS by xamarin.

the class CCMBlockCipher method calculateMac.

private int calculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock) {
    Mac cMac = new CBCBlockCipherMac(cipher, macSize * 8);
    cMac.init(keyParam);
    //
    // build b0
    //
    byte[] b0 = new byte[16];
    if (hasAssociatedText()) {
        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);
    //
    if (hasAssociatedText()) {
        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);
}
Also used : CBCBlockCipherMac(org.bouncycastle.crypto.macs.CBCBlockCipherMac) CBCBlockCipherMac(org.bouncycastle.crypto.macs.CBCBlockCipherMac) Mac(org.bouncycastle.crypto.Mac)

Aggregations

Mac (org.bouncycastle.crypto.Mac)2 CBCBlockCipherMac (org.bouncycastle.crypto.macs.CBCBlockCipherMac)2