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

package org.bouncycastle.pqc.crypto.falcon;

import org.bouncycastle.crypto.digests.SHAKEDigest;

class FalconSign
{
    void smallints_to_fpr(final double[] array, final int n, final byte[] array2, final int n2) {
        for (int n3 = 1 << n2, i = 0; i < n3; ++i) {
            array[n + i] = array2[i];
        }
    }
    
    void ffSampling_fft_dyntree(final SamplerCtx samplerCtx, final double[] array, final int n, final double[] array2, final int n2, final double[] array3, final int n3, final double[] array4, final int n4, final double[] array5, final int n5, final int n6, final int n7, final double[] array6, final int n8) {
        if (n7 == 0) {
            final double n9 = Math.sqrt(array3[n3]) * FPREngine.fpr_inv_sigma[n6];
            array[n] = SamplerZ.sample(samplerCtx, array[n], n9);
            array2[n2] = SamplerZ.sample(samplerCtx, array2[n2], n9);
            return;
        }
        final int n10 = 1 << n7;
        final int n11 = n10 >> 1;
        FalconFFT.poly_LDL_fft(array3, n3, array4, n4, array5, n5, n7);
        FalconFFT.poly_split_fft(array6, n8, array6, n8 + n11, array3, n3, n7);
        System.arraycopy(array6, n8, array3, n3, n10);
        FalconFFT.poly_split_fft(array6, n8, array6, n8 + n11, array5, n5, n7);
        System.arraycopy(array6, n8, array5, n5, n10);
        System.arraycopy(array4, n4, array6, n8, n10);
        System.arraycopy(array3, n3, array4, n4, n11);
        System.arraycopy(array5, n5, array4, n4 + n11, n11);
        final int n12 = n8 + n10;
        FalconFFT.poly_split_fft(array6, n12, array6, n12 + n11, array2, n2, n7);
        this.ffSampling_fft_dyntree(samplerCtx, array6, n12, array6, n12 + n11, array5, n5, array5, n5 + n11, array4, n4 + n11, n6, n7 - 1, array6, n12 + n10);
        FalconFFT.poly_merge_fft(array6, n8 + (n10 << 1), array6, n12, array6, n12 + n11, n7);
        System.arraycopy(array2, n2, array6, n12, n10);
        FalconFFT.poly_sub(array6, n12, array6, n8 + (n10 << 1), n7);
        System.arraycopy(array6, n8 + (n10 << 1), array2, n2, n10);
        FalconFFT.poly_mul_fft(array6, n8, array6, n12, n7);
        FalconFFT.poly_add(array, n, array6, n8, n7);
        FalconFFT.poly_split_fft(array6, n8, array6, n8 + n11, array, n, n7);
        this.ffSampling_fft_dyntree(samplerCtx, array6, n8, array6, n8 + n11, array3, n3, array3, n3 + n11, array4, n4, n6, n7 - 1, array6, n8 + n10);
        FalconFFT.poly_merge_fft(array, n, array6, n8, array6, n8 + n11, n7);
    }
    
    int do_sign_dyn(final SamplerCtx samplerCtx, final short[] array, final byte[] array2, final byte[] array3, final byte[] array4, final byte[] array5, final short[] array6, final int n, final double[] array7, final int n2) {
        final int n3 = 1 << n;
        final int n4 = n2 + n3;
        final int n5 = n4 + n3;
        final int n6 = n5 + n3;
        this.smallints_to_fpr(array7, n4, array2, n);
        this.smallints_to_fpr(array7, n2, array3, n);
        this.smallints_to_fpr(array7, n6, array4, n);
        this.smallints_to_fpr(array7, n5, array5, n);
        FalconFFT.FFT(array7, n4, n);
        FalconFFT.FFT(array7, n2, n);
        FalconFFT.FFT(array7, n6, n);
        FalconFFT.FFT(array7, n5, n);
        FalconFFT.poly_neg(array7, n4, n);
        FalconFFT.poly_neg(array7, n6, n);
        final int n7 = n6 + n3;
        final int n8 = n7 + n3;
        System.arraycopy(array7, n4, array7, n7, n3);
        FalconFFT.poly_mulselfadj_fft(array7, n7, n);
        System.arraycopy(array7, n2, array7, n8, n3);
        FalconFFT.poly_muladj_fft(array7, n8, array7, n5, n);
        FalconFFT.poly_mulselfadj_fft(array7, n2, n);
        FalconFFT.poly_add(array7, n2, array7, n7, n);
        System.arraycopy(array7, n4, array7, n7, n3);
        FalconFFT.poly_muladj_fft(array7, n4, array7, n6, n);
        FalconFFT.poly_add(array7, n4, array7, n8, n);
        FalconFFT.poly_mulselfadj_fft(array7, n5, n);
        System.arraycopy(array7, n6, array7, n8, n3);
        FalconFFT.poly_mulselfadj_fft(array7, n8, n);
        FalconFFT.poly_add(array7, n5, array7, n8, n);
        final int n9 = n4;
        final int n10 = n5;
        final int n11 = n7;
        final int n12 = n11 + n3;
        final int n13 = n12 + n3;
        for (int i = 0; i < n3; ++i) {
            array7[n12 + i] = array6[i];
        }
        FalconFFT.FFT(array7, n12, n);
        final double n14 = 8.137358613394092E-5;
        System.arraycopy(array7, n12, array7, n13, n3);
        FalconFFT.poly_mul_fft(array7, n13, array7, n11, n);
        FalconFFT.poly_mulconst(array7, n13, -n14, n);
        FalconFFT.poly_mul_fft(array7, n12, array7, n6, n);
        FalconFFT.poly_mulconst(array7, n12, n14, n);
        System.arraycopy(array7, n12, array7, n6, 2 * n3);
        final int n15 = n10 + n3;
        final int n16 = n15 + n3;
        this.ffSampling_fft_dyntree(samplerCtx, array7, n15, array7, n16, array7, n2, array7, n9, array7, n10, n, n, array7, n16 + n3);
        final int n17 = n2 + n3;
        final int n18 = n17 + n3;
        final int n19 = n18 + n3;
        System.arraycopy(array7, n15, array7, n19 + n3, n3 * 2);
        final int n20 = n19 + n3;
        final int n21 = n20 + n3;
        this.smallints_to_fpr(array7, n17, array2, n);
        this.smallints_to_fpr(array7, n2, array3, n);
        this.smallints_to_fpr(array7, n19, array4, n);
        this.smallints_to_fpr(array7, n18, array5, n);
        FalconFFT.FFT(array7, n17, n);
        FalconFFT.FFT(array7, n2, n);
        FalconFFT.FFT(array7, n19, n);
        FalconFFT.FFT(array7, n18, n);
        FalconFFT.poly_neg(array7, n17, n);
        FalconFFT.poly_neg(array7, n19, n);
        final int n22 = n21 + n3;
        final int n23 = n22 + n3;
        System.arraycopy(array7, n20, array7, n22, n3);
        System.arraycopy(array7, n21, array7, n23, n3);
        FalconFFT.poly_mul_fft(array7, n22, array7, n2, n);
        FalconFFT.poly_mul_fft(array7, n23, array7, n18, n);
        FalconFFT.poly_add(array7, n22, array7, n23, n);
        System.arraycopy(array7, n20, array7, n23, n3);
        FalconFFT.poly_mul_fft(array7, n23, array7, n17, n);
        System.arraycopy(array7, n22, array7, n20, n3);
        FalconFFT.poly_mul_fft(array7, n21, array7, n19, n);
        FalconFFT.poly_add(array7, n21, array7, n23, n);
        FalconFFT.iFFT(array7, n20, n);
        FalconFFT.iFFT(array7, n21, n);
        int n24 = 0;
        int n25 = 0;
        for (int j = 0; j < n3; ++j) {
            final int n26 = (array6[j] & 0xFFFF) - (int)FPREngine.fpr_rint(array7[n20 + j]);
            n24 += n26 * n26;
            n25 |= n24;
        }
        final int n27 = n24 | -(n25 >>> 31);
        final short[] array8 = new short[n3];
        for (int k = 0; k < n3; ++k) {
            array8[k] = (short)(-FPREngine.fpr_rint(array7[n21 + k]));
        }
        if (FalconCommon.is_short_half(n27, array8, n) != 0) {
            System.arraycopy(array8, 0, array, 0, n3);
            return 1;
        }
        return 0;
    }
    
    void sign_dyn(final short[] array, final SHAKEDigest shakeDigest, final byte[] array2, final byte[] array3, final byte[] array4, final byte[] array5, final short[] array6, final int n, final double[] array7) {
        final int n2 = 0;
        SamplerCtx samplerCtx;
        do {
            samplerCtx = new SamplerCtx();
            samplerCtx.sigma_min = FPREngine.fpr_sigma_min[n];
            samplerCtx.p.prng_init(shakeDigest);
        } while (this.do_sign_dyn(samplerCtx, array, array2, array3, array4, array5, array6, n, array7, n2) == 0);
    }
}
