/**
         * 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;
        }
Beispiel #2
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));
 }
 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));
 }