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

package org.bouncycastle.pqc.crypto.cmce;

abstract class BENES
{
    private static final long[] TRANSPOSE_MASKS;
    protected final int SYS_N;
    protected final int SYS_T;
    protected final int GFBITS;
    
    public BENES(final int sys_N, final int sys_T, final int gfbits) {
        this.SYS_N = sys_N;
        this.SYS_T = sys_T;
        this.GFBITS = gfbits;
    }
    
    static void transpose_64x64(final long[] array, final long[] array2) {
        transpose_64x64(array, array2, 0);
    }
    
    static void transpose_64x64(final long[] array, final long[] array2, final int n) {
        System.arraycopy(array2, n, array, n, 64);
        int n2 = 5;
        do {
            final long n3 = BENES.TRANSPOSE_MASKS[n2];
            for (int n4 = 1 << n2, i = n; i < n + 64; i += n4 * 2) {
                for (int j = i; j < i + n4; j += 4) {
                    final long n5 = array[j + 0];
                    final long n6 = array[j + 1];
                    final long n7 = array[j + 2];
                    final long n8 = array[j + 3];
                    final long n9 = array[j + n4 + 0];
                    final long n10 = array[j + n4 + 1];
                    final long n11 = array[j + n4 + 2];
                    final long n12 = array[j + n4 + 3];
                    final long n13 = (n5 >>> n4 ^ n9) & n3;
                    final long n14 = (n6 >>> n4 ^ n10) & n3;
                    final long n15 = (n7 >>> n4 ^ n11) & n3;
                    final long n16 = (n8 >>> n4 ^ n12) & n3;
                    array[j + 0] = (n5 ^ n13 << n4);
                    array[j + 1] = (n6 ^ n14 << n4);
                    array[j + 2] = (n7 ^ n15 << n4);
                    array[j + 3] = (n8 ^ n16 << n4);
                    array[j + n4 + 0] = (n9 ^ n13);
                    array[j + n4 + 1] = (n10 ^ n14);
                    array[j + n4 + 2] = (n11 ^ n15);
                    array[j + n4 + 3] = (n12 ^ n16);
                }
            }
        } while (--n2 >= 2);
        do {
            final long n17 = BENES.TRANSPOSE_MASKS[n2];
            for (int n18 = 1 << n2, k = n; k < n + 64; k += n18 * 2) {
                for (int l = k; l < k + n18; ++l) {
                    final long n19 = array[l + 0];
                    final long n20 = array[l + n18];
                    final long n21 = (n19 >>> n18 ^ n20) & n17;
                    array[l + 0] = (n19 ^ n21 << n18);
                    array[l + n18] = (n20 ^ n21);
                }
            }
        } while (--n2 >= 0);
    }
    
    protected abstract void support_gen(final short[] p0, final byte[] p1);
    
    static {
        TRANSPOSE_MASKS = new long[] { 6148914691236517205L, 3689348814741910323L, 1085102592571150095L, 71777214294589695L, 281470681808895L, 4294967295L };
    }
}
