示例#1
0
文件: Tnaf.cs 项目: Lokad/BitcoinNet
        /**
         * Multiplies a {@link BitcoinNet.BouncyCastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
         * by an element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>
         * using the <code>&#964;</code>-adic NAF (TNAF) method, given the TNAF
         * of <code>&#955;</code>.
         * @param p The AbstractF2mPoint to Multiply.
         * @param u The the TNAF of <code>&#955;</code>..
         * @return <code>&#955; * p</code>
         */
        public static AbstractF2mPoint MultiplyFromTnaf(AbstractF2mPoint p, sbyte[] u)
        {
            ECCurve          curve = p.Curve;
            AbstractF2mPoint q     = (AbstractF2mPoint)curve.Infinity;
            AbstractF2mPoint pNeg  = (AbstractF2mPoint)p.Negate();
            int tauCount           = 0;

            for (int i = u.Length - 1; i >= 0; i--)
            {
                ++tauCount;
                sbyte ui = u[i];
                if (ui != 0)
                {
                    q        = q.TauPow(tauCount);
                    tauCount = 0;

                    ECPoint x = ui > 0 ? p : pNeg;
                    q = (AbstractF2mPoint)q.Add(x);
                }
            }
            if (tauCount > 0)
            {
                q = q.TauPow(tauCount);
            }
            return(q);
        }
示例#2
0
    public static AbstractF2mPoint MultiplyFromTnaf(AbstractF2mPoint p, sbyte[] u)
    {
        ECCurve          curve             = p.Curve;
        AbstractF2mPoint abstractF2mPoint  = (AbstractF2mPoint)curve.Infinity;
        AbstractF2mPoint abstractF2mPoint2 = (AbstractF2mPoint)p.Negate();
        int num = 0;

        for (int num2 = u.Length - 1; num2 >= 0; num2--)
        {
            num++;
            sbyte b = u[num2];
            if (b != 0)
            {
                abstractF2mPoint = abstractF2mPoint.TauPow(num);
                num = 0;
                ECPoint b2 = (b > 0) ? p : abstractF2mPoint2;
                abstractF2mPoint = (AbstractF2mPoint)abstractF2mPoint.Add(b2);
            }
        }
        if (num > 0)
        {
            abstractF2mPoint = abstractF2mPoint.TauPow(num);
        }
        return(abstractF2mPoint);
    }
示例#3
0
        public static AbstractF2mPoint MultiplyFromTnaf(AbstractF2mPoint p, sbyte[] u)
        {
            AbstractF2mPoint infinity = (AbstractF2mPoint)p.Curve.Infinity;
            AbstractF2mPoint point2   = (AbstractF2mPoint)p.Negate();
            int pow = 0;

            for (int i = u.Length - 1; i >= 0; i--)
            {
                pow++;
                sbyte num3 = u[i];
                if (num3 != 0)
                {
                    infinity = infinity.TauPow(pow);
                    pow      = 0;
                    ECPoint b = (num3 <= 0) ? point2 : p;
                    infinity = (AbstractF2mPoint)infinity.Add(b);
                }
            }
            if (pow > 0)
            {
                infinity = infinity.TauPow(pow);
            }
            return(infinity);
        }
示例#4
0
文件: Tnaf.cs 项目: crowar/NBitcoin
		/**
        * Multiplies a {@link NBitcoin.BouncyCastle.math.ec.AbstractF2mPoint AbstractF2mPoint}
        * by an element <code>&#955;</code> of <code><b>Z</b>[&#964;]</code>
        * using the <code>&#964;</code>-adic NAF (TNAF) method, given the TNAF
        * of <code>&#955;</code>.
        * @param p The AbstractF2mPoint to Multiply.
        * @param u The the TNAF of <code>&#955;</code>..
        * @return <code>&#955; * p</code>
        */
		public static AbstractF2mPoint MultiplyFromTnaf(AbstractF2mPoint p, sbyte[] u)
		{
			ECCurve curve = p.Curve;
			AbstractF2mPoint q = (AbstractF2mPoint)curve.Infinity;
			AbstractF2mPoint pNeg = (AbstractF2mPoint)p.Negate();
			int tauCount = 0;
			for(int i = u.Length - 1; i >= 0; i--)
			{
				++tauCount;
				sbyte ui = u[i];
				if(ui != 0)
				{
					q = q.TauPow(tauCount);
					tauCount = 0;

					ECPoint x = ui > 0 ? p : pNeg;
					q = (AbstractF2mPoint)q.Add(x);
				}
			}
			if(tauCount > 0)
			{
				q = q.TauPow(tauCount);
			}
			return q;
		}