Esempio n. 1
0
    private static void InversionStep(uint[] p, uint[] u, int uLen, uint[] x, ref int xc)
    {
        int len = p.Length;
        int num = 0;

        while (u[0] == 0)
        {
            Nat.ShiftDownWord(uLen, u, 0u);
            num += 32;
        }
        int trailingZeroes = GetTrailingZeroes(u[0]);

        if (trailingZeroes > 0)
        {
            Nat.ShiftDownBits(uLen, u, trailingZeroes, 0u);
            num += trailingZeroes;
        }
        for (int i = 0; i < num; i++)
        {
            if ((x[0] & 1) != 0)
            {
                if (xc < 0)
                {
                    xc += (int)Nat.AddTo(len, p, x);
                }
                else
                {
                    xc += Nat.SubFrom(len, p, x);
                }
            }
            Nat.ShiftDownBit(len, x, (uint)xc);
        }
    }
        public static void Reduce(uint[] xx, uint[] z)
        {
            uint c    = xx[0x20];
            uint num2 = Nat.ShiftDownBits(0x10, xx, 0x10, 9, c, z, 0) >> 0x17;

            num2 += c >> 9;
            num2 += Nat.AddTo(0x10, xx, z);
            if ((num2 > 0x1ff) || ((num2 == 0x1ff) && Nat.Eq(0x10, z, P)))
            {
                num2 += Nat.Inc(0x10, z);
                num2 &= 0x1ff;
            }
            z[0x10] = num2;
        }
Esempio n. 3
0
        public static void Reduce(uint[] xx, uint[] z)
        {
            uint num  = xx[32];
            uint num2 = Nat.ShiftDownBits(16, xx, 16, 9, num, z, 0) >> 23;

            num2 += num >> 9;
            num2 += Nat.AddTo(16, xx, z);
            if (num2 > 511 || (num2 == 511 && Nat.Eq(16, z, P)))
            {
                num2 += Nat.Inc(16, z);
                num2 &= 0x1FF;
            }
            z[16] = num2;
        }
Esempio n. 4
0
        public static void Reduce(uint[] xx, uint[] z)
        {
            Debug.Assert(xx[32] >> 18 == 0);
            uint xx32 = xx[32];
            uint c    = Nat.ShiftDownBits(16, xx, 16, 9, xx32, z, 0) >> 23;

            c += xx32 >> 9;
            c += Nat.AddTo(16, xx, z);
            if (c > P16 || (c == P16 && Nat.Eq(16, z, P)))
            {
                c += Nat.Inc(16, z);
                c &= P16;
            }
            z[16] = c;
        }
        private static void ScalarMult(byte[] k, PointAffine p, PointAccum r)
        {
            uint[] n = new uint[ScalarUints];
            DecodeScalar(k, 0, n);

            Debug.Assert(0U == (n[0] & 7));
            Debug.Assert(1U == n[ScalarUints - 1] >> 30);

            Nat.ShiftDownBits(ScalarUints, n, 3, 1U);

            // Recode the scalar into signed-digit form
            {
                uint c1 = Nat.CAdd(ScalarUints, ~(int)n[0] & 1, n, L, n);   Debug.Assert(c1 == 0U);
                uint c2 = Nat.ShiftDownBit(ScalarUints, n, 0U);             Debug.Assert(c2 == (1U << 31));
            }

            Debug.Assert(1U == n[ScalarUints - 1] >> 28);

            int[]    table = PointPrecompute(p, 8);
            PointExt q     = new PointExt();

            // Replace first 4 doublings (2^4 * P) with 1 addition (P + 15 * P)
            PointCopy(p, r);
            PointLookup(table, 7, q);
            PointAdd(q, r);

            int w = 62;

            for (;;)
            {
                PointLookup(n, w, table, q);
                PointAdd(q, r);

                PointDouble(r);
                PointDouble(r);
                PointDouble(r);

                if (--w < 0)
                {
                    break;
                }

                PointDouble(r);
            }
        }
Esempio n. 6
0
        private static void ScalarMult(byte[] k, PointExt p, PointExt r)
        {
            uint[] n = new uint[ScalarUints];
            DecodeScalar(k, 0, n);

            Debug.Assert(0U == (n[0] & 3));
            Debug.Assert(1U == n[ScalarUints - 1] >> 31);

            Nat.ShiftDownBits(ScalarUints, n, 2, 0U);

            // Recode the scalar into signed-digit form
            {
                uint c1 = Nat.CAdd(ScalarUints, ~(int)n[0] & 1, n, L, n);   Debug.Assert(c1 == 0U);
                uint c2 = Nat.ShiftDownBit(ScalarUints, n, 1U);             Debug.Assert(c2 == (1U << 31));
            }

            uint[]   table = PointPrecompute(p, 8);
            PointExt q     = new PointExt();

            PointLookup(n, 111, table, r);

            for (int w = 110; w >= 0; --w)
            {
                for (int i = 0; i < 4; ++i)
                {
                    PointDouble(r);
                }

                PointLookup(n, w, table, q);
                PointAdd(q, r);
            }

            for (int i = 0; i < 2; ++i)
            {
                PointDouble(r);
            }
        }
Esempio n. 7
0
        private static int Legendre(BigInteger a, BigInteger b)
        {
            //int r = 0, bits = b.IntValue;

            //for (;;)
            //{
            //    int lowestSetBit = a.GetLowestSetBit();
            //    a = a.ShiftRight(lowestSetBit);
            //    r ^= (bits ^ (bits >> 1)) & (lowestSetBit << 1);

            //    int cmp = a.CompareTo(b);
            //    if (cmp == 0)
            //        break;

            //    if (cmp < 0)
            //    {
            //        BigInteger t = a; a = b; b = t;

            //        int oldBits = bits;
            //        bits = b.IntValue;
            //        r ^= oldBits & bits;
            //    }

            //    a = a.Subtract(b);
            //}

            //return BigInteger.One.Equals(b) ? (1 - (r & 2)) : 0;

            int bitLength = b.BitLength;

            uint[] A = Nat.FromBigInteger(bitLength, a);
            uint[] B = Nat.FromBigInteger(bitLength, b);

            int r = 0;

            int len = B.Length;

            for (;;)
            {
                while (A[0] == 0)
                {
                    Nat.ShiftDownWord(len, A, 0);
                }

                int shift = Integers.NumberOfTrailingZeros((int)A[0]);
                if (shift > 0)
                {
                    Nat.ShiftDownBits(len, A, shift, 0);
                    int bits = (int)B[0];
                    r ^= (bits ^ (bits >> 1)) & (shift << 1);
                }

                int cmp = Nat.Compare(len, A, B);
                if (cmp == 0)
                {
                    break;
                }

                if (cmp < 0)
                {
                    r ^= (int)(A[0] & B[0]);
                    uint[] t = A; A = B; B = t;
                }

                while (A[len - 1] == 0)
                {
                    len = len - 1;
                }

                Nat.Sub(len, A, B, A);
            }

            return(Nat.IsOne(len, B) ? (1 - (r & 2)) : 0);
        }