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

package org.bouncycastle.pqc.crypto.cmce;

class BENES12 extends BENES
{
    public BENES12(final int n, final int n2, final int n3) {
        super(n, n2, n3);
    }
    
    static void layerBenes(final long[] array, final long[] array2, final int n) {
        int n2 = 0;
        for (int n3 = 1 << n, i = 0; i < 64; i += n3 * 2) {
            for (int j = i; j < i + n3; ++j) {
                final long n4 = (array[j + 0] ^ array[j + n3]) & array2[n2++];
                final int n5 = j + 0;
                array[n5] ^= n4;
                final int n6 = j + n3;
                array[n6] ^= n4;
            }
        }
    }
    
    private void apply_benes(final byte[] array, final byte[] array2, final int n) {
        final long[] array3 = new long[64];
        final long[] array4 = new long[64];
        for (int i = 0; i < 64; ++i) {
            array3[i] = Utils.load8(array, i * 8);
        }
        int n2;
        int n3;
        if (n == 0) {
            n2 = 256;
            n3 = this.SYS_T * 2 + 40;
        }
        else {
            n2 = -256;
            n3 = this.SYS_T * 2 + 40 + (2 * this.GFBITS - 2) * 256;
        }
        BENES.transpose_64x64(array3, array3);
        for (int j = 0; j <= 5; ++j) {
            for (int k = 0; k < 64; ++k) {
                array4[k] = Utils.load4(array2, n3 + k * 4);
            }
            BENES.transpose_64x64(array4, array4);
            layerBenes(array3, array4, j);
            n3 += n2;
        }
        BENES.transpose_64x64(array3, array3);
        for (int l = 0; l <= 5; ++l) {
            for (int n4 = 0; n4 < 32; ++n4) {
                array4[n4] = Utils.load8(array2, n3 + n4 * 8);
            }
            layerBenes(array3, array4, l);
            n3 += n2;
        }
        for (int n5 = 4; n5 >= 0; --n5) {
            for (int n6 = 0; n6 < 32; ++n6) {
                array4[n6] = Utils.load8(array2, n3 + n6 * 8);
            }
            layerBenes(array3, array4, n5);
            n3 += n2;
        }
        BENES.transpose_64x64(array3, array3);
        for (int n7 = 5; n7 >= 0; --n7) {
            for (int n8 = 0; n8 < 64; ++n8) {
                array4[n8] = Utils.load4(array2, n3 + n8 * 4);
            }
            BENES.transpose_64x64(array4, array4);
            layerBenes(array3, array4, n7);
            n3 += n2;
        }
        BENES.transpose_64x64(array3, array3);
        for (int n9 = 0; n9 < 64; ++n9) {
            Utils.store8(array, n9 * 8, array3[n9]);
        }
    }
    
    public void support_gen(final short[] array, final byte[] array2) {
        final byte[][] array3 = new byte[this.GFBITS][(1 << this.GFBITS) / 8];
        for (int i = 0; i < this.GFBITS; ++i) {
            for (int j = 0; j < (1 << this.GFBITS) / 8; ++j) {
                array3[i][j] = 0;
            }
        }
        for (int k = 0; k < 1 << this.GFBITS; ++k) {
            final short bitrev = Utils.bitrev((short)k, this.GFBITS);
            for (int l = 0; l < this.GFBITS; ++l) {
                final byte[] array4 = array3[l];
                final int n = k / 8;
                array4[n] |= (byte)((bitrev >> l & 0x1) << k % 8);
            }
        }
        for (int n2 = 0; n2 < this.GFBITS; ++n2) {
            this.apply_benes(array3[n2], array2, 0);
        }
        for (int n3 = 0; n3 < this.SYS_N; ++n3) {
            array[n3] = 0;
            for (int n4 = this.GFBITS - 1; n4 >= 0; --n4) {
                final int n5 = n3;
                array[n5] <<= 1;
                final int n6 = n3;
                array[n6] |= (short)(array3[n4][n3 / 8] >> n3 % 8 & 0x1);
            }
        }
    }
}
