// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.util;

public class GF16
{
    private static final byte[] F_STAR;
    private static final byte[] MT4B;
    private static final byte[] INV4B;
    
    static byte mt(final int n, final int n2) {
        return GF16.MT4B[n << 4 ^ n2];
    }
    
    public static byte mul(final byte b, final byte b2) {
        return GF16.MT4B[b << 4 | b2];
    }
    
    public static int mul(final int n, final int n2) {
        return GF16.MT4B[n << 4 | n2];
    }
    
    public static byte inv(final byte b) {
        return GF16.INV4B[b & 0xF];
    }
    
    public static void decode(final byte[] array, final byte[] array2, final int n) {
        int n2 = 0;
        int n3;
        int i;
        for (n3 = n >> 1, i = 0; i < n3; ++i) {
            array2[n2++] = (byte)(array[i] & 0xF);
            array2[n2++] = (byte)(array[i] >>> 4 & 0xF);
        }
        if ((n & 0x1) == 0x1) {
            array2[n2] = (byte)(array[i] & 0xF);
        }
    }
    
    public static void decode(final byte[] array, int n, final byte[] array2, int n2, final int n3) {
        for (int n4 = n3 >> 1, i = 0; i < n4; ++i) {
            array2[n2++] = (byte)(array[n] & 0xF);
            array2[n2++] = (byte)(array[n++] >>> 4 & 0xF);
        }
        if ((n3 & 0x1) == 0x1) {
            array2[n2] = (byte)(array[n] & 0xF);
        }
    }
    
    public static void encode(final byte[] array, final byte[] array2, final int n) {
        int n2 = 0;
        int n3;
        int i;
        for (n3 = n >> 1, i = 0; i < n3; ++i) {
            array2[i] = (byte)((array[n2++] & 0xF) | (array[n2++] & 0xF) << 4);
        }
        if ((n & 0x1) == 0x1) {
            array2[i] = (byte)(array[n2] & 0xF);
        }
    }
    
    public static void encode(final byte[] array, final byte[] array2, int n, final int n2) {
        int n3 = 0;
        for (int n4 = n2 >> 1, i = 0; i < n4; ++i) {
            array2[n++] = (byte)((array[n3++] & 0xF) | (array[n3++] & 0xF) << 4);
        }
        if ((n2 & 0x1) == 0x1) {
            array2[n] = (byte)(array[n3] & 0xF);
        }
    }
    
    public static byte innerProduct(final byte[] array, int n, final byte[] array2, int n2, final int n3) {
        byte b = 0;
        for (int i = 0; i < n3; ++i, n2 += n3) {
            b ^= mul(array[n++], array2[n2]);
        }
        return b;
    }
    
    static {
        F_STAR = new byte[] { 1, 2, 4, 8, 3, 6, 12, 11, 5, 10, 7, 14, 15, 13, 9 };
        MT4B = new byte[256];
        INV4B = new byte[16];
        for (int i = 0; i < 15; ++i) {
            for (int j = 0; j < 15; ++j) {
                GF16.MT4B[GF16.F_STAR[i] << 4 ^ GF16.F_STAR[j]] = GF16.F_STAR[(i + j) % 15];
            }
        }
        final byte b = GF16.F_STAR[1];
        final byte b2 = GF16.F_STAR[14];
        int mt = 1;
        int mt2 = 1;
        GF16.INV4B[1] = 1;
        for (int k = 0; k < 14; ++k) {
            mt = mt(mt, b);
            mt2 = mt(mt2, b2);
            GF16.INV4B[mt] = (byte)mt2;
        }
    }
}
