Пример #1
0
        public static bool secp256k1_ge_set_xquad(Ge r, Fe x)
        {
            r.X = x.Clone();
            var fe1 = new Fe();

            Field.Sqr(fe1, x);
            var fe2 = new Fe();

            Field.Mul(fe2, x, fe1);
            r.Infinity = false;
            var fe3 = new Fe();

            Field.SetInt(fe3, 7U);
            Field.Add(fe3, fe2);
            return(Field.Sqrt(r.Y, fe3));
        }
Пример #2
0
 public static void secp256k1_gej_double_var(GeJ r, GeJ a, Fe rzr)
 {
     r.Infinity = a.Infinity;
     if (r.Infinity)
     {
         if (rzr == null)
         {
             return;
         }
         Field.SetInt(rzr, 1U);
     }
     else
     {
         if (rzr != null)
         {
             rzr = a.Y.Clone();
             Field.NormalizeWeak(rzr);
             Field.MulInt(rzr, 2U);
         }
         Field.Mul(r.Z, a.Z, a.Y);
         Field.MulInt(r.Z, 2U);
         var fe1 = new Fe();
         Field.Sqr(fe1, a.X);
         Field.MulInt(fe1, 3U);
         var fe2 = new Fe();
         Field.Sqr(fe2, fe1);
         var fe3 = new Fe();
         Field.Sqr(fe3, a.Y);
         Field.MulInt(fe3, 2U);
         var fe4 = new Fe();
         Field.Sqr(fe4, fe3);
         Field.MulInt(fe4, 2U);
         Field.Mul(fe3, fe3, a.X);
         r.X = fe3.Clone();
         Field.MulInt(r.X, 4U);
         Field.Negate(r.X, r.X, 4U);
         Field.Add(r.X, fe2);
         Field.Negate(fe2, fe2, 1U);
         Field.MulInt(fe3, 6U);
         Field.Add(fe3, fe2);
         Field.Mul(r.Y, fe1, fe3);
         Field.Negate(fe2, fe4, 2U);
         Field.Add(r.Y, fe2);
     }
 }
Пример #3
0
 public static void secp256k1_gej_add_ge_var(GeJ r, GeJ a, Ge b, Fe rzr)
 {
     if (a.Infinity)
     {
         Group.secp256k1_gej_set_ge(r, b);
     }
     else if (b.Infinity)
     {
         if (rzr != null)
         {
             Field.SetInt(rzr, 1U);
         }
         r = a.Clone();
     }
     else
     {
         r.Infinity = false;
         var fe1 = new Fe();
         Field.Sqr(fe1, a.Z);
         var fe2 = a.X.Clone();
         Field.NormalizeWeak(fe2);
         var fe3 = new Fe();
         Field.Mul(fe3, b.X, fe1);
         var fe4 = a.Y.Clone();
         Field.NormalizeWeak(fe4);
         var fe5 = new Fe();
         Field.Mul(fe5, b.Y, fe1);
         Field.Mul(fe5, fe5, a.Z);
         var fe6 = new Fe();
         Field.Negate(fe6, fe2, 1U);
         Field.Add(fe6, fe3);
         var fe7 = new Fe();
         Field.Negate(fe7, fe4, 1U);
         Field.Add(fe7, fe5);
         if (Field.NormalizesToZeroVar(fe6))
         {
             if (Field.NormalizesToZeroVar(fe7))
             {
                 Group.secp256k1_gej_double_var(r, a, rzr);
             }
             else
             {
                 if (rzr != null)
                 {
                     Field.SetInt(rzr, 0U);
                 }
                 r.Infinity = true;
             }
         }
         else
         {
             var fe8 = new Fe();
             Field.Sqr(fe8, fe7);
             var fe9 = new Fe();
             Field.Sqr(fe9, fe6);
             var fe10 = new Fe();
             Field.Mul(fe10, fe6, fe9);
             if (rzr != null)
             {
                 rzr = fe6.Clone();
             }
             Field.Mul(r.Z, a.Z, fe6);
             var fe11 = new Fe();
             Field.Mul(fe11, fe2, fe9);
             r.X = fe11.Clone();
             Field.MulInt(r.X, 2U);
             Field.Add(r.X, fe10);
             Field.Negate(r.X, r.X, 3U);
             Field.Add(r.X, fe8);
             Field.Negate(r.Y, r.X, 5U);
             Field.Add(r.Y, fe11);
             Field.Mul(r.Y, r.Y, fe7);
             Field.Mul(fe10, fe10, fe4);
             Field.Negate(fe10, fe10, 1U);
             Field.Add(r.Y, fe10);
         }
     }
 }