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

package org.bouncycastle.math.ec.rfc8032;

import org.bouncycastle.math.raw.Nat;
import org.bouncycastle.math.raw.Nat256;

abstract class Scalar25519
{
    static final int SIZE = 8;
    private static final int SCALAR_BYTES = 32;
    private static final long M08L = 255L;
    private static final long M28L = 268435455L;
    private static final long M32L = 4294967295L;
    private static final int TARGET_LENGTH = 254;
    private static final int[] L;
    private static final int[] LSq;
    private static final int L0 = -50998291;
    private static final int L1 = 19280294;
    private static final int L2 = 127719000;
    private static final int L3 = -6428113;
    private static final int L4 = 5343;
    
    static boolean checkVar(final byte[] array, final int[] array2) {
        decode(array, array2);
        return !Nat256.gte(array2, Scalar25519.L);
    }
    
    static void decode(final byte[] array, final int[] array2) {
        Codec.decode32(array, 0, array2, 0, 8);
    }
    
    static void getOrderWnafVar(final int n, final byte[] array) {
        Wnaf.getSignedVar(Scalar25519.L, n, array);
    }
    
    static void multiply128Var(final int[] array, final int[] array2, final int[] array3) {
        final int[] array4 = new int[12];
        Nat256.mul128(array, array2, array4);
        if (array2[3] < 0) {
            Nat256.addTo(Scalar25519.L, 0, array4, 4, 0);
            Nat256.subFrom(array, 0, array4, 4, 0);
        }
        final byte[] array5 = new byte[48];
        Codec.encode32(array4, 0, 12, array5, 0);
        decode(reduce384(array5), array3);
    }
    
    static byte[] reduce384(final byte[] array) {
        final long n = (long)Codec.decode32(array, 0) & 0xFFFFFFFFL;
        final long n2 = (long)(Codec.decode24(array, 4) << 4) & 0xFFFFFFFFL;
        final long n3 = (long)Codec.decode32(array, 7) & 0xFFFFFFFFL;
        final long n4 = (long)(Codec.decode24(array, 11) << 4) & 0xFFFFFFFFL;
        final long n5 = (long)Codec.decode32(array, 14) & 0xFFFFFFFFL;
        final long n6 = (long)(Codec.decode24(array, 18) << 4) & 0xFFFFFFFFL;
        final long n7 = (long)Codec.decode32(array, 21) & 0xFFFFFFFFL;
        final long n8 = (long)(Codec.decode24(array, 25) << 4) & 0xFFFFFFFFL;
        final long n9 = (long)Codec.decode32(array, 28) & 0xFFFFFFFFL;
        final long n10 = (long)(Codec.decode24(array, 32) << 4) & 0xFFFFFFFFL;
        final long n11 = (long)Codec.decode32(array, 35) & 0xFFFFFFFFL;
        final long n12 = (long)(Codec.decode24(array, 39) << 4) & 0xFFFFFFFFL;
        final long n13 = (long)Codec.decode32(array, 42) & 0xFFFFFFFFL;
        final long n14 = ((long)(Codec.decode16(array, 46) << 4) & 0xFFFFFFFFL) + (n13 >> 28);
        final long n15 = n13 & 0xFFFFFFFL;
        final long n16 = n5 - n14 * -50998291L;
        final long n17 = n6 - n14 * 19280294L;
        final long n18 = n7 - n14 * 127719000L;
        final long n19 = n8 - n14 * -6428113L;
        final long n20 = n9 - n14 * 5343L;
        final long n21 = n15 + (n12 >> 28);
        final long n22 = n12 & 0xFFFFFFFL;
        final long n23 = n4 - n21 * -50998291L;
        final long n24 = n16 - n21 * 19280294L;
        final long n25 = n17 - n21 * 127719000L;
        final long n26 = n18 - n21 * -6428113L;
        final long n27 = n19 - n21 * 5343L;
        final long n28 = n22 + (n11 >> 28);
        final long n29 = n11 & 0xFFFFFFFL;
        final long n30 = n3 - n28 * -50998291L;
        final long n31 = n23 - n28 * 19280294L;
        final long n32 = n24 - n28 * 127719000L;
        final long n33 = n25 - n28 * -6428113L;
        final long n34 = n26 - n28 * 5343L;
        final long n35 = n29 + (n10 >> 28);
        final long n36 = n10 & 0xFFFFFFFL;
        final long n37 = n2 - n35 * -50998291L;
        final long n38 = n30 - n35 * 19280294L;
        final long n39 = n31 - n35 * 127719000L;
        final long n40 = n32 - n35 * -6428113L;
        final long n41 = n33 - n35 * 5343L;
        final long n42 = n20 + (n27 >> 28);
        final long n43 = n27 & 0xFFFFFFFL;
        final long n44 = n36 + (n42 >> 28);
        final long n45 = n42 & 0xFFFFFFFL;
        final long n46 = n45 >>> 27;
        final long n47 = n44 + n46;
        final long n48 = n - n47 * -50998291L;
        final long n49 = n37 - n47 * 19280294L;
        final long n50 = n38 - n47 * 127719000L;
        final long n51 = n39 - n47 * -6428113L;
        final long n52 = n40 - n47 * 5343L;
        final long n53 = n49 + (n48 >> 28);
        final long n54 = n48 & 0xFFFFFFFL;
        final long n55 = n50 + (n53 >> 28);
        final long n56 = n53 & 0xFFFFFFFL;
        final long n57 = n51 + (n55 >> 28);
        final long n58 = n55 & 0xFFFFFFFL;
        final long n59 = n52 + (n57 >> 28);
        final long n60 = n57 & 0xFFFFFFFL;
        final long n61 = n41 + (n59 >> 28);
        final long n62 = n59 & 0xFFFFFFFL;
        final long n63 = n34 + (n61 >> 28);
        final long n64 = n61 & 0xFFFFFFFL;
        final long n65 = n43 + (n63 >> 28);
        final long n66 = n63 & 0xFFFFFFFL;
        final long n67 = n45 + (n65 >> 28);
        final long n68 = n65 & 0xFFFFFFFL;
        final long n69 = n67 >> 28;
        final long n70 = n67 & 0xFFFFFFFL;
        final long n71 = n69 - n46;
        final long n72 = n54 + (n71 & 0xFFFFFFFFFCF5D3EDL);
        final long n73 = n56 + (n71 & 0x12631A6L);
        final long n74 = n58 + (n71 & 0x79CD658L);
        final long n75 = n60 + (n71 & 0xFFFFFFFFFF9DEA2FL);
        final long n76 = n62 + (n71 & 0x14DFL);
        final long n77 = n73 + (n72 >> 28);
        final long n78 = n72 & 0xFFFFFFFL;
        final long n79 = n74 + (n77 >> 28);
        final long n80 = n77 & 0xFFFFFFFL;
        final long n81 = n75 + (n79 >> 28);
        final long n82 = n79 & 0xFFFFFFFL;
        final long n83 = n76 + (n81 >> 28);
        final long n84 = n81 & 0xFFFFFFFL;
        final long n85 = n64 + (n83 >> 28);
        final long n86 = n83 & 0xFFFFFFFL;
        final long n87 = n66 + (n85 >> 28);
        final long n88 = n85 & 0xFFFFFFFL;
        final long n89 = n68 + (n87 >> 28);
        final long n90 = n87 & 0xFFFFFFFL;
        final long n91 = n70 + (n89 >> 28);
        final long n92 = n89 & 0xFFFFFFFL;
        final byte[] array2 = new byte[64];
        Codec.encode56(n78 | n80 << 28, array2, 0);
        Codec.encode56(n82 | n84 << 28, array2, 7);
        Codec.encode56(n86 | n88 << 28, array2, 14);
        Codec.encode56(n90 | n92 << 28, array2, 21);
        Codec.encode32((int)n91, array2, 28);
        return array2;
    }
    
    static byte[] reduce512(final byte[] array) {
        final long n = (long)Codec.decode32(array, 0) & 0xFFFFFFFFL;
        final long n2 = (long)(Codec.decode24(array, 4) << 4) & 0xFFFFFFFFL;
        final long n3 = (long)Codec.decode32(array, 7) & 0xFFFFFFFFL;
        final long n4 = (long)(Codec.decode24(array, 11) << 4) & 0xFFFFFFFFL;
        final long n5 = (long)Codec.decode32(array, 14) & 0xFFFFFFFFL;
        final long n6 = (long)(Codec.decode24(array, 18) << 4) & 0xFFFFFFFFL;
        final long n7 = (long)Codec.decode32(array, 21) & 0xFFFFFFFFL;
        final long n8 = (long)(Codec.decode24(array, 25) << 4) & 0xFFFFFFFFL;
        final long n9 = (long)Codec.decode32(array, 28) & 0xFFFFFFFFL;
        final long n10 = (long)(Codec.decode24(array, 32) << 4) & 0xFFFFFFFFL;
        final long n11 = (long)Codec.decode32(array, 35) & 0xFFFFFFFFL;
        final long n12 = (long)(Codec.decode24(array, 39) << 4) & 0xFFFFFFFFL;
        final long n13 = (long)Codec.decode32(array, 42) & 0xFFFFFFFFL;
        final long n14 = (long)(Codec.decode24(array, 46) << 4) & 0xFFFFFFFFL;
        final long n15 = (long)Codec.decode32(array, 49) & 0xFFFFFFFFL;
        final long n16 = (long)(Codec.decode24(array, 53) << 4) & 0xFFFFFFFFL;
        final long n17 = (long)Codec.decode32(array, 56) & 0xFFFFFFFFL;
        final long n18 = (long)(Codec.decode24(array, 60) << 4) & 0xFFFFFFFFL;
        final long n19 = (long)array[63] & 0xFFL;
        final long n20 = n10 - n19 * -50998291L;
        final long n21 = n11 - n19 * 19280294L;
        final long n22 = n12 - n19 * 127719000L;
        final long n23 = n13 - n19 * -6428113L;
        final long n24 = n14 - n19 * 5343L;
        final long n25 = n18 + (n17 >> 28);
        final long n26 = n17 & 0xFFFFFFFL;
        final long n27 = n9 - n25 * -50998291L;
        final long n28 = n20 - n25 * 19280294L;
        final long n29 = n21 - n25 * 127719000L;
        final long n30 = n22 - n25 * -6428113L;
        final long n31 = n23 - n25 * 5343L;
        final long n32 = n8 - n26 * -50998291L;
        final long n33 = n27 - n26 * 19280294L;
        final long n34 = n28 - n26 * 127719000L;
        final long n35 = n29 - n26 * -6428113L;
        final long n36 = n30 - n26 * 5343L;
        final long n37 = n16 + (n15 >> 28);
        final long n38 = n15 & 0xFFFFFFFL;
        final long n39 = n7 - n37 * -50998291L;
        final long n40 = n32 - n37 * 19280294L;
        final long n41 = n33 - n37 * 127719000L;
        final long n42 = n34 - n37 * -6428113L;
        final long n43 = n35 - n37 * 5343L;
        final long n44 = n6 - n38 * -50998291L;
        final long n45 = n39 - n38 * 19280294L;
        final long n46 = n40 - n38 * 127719000L;
        final long n47 = n41 - n38 * -6428113L;
        final long n48 = n42 - n38 * 5343L;
        final long n49 = n24 + (n31 >> 28);
        final long n50 = n31 & 0xFFFFFFFL;
        final long n51 = n5 - n49 * -50998291L;
        final long n52 = n44 - n49 * 19280294L;
        final long n53 = n45 - n49 * 127719000L;
        final long n54 = n46 - n49 * -6428113L;
        final long n55 = n47 - n49 * 5343L;
        final long n56 = n50 + (n36 >> 28);
        final long n57 = n36 & 0xFFFFFFFL;
        final long n58 = n4 - n56 * -50998291L;
        final long n59 = n51 - n56 * 19280294L;
        final long n60 = n52 - n56 * 127719000L;
        final long n61 = n53 - n56 * -6428113L;
        final long n62 = n54 - n56 * 5343L;
        final long n63 = n57 + (n43 >> 28);
        final long n64 = n43 & 0xFFFFFFFL;
        final long n65 = n3 - n63 * -50998291L;
        final long n66 = n58 - n63 * 19280294L;
        final long n67 = n59 - n63 * 127719000L;
        final long n68 = n60 - n63 * -6428113L;
        final long n69 = n61 - n63 * 5343L;
        final long n70 = n64 + (n48 >> 28);
        final long n71 = n48 & 0xFFFFFFFL;
        final long n72 = n2 - n70 * -50998291L;
        final long n73 = n65 - n70 * 19280294L;
        final long n74 = n66 - n70 * 127719000L;
        final long n75 = n67 - n70 * -6428113L;
        final long n76 = n68 - n70 * 5343L;
        final long n77 = n55 + (n62 >> 28);
        final long n78 = n62 & 0xFFFFFFFL;
        final long n79 = n71 + (n77 >> 28);
        final long n80 = n77 & 0xFFFFFFFL;
        final long n81 = n80 >>> 27;
        final long n82 = n79 + n81;
        final long n83 = n - n82 * -50998291L;
        final long n84 = n72 - n82 * 19280294L;
        final long n85 = n73 - n82 * 127719000L;
        final long n86 = n74 - n82 * -6428113L;
        final long n87 = n75 - n82 * 5343L;
        final long n88 = n84 + (n83 >> 28);
        final long n89 = n83 & 0xFFFFFFFL;
        final long n90 = n85 + (n88 >> 28);
        final long n91 = n88 & 0xFFFFFFFL;
        final long n92 = n86 + (n90 >> 28);
        final long n93 = n90 & 0xFFFFFFFL;
        final long n94 = n87 + (n92 >> 28);
        final long n95 = n92 & 0xFFFFFFFL;
        final long n96 = n76 + (n94 >> 28);
        final long n97 = n94 & 0xFFFFFFFL;
        final long n98 = n69 + (n96 >> 28);
        final long n99 = n96 & 0xFFFFFFFL;
        final long n100 = n78 + (n98 >> 28);
        final long n101 = n98 & 0xFFFFFFFL;
        final long n102 = n80 + (n100 >> 28);
        final long n103 = n100 & 0xFFFFFFFL;
        final long n104 = n102 >> 28;
        final long n105 = n102 & 0xFFFFFFFL;
        final long n106 = n104 - n81;
        final long n107 = n89 + (n106 & 0xFFFFFFFFFCF5D3EDL);
        final long n108 = n91 + (n106 & 0x12631A6L);
        final long n109 = n93 + (n106 & 0x79CD658L);
        final long n110 = n95 + (n106 & 0xFFFFFFFFFF9DEA2FL);
        final long n111 = n97 + (n106 & 0x14DFL);
        final long n112 = n108 + (n107 >> 28);
        final long n113 = n107 & 0xFFFFFFFL;
        final long n114 = n109 + (n112 >> 28);
        final long n115 = n112 & 0xFFFFFFFL;
        final long n116 = n110 + (n114 >> 28);
        final long n117 = n114 & 0xFFFFFFFL;
        final long n118 = n111 + (n116 >> 28);
        final long n119 = n116 & 0xFFFFFFFL;
        final long n120 = n99 + (n118 >> 28);
        final long n121 = n118 & 0xFFFFFFFL;
        final long n122 = n101 + (n120 >> 28);
        final long n123 = n120 & 0xFFFFFFFL;
        final long n124 = n103 + (n122 >> 28);
        final long n125 = n122 & 0xFFFFFFFL;
        final long n126 = n105 + (n124 >> 28);
        final long n127 = n124 & 0xFFFFFFFL;
        final byte[] array2 = new byte[32];
        Codec.encode56(n113 | n115 << 28, array2, 0);
        Codec.encode56(n117 | n119 << 28, array2, 7);
        Codec.encode56(n121 | n123 << 28, array2, 14);
        Codec.encode56(n125 | n127 << 28, array2, 21);
        Codec.encode32((int)n126, array2, 28);
        return array2;
    }
    
    static boolean reduceBasisVar(final int[] array, final int[] array2, final int[] array3) {
        int[] array4 = new int[16];
        System.arraycopy(Scalar25519.LSq, 0, array4, 0, 16);
        int[] array5 = new int[16];
        Nat256.square(array, array5);
        final int[] array6 = array5;
        final int n = 0;
        ++array6[n];
        final int[] array7 = new int[16];
        Nat256.mul(Scalar25519.L, array, array7);
        final int[] array8 = new int[16];
        int[] array9 = new int[4];
        System.arraycopy(Scalar25519.L, 0, array9, 0, 4);
        int[] array10 = new int[4];
        int[] array11 = new int[4];
        System.arraycopy(array, 0, array11, 0, 4);
        int[] array12 = new int[4];
        array12[0] = 1;
        int n2 = 1016;
        int n3 = 15;
        int i = ScalarUtil.getBitLengthPositive(n3, array5);
        while (i > 254) {
            if (--n2 < 0) {
                return false;
            }
            final int n4 = ScalarUtil.getBitLength(n3, array7) - i;
            final int n5 = n4 & ~(n4 >> 31);
            if (array7[n3] < 0) {
                ScalarUtil.addShifted_NP(n3, n5, array4, array5, array7, array8);
                ScalarUtil.addShifted_UV(3, n5, array9, array10, array11, array12);
            }
            else {
                ScalarUtil.subShifted_NP(n3, n5, array4, array5, array7, array8);
                ScalarUtil.subShifted_UV(3, n5, array9, array10, array11, array12);
            }
            if (!ScalarUtil.lessThan(n3, array4, array5)) {
                continue;
            }
            final int[] array13 = array9;
            array9 = array11;
            array11 = array13;
            final int[] array14 = array10;
            array10 = array12;
            array12 = array14;
            final int[] array15 = array4;
            array4 = array5;
            array5 = array15;
            n3 = i >>> 5;
            i = ScalarUtil.getBitLengthPositive(n3, array5);
        }
        System.arraycopy(array11, 0, array2, 0, 4);
        System.arraycopy(array12, 0, array3, 0, 4);
        return true;
    }
    
    static void toSignedDigits(final int n, final int[] array) {
        Nat.caddTo(8, ~array[0] & 0x1, Scalar25519.L, array);
        Nat.shiftDownBit(8, array, 1);
    }
    
    static {
        L = new int[] { 1559614445, 1477600026, -1560830762, 350157278, 0, 0, 0, 268435456 };
        LSq = new int[] { -1424848535, -487721339, 580428573, 1745064566, -770181698, 1036971123, 461123738, -1582065343, 1268693629, -889041821, -731974758, 43769659, 0, 0, 0, 16777216 };
    }
}
