/**
         * return a sqrt root - the routine verifies that the calculation returns the right value - if
         * none exists it returns null.
         */
        public override ECFieldElement Sqrt()
        {
            // Raise this element to the exponent 2^382 - 2^126 - 2^94 + 2^30

            uint[] x1 = this.x;
            if (Nat.IsZero(12, x1) || Nat.IsOne(12, x1))
                return this;

            uint[] t1 = Nat.Create(12);
            uint[] t2 = Nat.Create(12);
            uint[] t3 = Nat.Create(12);
            uint[] t4 = Nat.Create(12);

            SecP384R1Field.Square(x1, t1);
            SecP384R1Field.Multiply(t1, x1, t1);

            SecP384R1Field.SquareN(t1, 2, t2);
            SecP384R1Field.Multiply(t2, t1, t2);

            SecP384R1Field.Square(t2, t2);
            SecP384R1Field.Multiply(t2, x1, t2);

            SecP384R1Field.SquareN(t2, 5, t3);
            SecP384R1Field.Multiply(t3, t2, t3);

            SecP384R1Field.SquareN(t3, 5, t4);
            SecP384R1Field.Multiply(t4, t2, t4);

            SecP384R1Field.SquareN(t4, 15, t2);
            SecP384R1Field.Multiply(t2, t4, t2);

            SecP384R1Field.SquareN(t2, 2, t3);
            SecP384R1Field.Multiply(t1, t3, t1);

            SecP384R1Field.SquareN(t3, 28, t3);
            SecP384R1Field.Multiply(t2, t3, t2);

            SecP384R1Field.SquareN(t2, 60, t3);
            SecP384R1Field.Multiply(t3, t2, t3);

            uint[] r = t2;

            SecP384R1Field.SquareN(t3, 120, r);
            SecP384R1Field.Multiply(r, t3, r);

            SecP384R1Field.SquareN(r, 15, r);
            SecP384R1Field.Multiply(r, t4, r);

            SecP384R1Field.SquareN(r, 33, r);
            SecP384R1Field.Multiply(r, t1, r);

            SecP384R1Field.SquareN(r, 64, r);
            SecP384R1Field.Multiply(r, x1, r);

            SecP384R1Field.SquareN(r, 30, t1);
            SecP384R1Field.Square(t1, t2);

            return Nat.Eq(12, x1, t2) ? new SecP384R1FieldElement(t1) : null;
        }
Esempio n. 2
0
 public override ECFieldElement Sqrt()
 {
     uint[] array = x;
     if (Nat.IsZero(17, array) || Nat.IsOne(17, array))
     {
         return(this);
     }
     uint[] z      = Nat.Create(17);
     uint[] array2 = Nat.Create(17);
     SecP521R1Field.SquareN(array, 519, z);
     SecP521R1Field.Square(z, array2);
     return((!Nat.Eq(17, array, array2)) ? null : new SecP521R1FieldElement(z));
 }
Esempio n. 3
0
 public override ECFieldElement Sqrt()
 {
     uint[] x = this.x;
     if (Nat.IsZero(0x11, x) || Nat.IsOne(0x11, x))
     {
         return(this);
     }
     uint[] z         = Nat.Create(0x11);
     uint[] numArray3 = Nat.Create(0x11);
     SecP521R1Field.SquareN(x, 0x207, z);
     SecP521R1Field.Square(z, numArray3);
     return(!Nat.Eq(0x11, x, numArray3) ? null : new SecP521R1FieldElement(z));
 }
Esempio n. 4
0
 public override ECFieldElement Sqrt()
 {
     uint[] y = this.x;
     if (Nat.IsZero(12, y) || Nat.IsOne(12, y))
     {
         return(this);
     }
     uint[] array  = Nat.Create(12);
     uint[] array2 = Nat.Create(12);
     uint[] array3 = Nat.Create(12);
     uint[] array4 = Nat.Create(12);
     SecP384R1Field.Square(y, array);
     SecP384R1Field.Multiply(array, y, array);
     SecP384R1Field.SquareN(array, 2, array2);
     SecP384R1Field.Multiply(array2, array, array2);
     SecP384R1Field.Square(array2, array2);
     SecP384R1Field.Multiply(array2, y, array2);
     SecP384R1Field.SquareN(array2, 5, array3);
     SecP384R1Field.Multiply(array3, array2, array3);
     SecP384R1Field.SquareN(array3, 5, array4);
     SecP384R1Field.Multiply(array4, array2, array4);
     SecP384R1Field.SquareN(array4, 15, array2);
     SecP384R1Field.Multiply(array2, array4, array2);
     SecP384R1Field.SquareN(array2, 2, array3);
     SecP384R1Field.Multiply(array, array3, array);
     SecP384R1Field.SquareN(array3, 28, array3);
     SecP384R1Field.Multiply(array2, array3, array2);
     SecP384R1Field.SquareN(array2, 60, array3);
     SecP384R1Field.Multiply(array3, array2, array3);
     uint[] z = array2;
     SecP384R1Field.SquareN(array3, 120, z);
     SecP384R1Field.Multiply(z, array3, z);
     SecP384R1Field.SquareN(z, 15, z);
     SecP384R1Field.Multiply(z, array4, z);
     SecP384R1Field.SquareN(z, 33, z);
     SecP384R1Field.Multiply(z, array, z);
     SecP384R1Field.SquareN(z, 64, z);
     SecP384R1Field.Multiply(z, y, z);
     SecP384R1Field.SquareN(z, 30, array);
     SecP384R1Field.Square(array, array2);
     if (!Nat.Eq(12, y, array2))
     {
         return(null);
     }
     return(new SecP384R1FieldElement(array));
 }
Esempio n. 5
0
        /**
         * return a sqrt root - the routine verifies that the calculation returns the right value - if
         * none exists it returns null.
         */
        public override ECFieldElement Sqrt()
        {
            // Raise this element to the exponent 2^519

            uint[] x1 = this.x;
            if (Nat.IsZero(17, x1) || Nat.IsOne(17, x1))
            {
                return(this);
            }

            uint[] t1 = Nat.Create(17);
            uint[] t2 = Nat.Create(17);

            SecP521R1Field.SquareN(x1, 519, t1);
            SecP521R1Field.Square(t1, t2);

            return(Nat.Eq(17, x1, t2) ? new SecP521R1FieldElement(t1) : null);
        }
 public override ECFieldElement Sqrt()
 {
     uint[] x = this.x;
     if (Nat.IsZero(12, x) || Nat.IsOne(12, x))
     {
         return(this);
     }
     uint[] z         = Nat.Create(12);
     uint[] numArray3 = Nat.Create(12);
     uint[] numArray4 = Nat.Create(12);
     uint[] numArray5 = Nat.Create(12);
     SecP384R1Field.Square(x, z);
     SecP384R1Field.Multiply(z, x, z);
     SecP384R1Field.SquareN(z, 2, numArray3);
     SecP384R1Field.Multiply(numArray3, z, numArray3);
     SecP384R1Field.Square(numArray3, numArray3);
     SecP384R1Field.Multiply(numArray3, x, numArray3);
     SecP384R1Field.SquareN(numArray3, 5, numArray4);
     SecP384R1Field.Multiply(numArray4, numArray3, numArray4);
     SecP384R1Field.SquareN(numArray4, 5, numArray5);
     SecP384R1Field.Multiply(numArray5, numArray3, numArray5);
     SecP384R1Field.SquareN(numArray5, 15, numArray3);
     SecP384R1Field.Multiply(numArray3, numArray5, numArray3);
     SecP384R1Field.SquareN(numArray3, 2, numArray4);
     SecP384R1Field.Multiply(z, numArray4, z);
     SecP384R1Field.SquareN(numArray4, 0x1c, numArray4);
     SecP384R1Field.Multiply(numArray3, numArray4, numArray3);
     SecP384R1Field.SquareN(numArray3, 60, numArray4);
     SecP384R1Field.Multiply(numArray4, numArray3, numArray4);
     uint[] numArray6 = numArray3;
     SecP384R1Field.SquareN(numArray4, 120, numArray6);
     SecP384R1Field.Multiply(numArray6, numArray4, numArray6);
     SecP384R1Field.SquareN(numArray6, 15, numArray6);
     SecP384R1Field.Multiply(numArray6, numArray5, numArray6);
     SecP384R1Field.SquareN(numArray6, 0x21, numArray6);
     SecP384R1Field.Multiply(numArray6, z, numArray6);
     SecP384R1Field.SquareN(numArray6, 0x40, numArray6);
     SecP384R1Field.Multiply(numArray6, x, numArray6);
     SecP384R1Field.SquareN(numArray6, 30, z);
     SecP384R1Field.Square(z, numArray3);
     return(!Nat.Eq(12, x, numArray3) ? null : new SecP384R1FieldElement(z));
 }
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);
        }
Esempio n. 8
0
    public static void Invert(uint[] p, uint[] x, uint[] z)
    {
        int num = p.Length;

        if (Nat.IsZero(num, x))
        {
            throw new ArgumentException("cannot be 0", "x");
        }
        if (Nat.IsOne(num, x))
        {
            Array.Copy(x, 0, z, 0, num);
            return;
        }
        uint[] array  = Nat.Copy(num, x);
        uint[] array2 = Nat.Create(num);
        array2[0] = 1u;
        int xc = 0;

        if ((array[0] & 1) == 0)
        {
            InversionStep(p, array, num, array2, ref xc);
        }
        if (Nat.IsOne(num, array))
        {
            InversionResult(p, xc, array2, z);
            return;
        }
        uint[] array3 = Nat.Copy(num, p);
        uint[] array4 = Nat.Create(num);
        int    xc2    = 0;
        int    num2   = num;

        while (true)
        {
            if (array[num2 - 1] == 0 && array3[num2 - 1] == 0)
            {
                num2--;
            }
            else if (Nat.Gte(num, array, array3))
            {
                Nat.SubFrom(num, array3, array);
                xc += Nat.SubFrom(num, array4, array2) - xc2;
                InversionStep(p, array, num2, array2, ref xc);
                if (Nat.IsOne(num, array))
                {
                    InversionResult(p, xc, array2, z);
                    return;
                }
            }
            else
            {
                Nat.SubFrom(num, array, array3);
                xc2 += Nat.SubFrom(num, array2, array4) - xc;
                InversionStep(p, array3, num2, array4, ref xc2);
                if (Nat.IsOne(num, array3))
                {
                    break;
                }
            }
        }
        InversionResult(p, xc2, array4, z);
    }