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

package org.bouncycastle.crypto.modes.gcm;

import org.bouncycastle.util.Pack;

public class Tables8kGCMMultiplier implements GCMMultiplier
{
    private byte[] H;
    private long[][][] T;
    
    @Override
    public void init(final byte[] array) {
        if (this.T == null) {
            this.T = new long[2][256][2];
        }
        else if (0 != GCMUtil.areEqual(this.H, array)) {
            return;
        }
        GCMUtil.copy(array, this.H = new byte[16]);
        for (int i = 0; i < 2; ++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];
        final long[][] array3 = this.T[1];
        final long[] array4 = array2[array[14] & 0xFF];
        final long[] array5 = array3[array[15] & 0xFF];
        long n = array4[0] ^ array5[0];
        long n2 = array4[1] ^ array5[1];
        for (int i = 12; i >= 0; i -= 2) {
            final long[] array6 = array2[array[i] & 0xFF];
            final long[] array7 = array3[array[i + 1] & 0xFF];
            final long n3 = n2 << 48;
            n2 = (array6[1] ^ array7[1] ^ (n2 >>> 16 | n << 48));
            n = (array6[0] ^ array7[0] ^ n >>> 16 ^ n3 ^ n3 >>> 1 ^ n3 >>> 2 ^ n3 >>> 7);
        }
        Pack.longToBigEndian(n, array, 0);
        Pack.longToBigEndian(n2, array, 8);
    }
}
