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

package org.bouncycastle.pqc.crypto.falcon;

class FalconCodec
{
    static final byte[] max_fg_bits;
    static final byte[] max_FG_bits;
    
    static int modq_encode(final byte[] array, final int n, final short[] array2, final int n2) {
        final int n3 = 1 << n2;
        for (int i = 0; i < n3; ++i) {
            if ((array2[i] & 0xFFFF) >= 12289) {
                return 0;
            }
        }
        final int n4 = n3 * 14 + 7 >> 3;
        if (array == null) {
            return n4;
        }
        if (n4 > n) {
            return 0;
        }
        int n5 = 1;
        int n6 = 0;
        int j = 0;
        for (int k = 0; k < n3; ++k) {
            for (n6 = (n6 << 14 | (array2[k] & 0xFFFF)), j += 14; j >= 8; j -= 8, array[n5++] = (byte)(n6 >> j)) {}
        }
        if (j > 0) {
            array[n5] = (byte)(n6 << 8 - j);
        }
        return n4;
    }
    
    static int modq_decode(final short[] array, final int n, final byte[] array2, final int n2) {
        final int n3 = 1 << n;
        final int n4 = n3 * 14 + 7 >> 3;
        if (n4 > n2) {
            return 0;
        }
        int n5 = 0;
        int n6 = 0;
        int n7 = 0;
        for (int i = 0; i < n3; ++i) {
            n6 = (n6 << 8 | (array2[n5++] & 0xFF));
            n7 += 8;
            if (n7 >= 14) {
                n7 -= 14;
                final int n8 = n6 >>> n7 & 0x3FFF;
                if (n8 >= 12289) {
                    return 0;
                }
                array[i] = (short)n8;
            }
        }
        if ((n6 & (1 << n7) - 1) != 0x0) {
            return 0;
        }
        return n4;
    }
    
    static int trim_i8_encode(final byte[] array, final int n, final int n2, final byte[] array2, final int n3, final int n4) {
        final int n5 = 1 << n3;
        final int n6 = (1 << n4 - 1) - 1;
        final byte b = (byte)(-n6);
        for (int i = 0; i < n5; ++i) {
            if (array2[i] < b || array2[i] > n6) {
                return 0;
            }
        }
        final int n7 = n5 * n4 + 7 >> 3;
        if (array == null) {
            return n7;
        }
        if (n7 > n2) {
            return 0;
        }
        int n8 = n;
        int n9 = 0;
        int j = 0;
        final int n10 = (1 << n4) - 1;
        for (int k = 0; k < n5; ++k) {
            for (n9 = (n9 << n4 | (array2[k] & 0xFFFF & n10)), j += n4; j >= 8; j -= 8, array[n8++] = (byte)(n9 >>> j)) {}
        }
        if (j > 0) {
            array[n8] = (byte)(n9 << 8 - j);
        }
        return n7;
    }
    
    static int trim_i8_decode(final byte[] array, final int n, final int n2, final byte[] array2, final int n3, final int n4) {
        final int n5 = 1 << n;
        final int n6 = n5 * n2 + 7 >> 3;
        if (n6 > n4) {
            return 0;
        }
        int n7 = n3;
        int i = 0;
        int n8 = 0;
        int n9 = 0;
        final int n10 = (1 << n2) - 1;
        final int n11 = 1 << n2 - 1;
        while (i < n5) {
            n8 = (n8 << 8 | (array2[n7++] & 0xFF));
            for (n9 += 8; n9 >= n2 && i < n5; ++i) {
                n9 -= n2;
                final int n12 = n8 >>> n9 & n10;
                final int n13 = n12 | -(n12 & n11);
                if (n13 == -n11) {
                    return 0;
                }
                array[i] = (byte)n13;
            }
        }
        if ((n8 & (1 << n9) - 1) != 0x0) {
            return 0;
        }
        return n6;
    }
    
    static int comp_encode(final byte[] array, final int n, final short[] array2, final int n2) {
        final int n3 = 1 << n2;
        final int n4 = 0;
        for (int i = 0; i < n3; ++i) {
            if (array2[i] < -2047 || array2[i] > 2047) {
                return 0;
            }
        }
        int n5 = 0;
        int j = 0;
        int n6 = 0;
        for (int k = 0; k < n3; ++k) {
            int n7 = n5 << 1;
            int n8 = array2[k];
            if (n8 < 0) {
                n8 = -n8;
                n7 |= 0x1;
            }
            final int n9 = n8;
            final int n10 = n7 << 7 | (n9 & 0x7F);
            final int n11 = n9 >>> 7;
            j += 8;
            n5 = (n10 << n11 + 1 | 0x1);
            j += n11 + 1;
            while (j >= 8) {
                j -= 8;
                if (array != null) {
                    if (n6 >= n) {
                        return 0;
                    }
                    array[n4 + n6] = (byte)(n5 >>> j);
                }
                ++n6;
            }
        }
        if (j > 0) {
            if (array != null) {
                if (n6 >= n) {
                    return 0;
                }
                array[n4 + n6] = (byte)(n5 << 8 - j);
            }
            ++n6;
        }
        return n6;
    }
    
    static int comp_decode(final short[] array, final int n, final byte[] array2, final int n2) {
        final int n3 = 1 << n;
        final int n4 = 0;
        int n5 = 0;
        int n6 = 0;
        int n7 = 0;
        int i = 0;
    Label_0020:
        while (i < n3) {
            if (n7 >= n2) {
                return 0;
            }
            n5 = (n5 << 8 | (array2[n4 + n7] & 0xFF));
            ++n7;
            final int n8 = n5 >>> n6;
            final int n9 = n8 & 0x80;
            int j = n8 & 0x7F;
            do {
                if (n6 == 0) {
                    if (n7 >= n2) {
                        return 0;
                    }
                    n5 = (n5 << 8 | (array2[n4 + n7] & 0xFF));
                    ++n7;
                    n6 = 8;
                }
                --n6;
                if ((n5 >>> n6 & 0x1) != 0x0) {
                    if (n9 != 0 && j == 0) {
                        return 0;
                    }
                    array[i] = (short)((n9 != 0) ? (-j) : j);
                    ++i;
                    continue Label_0020;
                }
                else {
                    j += 128;
                }
            } while (j <= 2047);
            return 0;
        }
        if ((n5 & (1 << n6) - 1) != 0x0) {
            return 0;
        }
        return n7;
    }
    
    static {
        max_fg_bits = new byte[] { 0, 8, 8, 8, 8, 8, 7, 7, 6, 6, 5 };
        max_FG_bits = new byte[] { 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 };
    }
}
