예제 #1
0
파일: Tnaf.cs 프로젝트: wnf0000/NBitcoin
        /**
         * Does the precomputation for WTNAF multiplication.
         * @param p The <code>ECPoint</code> for which to do the precomputation.
         * @param a The parameter <code>a</code> of the elliptic curve.
         * @return The precomputation array for <code>p</code>.
         */
        public static F2mPoint[] GetPreComp(F2mPoint p, sbyte a)
        {
            F2mPoint[] pu;
            pu    = new F2mPoint[16];
            pu[1] = p;
            sbyte[][] alphaTnaf;
            if (a == 0)
            {
                alphaTnaf = Tnaf.Alpha0Tnaf;
            }
            else
            {
                // a == 1
                alphaTnaf = Tnaf.Alpha1Tnaf;
            }

            int precompLen = alphaTnaf.Length;

            for (int i = 3; i < precompLen; i = i + 2)
            {
                pu[i] = Tnaf.MultiplyFromTnaf(p, alphaTnaf[i]);
            }

            return(pu);
        }
        /**
         * Does the precomputation for WTNAF multiplication.
         * @param p The <code>ECPoint</code> for which to do the precomputation.
         * @param a The parameter <code>a</code> of the elliptic curve.
         * @return The precomputation array for <code>p</code>.
         */
        public static AbstractF2mPoint[] GetPreComp(AbstractF2mPoint p, sbyte a)
        {
            sbyte[][] alphaTnaf = (a == 0) ? Tnaf.Alpha0Tnaf : Tnaf.Alpha1Tnaf;

            AbstractF2mPoint[] pu = new AbstractF2mPoint[(uint)(alphaTnaf.Length + 1) >> 1];
            pu[0] = p;

            uint precompLen = (uint)alphaTnaf.Length;

            for (uint i = 3; i < precompLen; i += 2)
            {
                pu[i >> 1] = Tnaf.MultiplyFromTnaf(p, alphaTnaf[i]);
            }

            p.Curve.NormalizeAll(pu);

            return(pu);
        }