public static PointEdwardsExtended Double(PointEdwardsExtended P)//4M + 4S + 1*a + 6add + 1*2
        {
            BigInteger A = P.x * P.x;
            BigInteger B = P.y * P.y;
            BigInteger C = 2 * P.z * P.z;
            BigInteger D = P.E.a * A;
            BigInteger W = P.x + P.y;
            BigInteger E = W * W - A - B;
            BigInteger G = D + B;
            BigInteger F = G - C;
            BigInteger H = D - B;
            BigInteger x = (E * F) % P.E.n;
            BigInteger y = (G * H) % P.E.n;
            BigInteger t = (E * H) % P.E.n;
            BigInteger z = (F * G) % P.E.n;

            return(new PointEdwardsExtended(x, y, z, t, P.E));
        }
        public static PointEdwardsExtended operator *(BigInteger k, PointEdwardsExtended P)
        {
            var R = new PointEdwardsExtended(0, 1, P.E);

            if (P.IsInfinite())
            {
                return(R);
            }
            while (k > 0)
            {
                if (k % 2 == 1)
                {
                    R += P;
                }
                k /= 2;
                P  = Double(P);
            }
            return(R);
        }
Beispiel #3
0
        }//inverted

        public static BigInteger GetFactorExtended(BigInteger n, int B1, int B2, TorsionType type)
        {
            BigInteger x, y;
            var        E = GenerateCurve(n, out x, out y, type);
            var        P = new PointEdwardsExtended(x, y, E);

            //STEP 1
            var P1     = P as IPoint;
            var result = StageOneEdwardsProjective(ref P1, n, B1);

            if (result > 1 || result == 0)
            {
                return(result);
            }

            //STEP 2
            result = StageTwoEdwardsProjective(ref P1, n, B1, B2);

            return(result);
        }//extended
        public static PointEdwardsExtended Tripple(PointEdwardsExtended P)//4M + 4S + 1*a + 6add + 1*2
        {
            BigInteger YY  = P.y * P.y;
            BigInteger aXX = P.E.a * P.x * P.y;
            BigInteger Ap  = YY + aXX;
            BigInteger B   = 2 * (2 * P.z * P.z - Ap);
            BigInteger xB  = aXX * B;
            BigInteger yB  = YY * B;
            BigInteger AA  = Ap * (YY - aXX);
            BigInteger F   = AA - yB;
            BigInteger G   = AA + xB;
            BigInteger xE  = P.x * (yB + AA);
            BigInteger yH  = P.y * (xB - AA);
            BigInteger zF  = P.z * F;
            BigInteger zG  = P.z * G;
            BigInteger x   = (xE * zF) % P.E.n;
            BigInteger y   = (yH * zG) % P.E.n;
            BigInteger z   = (zF * zG) % P.E.n;
            BigInteger t   = (xE * yH) % P.E.n;

            return(new PointEdwardsExtended(x, y, z, t, P.E));
        }