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

package org.bouncycastle.pqc.crypto.cmce;

class BENES13 extends BENES
{
    public BENES13(final int n, final int n2, final int n3) {
        super(n, n2, n3);
    }
    
    static void layer_in(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;
                final long n7 = (array[64 + j + 0] ^ array[64 + j + n3]) & array2[n2++];
                final int n8 = 64 + j + 0;
                array[n8] ^= n7;
                final int n9 = 64 + j + n3;
                array[n9] ^= n7;
            }
        }
    }
    
    static void layer_ex(final long[] array, final long[] array2, final int n) {
        int n2 = 0;
        for (int n3 = 1 << n, i = 0; i < 128; 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;
            }
        }
    }
    
    void apply_benes(final byte[] array, final byte[] array2, final int n) {
        final int n2 = 0;
        final long[] array3 = new long[128];
        final long[] array4 = new long[128];
        final long[] array5 = new long[64];
        final long[] array6 = new long[64];
        int n3;
        int n4;
        if (n == 0) {
            n3 = this.SYS_T * 2 + 40;
            n4 = 0;
        }
        else {
            n3 = this.SYS_T * 2 + 40 + 12288;
            n4 = -1024;
        }
        for (int i = 0; i < 64; ++i) {
            array3[i + 0] = Utils.load8(array, n2 + i * 16 + 0);
            array3[i + 64] = Utils.load8(array, n2 + i * 16 + 8);
        }
        BENES.transpose_64x64(array4, array3, 0);
        BENES.transpose_64x64(array4, array3, 64);
        for (int j = 0; j <= 6; ++j) {
            for (int k = 0; k < 64; ++k) {
                array5[k] = Utils.load8(array2, n3);
                n3 += 8;
            }
            n3 += n4;
            BENES.transpose_64x64(array6, array5);
            layer_ex(array4, array6, j);
        }
        BENES.transpose_64x64(array3, array4, 0);
        BENES.transpose_64x64(array3, array4, 64);
        for (int l = 0; l <= 5; ++l) {
            for (int n5 = 0; n5 < 64; ++n5) {
                array5[n5] = Utils.load8(array2, n3);
                n3 += 8;
            }
            n3 += n4;
            layer_in(array3, array5, l);
        }
        for (int n6 = 4; n6 >= 0; --n6) {
            for (int n7 = 0; n7 < 64; ++n7) {
                array5[n7] = Utils.load8(array2, n3);
                n3 += 8;
            }
            n3 += n4;
            layer_in(array3, array5, n6);
        }
        BENES.transpose_64x64(array4, array3, 0);
        BENES.transpose_64x64(array4, array3, 64);
        for (int n8 = 6; n8 >= 0; --n8) {
            for (int n9 = 0; n9 < 64; ++n9) {
                array5[n9] = Utils.load8(array2, n3);
                n3 += 8;
            }
            n3 += n4;
            BENES.transpose_64x64(array6, array5);
            layer_ex(array4, array6, n8);
        }
        BENES.transpose_64x64(array3, array4, 0);
        BENES.transpose_64x64(array3, array4, 64);
        for (int n10 = 0; n10 < 64; ++n10) {
            Utils.store8(array, n2 + n10 * 16 + 0, array3[0 + n10]);
            Utils.store8(array, n2 + n10 * 16 + 8, array3[64 + n10]);
        }
    }
    
    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);
            }
        }
    }
}
