GenerateCompactNaf() public static method

public static GenerateCompactNaf ( BigInteger k ) : int[]
k BigInteger
return int[]
Esempio n. 1
0
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            ECCurve curveOrig = p.Curve;

            ECCurve curveAdd    = ConfigureCurve(curveOrig, additionCoord);
            ECCurve curveDouble = ConfigureCurve(curveOrig, doublingCoord);

            int[] naf = WNafUtilities.GenerateCompactNaf(k);

            ECPoint Ra = curveAdd.Infinity;
            ECPoint Td = curveDouble.ImportPoint(p);

            int zeroes = 0;

            for (int i = 0; i < naf.Length; ++i)
            {
                int ni    = naf[i];
                int digit = ni >> 16;
                zeroes += ni & 0xFFFF;

                Td = Td.TimesPow2(zeroes);

                ECPoint Tj = curveAdd.ImportPoint(Td);
                if (digit < 0)
                {
                    Tj = Tj.Negate();
                }

                Ra = Ra.Add(Tj);

                zeroes = 1;
            }

            return(curveOrig.ImportPoint(Ra));
        }
Esempio n. 2
0
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            ECCurve curve    = p.Curve;
            ECCurve eCCurve  = ConfigureCurve(curve, additionCoord);
            ECCurve eCCurve2 = ConfigureCurve(curve, doublingCoord);

            int[]   array    = WNafUtilities.GenerateCompactNaf(k);
            ECPoint eCPoint  = eCCurve.Infinity;
            ECPoint eCPoint2 = eCCurve2.ImportPoint(p);
            int     num      = 0;

            foreach (int num2 in array)
            {
                int num3 = num2 >> 16;
                num     += num2 & 0xFFFF;
                eCPoint2 = eCPoint2.TimesPow2(num);
                ECPoint eCPoint3 = eCCurve.ImportPoint(eCPoint2);
                if (num3 < 0)
                {
                    eCPoint3 = eCPoint3.Negate();
                }
                eCPoint = eCPoint.Add(eCPoint3);
                num     = 1;
            }
            return(curve.ImportPoint(eCPoint));
        }
Esempio n. 3
0
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            ECCurve curve    = p.Curve;
            ECCurve eCCurve  = this.ConfigureCurve(curve, this.additionCoord);
            ECCurve eCCurve2 = this.ConfigureCurve(curve, this.doublingCoord);

            int[]   array    = WNafUtilities.GenerateCompactNaf(k);
            ECPoint eCPoint  = eCCurve.Infinity;
            ECPoint eCPoint2 = eCCurve2.ImportPoint(p);
            int     num      = 0;

            for (int i = 0; i < array.Length; i++)
            {
                int num2 = array[i];
                int num3 = num2 >> 16;
                num     += (num2 & 65535);
                eCPoint2 = eCPoint2.TimesPow2(num);
                ECPoint eCPoint3 = eCCurve.ImportPoint(eCPoint2);
                if (num3 < 0)
                {
                    eCPoint3 = eCPoint3.Negate();
                }
                eCPoint = eCPoint.Add(eCPoint3);
                num     = 1;
            }
            return(curve.ImportPoint(eCPoint));
        }
Esempio n. 4
0
        public static int[] GenerateCompactWindowNaf(int width, BigInteger k)
        {
            if (width == 2)
            {
                return(WNafUtilities.GenerateCompactNaf(k));
            }
            if (width < 2 || width > 16)
            {
                throw new ArgumentException("must be in the range [2, 16]", "width");
            }
            if (k.BitLength >> 16 != 0)
            {
                throw new ArgumentException("must have bitlength < 2^16", "k");
            }
            if (k.SignValue == 0)
            {
                return(WNafUtilities.EMPTY_INTS);
            }
            int[] array = new int[k.BitLength / width + 1];
            int   num   = 1 << width;
            int   num2  = num - 1;
            int   num3  = num >> 1;
            bool  flag  = false;
            int   num4  = 0;
            int   i     = 0;

            while (i <= k.BitLength)
            {
                if (k.TestBit(i) == flag)
                {
                    i++;
                }
                else
                {
                    k = k.ShiftRight(i);
                    int num5 = k.IntValue & num2;
                    if (flag)
                    {
                        num5++;
                    }
                    flag = ((num5 & num3) != 0);
                    if (flag)
                    {
                        num5 -= num;
                    }
                    int num6 = (num4 > 0) ? (i - 1) : i;
                    array[num4++] = (num5 << 16 | num6);
                    i             = width;
                }
            }
            if (array.Length > num4)
            {
                array = WNafUtilities.Trim(array, num4);
            }
            return(array);
        }
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            int[]   array    = WNafUtilities.GenerateCompactNaf(k);
            ECPoint eCPoint  = p.Normalize();
            ECPoint eCPoint2 = eCPoint.Negate();
            ECPoint eCPoint3 = p.Curve.Infinity;
            int     num      = array.Length;

            while (--num >= 0)
            {
                int num2 = array[num];
                int num3 = num2 >> 16;
                int e    = num2 & 65535;
                eCPoint3 = eCPoint3.TwicePlus((num3 < 0) ? eCPoint2 : eCPoint);
                eCPoint3 = eCPoint3.TimesPow2(e);
            }
            return(eCPoint3);
        }
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            int[]   array    = WNafUtilities.GenerateCompactNaf(k);
            ECPoint eCPoint  = p.Curve.Infinity;
            ECPoint eCPoint2 = p;
            int     num      = 0;

            for (int i = 0; i < array.Length; i++)
            {
                int num2 = array[i];
                int num3 = num2 >> 16;
                num     += (num2 & 65535);
                eCPoint2 = eCPoint2.TimesPow2(num);
                eCPoint  = eCPoint.Add((num3 < 0) ? eCPoint2.Negate() : eCPoint2);
                num      = 1;
            }
            return(eCPoint);
        }
Esempio n. 7
0
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            int[] naf = WNafUtilities.GenerateCompactNaf(k);

            ECPoint addP = p.Normalize(), subP = addP.Negate();

            ECPoint R = p.Curve.Infinity;

            int i = naf.Length;

            while (--i >= 0)
            {
                int ni = naf[i];
                int digit = ni >> 16, zeroes = ni & 0xFFFF;

                R = R.TwicePlus(digit < 0 ? subP : addP);
                R = R.TimesPow2(zeroes);
            }

            return(R);
        }
Esempio n. 8
0
        protected override ECPoint MultiplyPositive(ECPoint p, BigInteger k)
        {
            int[] naf = WNafUtilities.GenerateCompactNaf(k);

            ECPoint R0 = p.Curve.Infinity, R1 = p;

            int zeroes = 0;

            for (int i = 0; i < naf.Length; ++i)
            {
                int ni    = naf[i];
                int digit = ni >> 16;
                zeroes += ni & 0xFFFF;

                R1 = R1.TimesPow2(zeroes);
                R0 = R0.Add(digit < 0 ? R1.Negate() : R1);

                zeroes = 1;
            }

            return(R0);
        }