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

package org.bouncycastle.pqc.crypto.cmce;

import org.bouncycastle.math.raw.Interleave;

final class GF12 extends GF
{
    @Override
    protected void gf_mul_poly(final int n, final int[] array, final short[] array2, final short[] array3, final short[] array4, final int[] array5) {
        array5[0] = this.gf_mul_ext(array3[0], array4[0]);
        for (int i = 1; i < n; ++i) {
            array5[i + i - 1] = 0;
            final short n2 = array3[i];
            final short n3 = array4[i];
            for (int j = 0; j < i; ++j) {
                final int n4 = i + j;
                array5[n4] ^= this.gf_mul_ext_par(n2, array4[j], array3[j], n3);
            }
            array5[i + i] = this.gf_mul_ext(n2, n3);
        }
        for (int k = (n - 1) * 2; k >= n; --k) {
            final int n5 = array5[k];
            for (int l = 0; l < array.length - 1; ++l) {
                final int n6 = k - n + array[l];
                array5[n6] ^= n5;
            }
            final int n7 = k - n;
            array5[n7] ^= n5 << 1;
        }
        for (int n8 = 0; n8 < n; ++n8) {
            array2[n8] = this.gf_reduce(array5[n8]);
        }
    }
    
    @Override
    protected void gf_sqr_poly(final int n, final int[] array, final short[] array2, final short[] array3, final int[] array4) {
        array4[0] = this.gf_sq_ext(array3[0]);
        for (int i = 1; i < n; ++i) {
            array4[i + i - 1] = 0;
            array4[i + i] = this.gf_sq_ext(array3[i]);
        }
        for (int j = (n - 1) * 2; j >= n; --j) {
            final int n2 = array4[j];
            for (int k = 0; k < array.length - 1; ++k) {
                final int n3 = j - n + array[k];
                array4[n3] ^= n2;
            }
            final int n4 = j - n;
            array4[n4] ^= n2 << 1;
        }
        for (int l = 0; l < n; ++l) {
            array2[l] = this.gf_reduce(array4[l]);
        }
    }
    
    @Override
    protected short gf_frac(final short n, final short n2) {
        return this.gf_mul(this.gf_inv(n), n2);
    }
    
    @Override
    protected short gf_inv(final short n) {
        final short gf_mul = this.gf_mul(this.gf_sq(n), n);
        final short gf_mul2 = this.gf_mul(this.gf_sq(this.gf_sq(gf_mul)), gf_mul);
        return this.gf_sq(this.gf_mul(this.gf_sq(this.gf_mul(this.gf_sq(this.gf_sq(this.gf_mul(this.gf_sq(this.gf_sq(this.gf_sq(this.gf_sq(gf_mul2)))), gf_mul2))), gf_mul)), n));
    }
    
    @Override
    protected short gf_mul(final short n, final short n2) {
        int n3 = n * (n2 & 0x1);
        for (int i = 1; i < 12; ++i) {
            n3 ^= n * (n2 & 1 << i);
        }
        return this.gf_reduce(n3);
    }
    
    @Override
    protected int gf_mul_ext(final short n, final short n2) {
        int n3 = n * (n2 & 0x1);
        for (int i = 1; i < 12; ++i) {
            n3 ^= n * (n2 & 1 << i);
        }
        return n3;
    }
    
    private int gf_mul_ext_par(final short n, final short n2, final short n3, final short n4) {
        int n5 = n * (n2 & 0x1);
        int n6 = n3 * (n4 & 0x1);
        for (int i = 1; i < 12; ++i) {
            n5 ^= n * (n2 & 1 << i);
            n6 ^= n3 * (n4 & 1 << i);
        }
        return n5 ^ n6;
    }
    
    @Override
    protected short gf_reduce(final int n) {
        return (short)((n & 0xFFF) ^ n >>> 12 ^ (n & 0x1FF000) >>> 9 ^ (n & 0xE00000) >>> 18 ^ n >>> 21);
    }
    
    @Override
    protected short gf_sq(final short n) {
        return this.gf_reduce(Interleave.expand16to32(n));
    }
    
    @Override
    protected int gf_sq_ext(final short n) {
        return Interleave.expand16to32(n);
    }
}
