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

package org.bouncycastle.crypto.modes.gcm;

import org.bouncycastle.util.Pack;

public class Tables64kGCMMultiplier implements GCMMultiplier
{
    private byte[] H;
    private long[][][] T;
    
    @Override
    public void init(final byte[] array) {
        if (this.T == null) {
            this.T = new long[16][256][2];
        }
        else if (0 != GCMUtil.areEqual(this.H, array)) {
            return;
        }
        GCMUtil.copy(array, this.H = new byte[16]);
        for (int i = 0; i < 16; ++i) {
            final long[][] array2 = this.T[i];
            if (i == 0) {
                GCMUtil.asLongs(this.H, array2[1]);
                GCMUtil.multiplyP7(array2[1], array2[1]);
            }
            else {
                GCMUtil.multiplyP8(this.T[i - 1][1], array2[1]);
            }
            for (int j = 2; j < 256; j += 2) {
                GCMUtil.divideP(array2[j >> 1], array2[j]);
                GCMUtil.xor(array2[j], array2[1], array2[j + 1]);
            }
        }
    }
    
    @Override
    public void multiplyH(final byte[] array) {
        final long[] array2 = this.T[0][array[0] & 0xFF];
        final long[] array3 = this.T[1][array[1] & 0xFF];
        final long[] array4 = this.T[2][array[2] & 0xFF];
        final long[] array5 = this.T[3][array[3] & 0xFF];
        final long[] array6 = this.T[4][array[4] & 0xFF];
        final long[] array7 = this.T[5][array[5] & 0xFF];
        final long[] array8 = this.T[6][array[6] & 0xFF];
        final long[] array9 = this.T[7][array[7] & 0xFF];
        final long[] array10 = this.T[8][array[8] & 0xFF];
        final long[] array11 = this.T[9][array[9] & 0xFF];
        final long[] array12 = this.T[10][array[10] & 0xFF];
        final long[] array13 = this.T[11][array[11] & 0xFF];
        final long[] array14 = this.T[12][array[12] & 0xFF];
        final long[] array15 = this.T[13][array[13] & 0xFF];
        final long[] array16 = this.T[14][array[14] & 0xFF];
        final long[] array17 = this.T[15][array[15] & 0xFF];
        final long n = array2[0] ^ array3[0] ^ array4[0] ^ array5[0] ^ array6[0] ^ array7[0] ^ array8[0] ^ array9[0] ^ array10[0] ^ array11[0] ^ array12[0] ^ array13[0] ^ array14[0] ^ array15[0] ^ array16[0] ^ array17[0];
        final long n2 = array2[1] ^ array3[1] ^ array4[1] ^ array5[1] ^ array6[1] ^ array7[1] ^ array8[1] ^ array9[1] ^ array10[1] ^ array11[1] ^ array12[1] ^ array13[1] ^ array14[1] ^ array15[1] ^ array16[1] ^ array17[1];
        Pack.longToBigEndian(n, array, 0);
        Pack.longToBigEndian(n2, array, 8);
    }
}
