Exemplo n.º 1
0
        internal static ECPoint ImplSumOfMultiplies(ECEndomorphism endomorphism, ECPoint[] ps, BigInteger[] ks)
        {
            int halfCount = ps.Length, fullCount = halfCount << 1;

            bool[]            negs  = new bool[fullCount];
            WNafPreCompInfo[] infos = new WNafPreCompInfo[fullCount];
            byte[][]          wnafs = new byte[fullCount][];

            ECPointMap pointMap = endomorphism.PointMap;

            for (int i = 0; i < halfCount; ++i)
            {
                int j0 = i << 1, j1 = j0 + 1;

                BigInteger kj0 = ks[j0]; negs[j0] = kj0.SignValue < 0; kj0 = kj0.Abs();
                BigInteger kj1 = ks[j1]; negs[j1] = kj1.SignValue < 0; kj1 = kj1.Abs();

                int minWidth = WNafUtilities.GetWindowSize(System.Math.Max(kj0.BitLength, kj1.BitLength), 8);

                ECPoint         P     = ps[i];
                WNafPreCompInfo infoP = WNafUtilities.Precompute(P, minWidth, true);
                ECPoint         Q     = EndoUtilities.MapPoint(endomorphism, P);
                WNafPreCompInfo infoQ = WNafUtilities.PrecomputeWithPointMap(Q, pointMap, infoP, true);

                int widthP = System.Math.Min(8, infoP.Width);
                int widthQ = System.Math.Min(8, infoQ.Width);

                infos[j0] = infoP;
                infos[j1] = infoQ;
                wnafs[j0] = WNafUtilities.GenerateWindowNaf(widthP, kj0);
                wnafs[j1] = WNafUtilities.GenerateWindowNaf(widthQ, kj1);
            }

            return(ImplSumOfMultiplies(negs, infos, wnafs));
        }
Exemplo n.º 2
0
        internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, ECPointMap pointMap, BigInteger[] ks)
        {
            int halfCount = ps.Length, fullCount = halfCount << 1;

            bool[]            negs  = new bool[fullCount];
            WNafPreCompInfo[] infos = new WNafPreCompInfo[fullCount];
            byte[][]          wnafs = new byte[fullCount][];

            for (int i = 0; i < halfCount; ++i)
            {
                int j0 = i << 1, j1 = j0 + 1;

                BigInteger kj0 = ks[j0]; negs[j0] = kj0.SignValue < 0; kj0 = kj0.Abs();
                BigInteger kj1 = ks[j1]; negs[j1] = kj1.SignValue < 0; kj1 = kj1.Abs();

                int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(System.Math.Max(kj0.BitLength, kj1.BitLength))));

                ECPoint P = ps[i], Q = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMap);
                infos[j0] = WNafUtilities.GetWNafPreCompInfo(P);
                infos[j1] = WNafUtilities.GetWNafPreCompInfo(Q);
                wnafs[j0] = WNafUtilities.GenerateWindowNaf(width, kj0);
                wnafs[j1] = WNafUtilities.GenerateWindowNaf(width, kj1);
            }

            return(ImplSumOfMultiplies(negs, infos, wnafs));
        }
Exemplo n.º 3
0
        internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, ECPointMap pointMap, BigInteger[] ks)
        {
            int length = ps.Length;
            int num2   = length << 1;

            bool[]            negs  = new bool[num2];
            WNafPreCompInfo[] infos = new WNafPreCompInfo[num2];
            byte[][]          wnafs = new byte[num2][];
            for (int i = 0; i < length; i++)
            {
                int        index = i << 1;
                int        num5  = index + 1;
                BigInteger k     = ks[index];
                negs[index] = k.SignValue < 0;
                k           = k.Abs();
                BigInteger integer2 = ks[num5];
                negs[num5] = integer2.SignValue < 0;
                integer2   = integer2.Abs();
                int     width  = Math.Max(2, Math.Min(0x10, WNafUtilities.GetWindowSize(Math.Max(k.BitLength, integer2.BitLength))));
                ECPoint p      = ps[i];
                ECPoint point2 = WNafUtilities.MapPointWithPrecomp(p, width, true, pointMap);
                infos[index] = WNafUtilities.GetWNafPreCompInfo(p);
                infos[num5]  = WNafUtilities.GetWNafPreCompInfo(point2);
                wnafs[index] = WNafUtilities.GenerateWindowNaf(width, k);
                wnafs[num5]  = WNafUtilities.GenerateWindowNaf(width, integer2);
            }
            return(ImplSumOfMultiplies(negs, infos, wnafs));
        }
Exemplo n.º 4
0
    internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, ECPointMap pointMap, BigInteger[] ks)
    {
        int num  = ps.Length;
        int num2 = num << 1;

        bool[]            array  = new bool[num2];
        WNafPreCompInfo[] array2 = new WNafPreCompInfo[num2];
        byte[][]          array3 = new byte[num2][];
        for (int i = 0; i < num; i++)
        {
            int        num3       = i << 1;
            int        num4       = num3 + 1;
            BigInteger bigInteger = ks[num3];
            array[num3] = (bigInteger.SignValue < 0);
            bigInteger  = bigInteger.Abs();
            BigInteger bigInteger2 = ks[num4];
            array[num4] = (bigInteger2.SignValue < 0);
            bigInteger2 = bigInteger2.Abs();
            int     width = Math.Max(2, Math.Min(16, WNafUtilities.GetWindowSize(Math.Max(bigInteger.BitLength, bigInteger2.BitLength))));
            ECPoint p     = ps[i];
            ECPoint p2    = WNafUtilities.MapPointWithPrecomp(p, width, includeNegated: true, pointMap);
            array2[num3] = WNafUtilities.GetWNafPreCompInfo(p);
            array2[num4] = WNafUtilities.GetWNafPreCompInfo(p2);
            array3[num3] = WNafUtilities.GenerateWindowNaf(width, bigInteger);
            array3[num4] = WNafUtilities.GenerateWindowNaf(width, bigInteger2);
        }
        return(ImplSumOfMultiplies(array, array2, array3));
    }
Exemplo n.º 5
0
        internal static ECPoint ImplShamirsTrickWNaf(ECEndomorphism endomorphism, ECPoint P, BigInteger k, BigInteger l)
        {
            bool negK = k.SignValue < 0, negL = l.SignValue < 0;

            k = k.Abs();
            l = l.Abs();

            int minWidth = WNafUtilities.GetWindowSize(System.Math.Max(k.BitLength, l.BitLength), 8);

            WNafPreCompInfo infoP = WNafUtilities.Precompute(P, minWidth, true);
            ECPoint         Q     = EndoUtilities.MapPoint(endomorphism, P);
            WNafPreCompInfo infoQ = WNafUtilities.PrecomputeWithPointMap(Q, endomorphism.PointMap, infoP, true);

            int widthP = System.Math.Min(8, infoP.Width);
            int widthQ = System.Math.Min(8, infoQ.Width);

            ECPoint[] preCompP    = negK ? infoP.PreCompNeg : infoP.PreComp;
            ECPoint[] preCompQ    = negL ? infoQ.PreCompNeg : infoQ.PreComp;
            ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg;
            ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg;

            byte[] wnafP = WNafUtilities.GenerateWindowNaf(widthP, k);
            byte[] wnafQ = WNafUtilities.GenerateWindowNaf(widthQ, l);

            return(ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ));
        }
Exemplo n.º 6
0
        internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, BigInteger[] ks)
        {
            int length = ps.Length;

            bool[]            negs  = new bool[length];
            WNafPreCompInfo[] infos = new WNafPreCompInfo[length];
            byte[][]          wnafs = new byte[length][];
            for (int i = 0; i < length; i++)
            {
                BigInteger k = ks[i];
                negs[i] = k.SignValue < 0;
                k       = k.Abs();
                int width = Math.Max(2, Math.Min(0x10, WNafUtilities.GetWindowSize(k.BitLength)));
                infos[i] = WNafUtilities.Precompute(ps[i], width, true);
                wnafs[i] = WNafUtilities.GenerateWindowNaf(width, k);
            }
            return(ImplSumOfMultiplies(negs, infos, wnafs));
        }
Exemplo n.º 7
0
    internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, BigInteger[] ks)
    {
        int num = ps.Length;

        bool[]            array  = new bool[num];
        WNafPreCompInfo[] array2 = new WNafPreCompInfo[num];
        byte[][]          array3 = new byte[num][];
        for (int i = 0; i < num; i++)
        {
            BigInteger bigInteger = ks[i];
            array[i]   = (bigInteger.SignValue < 0);
            bigInteger = bigInteger.Abs();
            int width = Math.Max(2, Math.Min(16, WNafUtilities.GetWindowSize(bigInteger.BitLength)));
            array2[i] = WNafUtilities.Precompute(ps[i], width, includeNegated: true);
            array3[i] = WNafUtilities.GenerateWindowNaf(width, bigInteger);
        }
        return(ImplSumOfMultiplies(array, array2, array3));
    }
Exemplo n.º 8
0
        internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, BigInteger[] ks)
        {
            int count = ps.Length;

            bool[]            negs  = new bool[count];
            WNafPreCompInfo[] infos = new WNafPreCompInfo[count];
            byte[][]          wnafs = new byte[count][];

            for (int i = 0; i < count; ++i)
            {
                BigInteger ki = ks[i]; negs[i] = ki.SignValue < 0; ki = ki.Abs();

                int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(ki.BitLength)));
                infos[i] = WNafUtilities.Precompute(ps[i], width, true);
                wnafs[i] = WNafUtilities.GenerateWindowNaf(width, ki);
            }

            return(ImplSumOfMultiplies(negs, infos, wnafs));
        }
Exemplo n.º 9
0
        internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, ECPointMap pointMapQ, BigInteger l)
        {
            bool flag  = k.SignValue < 0;
            bool flag2 = l.SignValue < 0;

            k = k.Abs();
            l = l.Abs();
            int             width           = Math.Max(2, Math.Min(0x10, WNafUtilities.GetWindowSize(Math.Max(k.BitLength, l.BitLength))));
            ECPoint         p               = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMapQ);
            WNafPreCompInfo wNafPreCompInfo = WNafUtilities.GetWNafPreCompInfo(P);
            WNafPreCompInfo info2           = WNafUtilities.GetWNafPreCompInfo(p);

            ECPoint[] preCompP    = !flag ? wNafPreCompInfo.PreComp : wNafPreCompInfo.PreCompNeg;
            ECPoint[] preCompQ    = !flag2 ? info2.PreComp : info2.PreCompNeg;
            ECPoint[] preCompNegP = !flag ? wNafPreCompInfo.PreCompNeg : wNafPreCompInfo.PreComp;
            ECPoint[] preCompNegQ = !flag2 ? info2.PreCompNeg : info2.PreComp;
            byte[]    wnafP       = WNafUtilities.GenerateWindowNaf(width, k);
            byte[]    wnafQ       = WNafUtilities.GenerateWindowNaf(width, l);
            return(ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ));
        }
Exemplo n.º 10
0
    internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, ECPoint Q, BigInteger l)
    {
        bool flag  = k.SignValue < 0;
        bool flag2 = l.SignValue < 0;

        k = k.Abs();
        l = l.Abs();
        int             width            = Math.Max(2, Math.Min(16, WNafUtilities.GetWindowSize(k.BitLength)));
        int             width2           = Math.Max(2, Math.Min(16, WNafUtilities.GetWindowSize(l.BitLength)));
        WNafPreCompInfo wNafPreCompInfo  = WNafUtilities.Precompute(P, width, includeNegated: true);
        WNafPreCompInfo wNafPreCompInfo2 = WNafUtilities.Precompute(Q, width2, includeNegated: true);

        ECPoint[] preCompP    = flag ? wNafPreCompInfo.PreCompNeg : wNafPreCompInfo.PreComp;
        ECPoint[] preCompQ    = flag2 ? wNafPreCompInfo2.PreCompNeg : wNafPreCompInfo2.PreComp;
        ECPoint[] preCompNegP = flag ? wNafPreCompInfo.PreComp : wNafPreCompInfo.PreCompNeg;
        ECPoint[] preCompNegQ = flag2 ? wNafPreCompInfo2.PreComp : wNafPreCompInfo2.PreCompNeg;
        byte[]    wnafP       = WNafUtilities.GenerateWindowNaf(width, k);
        byte[]    wnafQ       = WNafUtilities.GenerateWindowNaf(width2, l);
        return(ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ));
    }
Exemplo n.º 11
0
        internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k,
                                                     ECPoint Q, BigInteger l)
        {
            bool negK = k.SignValue < 0, negL = l.SignValue < 0;

            BigInteger kAbs = k.Abs(), lAbs = l.Abs();

            int minWidthP = WNafUtilities.GetWindowSize(kAbs.BitLength, 8);
            int minWidthQ = WNafUtilities.GetWindowSize(lAbs.BitLength, 8);

            WNafPreCompInfo infoP = WNafUtilities.Precompute(P, minWidthP, true);
            WNafPreCompInfo infoQ = WNafUtilities.Precompute(Q, minWidthQ, true);

            // When P, Q are 'promoted' (i.e. reused several times), switch to fixed-point algorithm
            {
                ECCurve c        = P.Curve;
                int     combSize = FixedPointUtilities.GetCombSize(c);
                if (!negK && !negL &&
                    k.BitLength <= combSize && l.BitLength <= combSize &&
                    infoP.IsPromoted && infoQ.IsPromoted)
                {
                    return(ImplShamirsTrickFixedPoint(P, k, Q, l));
                }
            }

            int widthP = System.Math.Min(8, infoP.Width);
            int widthQ = System.Math.Min(8, infoQ.Width);

            ECPoint[] preCompP    = negK ? infoP.PreCompNeg : infoP.PreComp;
            ECPoint[] preCompQ    = negL ? infoQ.PreCompNeg : infoQ.PreComp;
            ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg;
            ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg;

            byte[] wnafP = WNafUtilities.GenerateWindowNaf(widthP, kAbs);
            byte[] wnafQ = WNafUtilities.GenerateWindowNaf(widthQ, lAbs);

            return(ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ));
        }
Exemplo n.º 12
0
        internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, ECPointMap pointMapQ, BigInteger l)
        {
            bool negK = k.SignValue < 0, negL = l.SignValue < 0;

            k = k.Abs();
            l = l.Abs();

            int width = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(System.Math.Max(k.BitLength, l.BitLength))));

            ECPoint         Q     = WNafUtilities.MapPointWithPrecomp(P, width, true, pointMapQ);
            WNafPreCompInfo infoP = WNafUtilities.GetWNafPreCompInfo(P);
            WNafPreCompInfo infoQ = WNafUtilities.GetWNafPreCompInfo(Q);

            ECPoint[] preCompP    = negK ? infoP.PreCompNeg : infoP.PreComp;
            ECPoint[] preCompQ    = negL ? infoQ.PreCompNeg : infoQ.PreComp;
            ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg;
            ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg;

            byte[] wnafP = WNafUtilities.GenerateWindowNaf(width, k);
            byte[] wnafQ = WNafUtilities.GenerateWindowNaf(width, l);

            return(ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ));
        }
Exemplo n.º 13
0
        public static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k,
                                                   ECPoint Q, BigInteger l)
        {
            bool negK = k.SignValue < 0, negL = l.SignValue < 0;

            k = k.Abs();
            l = l.Abs();

            int widthP = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(k.BitLength)));
            int widthQ = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(l.BitLength)));

            WNafPreCompInfo infoP = WNafUtilities.Precompute(P, widthP, true);
            WNafPreCompInfo infoQ = WNafUtilities.Precompute(Q, widthQ, true);

            ECPoint[] preCompP    = negK ? infoP.PreCompNeg : infoP.PreComp;
            ECPoint[] preCompQ    = negL ? infoQ.PreCompNeg : infoQ.PreComp;
            ECPoint[] preCompNegP = negK ? infoP.PreComp : infoP.PreCompNeg;
            ECPoint[] preCompNegQ = negL ? infoQ.PreComp : infoQ.PreCompNeg;

            byte[] wnafP = WNafUtilities.GenerateWindowNaf(widthP, k);
            byte[] wnafQ = WNafUtilities.GenerateWindowNaf(widthQ, l);

            return(ImplShamirsTrickWNaf(preCompP, preCompNegP, wnafP, preCompQ, preCompNegQ, wnafQ));
        }
Exemplo n.º 14
0
        internal static ECPoint ImplSumOfMultiplies(ECPoint[] ps, BigInteger[] ks)
        {
            int count = ps.Length;

            int[]             widths = new int[count];
            WNafPreCompInfo[] infos  = new WNafPreCompInfo[count];
            byte[][]          wnafs  = new byte[count][];

            int len = 0;

            for (int i = 0; i < count; ++i)
            {
                widths[i] = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(ks[i].BitLength)));
                infos[i]  = WNafUtilities.Precompute(ps[i], widths[i], true);
                wnafs[i]  = WNafUtilities.GenerateWindowNaf(widths[i], ks[i]);
                len       = System.Math.Max(len, wnafs[i].Length);
            }

            ECCurve curve    = ps[0].Curve;
            ECPoint infinity = curve.Infinity;

            ECPoint R      = infinity;
            int     zeroes = 0;

            for (int i = len - 1; i >= 0; --i)
            {
                ECPoint r = infinity;

                for (int j = 0; j < count; ++j)
                {
                    byte[] wnaf = wnafs[j];
                    int    wi   = i < wnaf.Length ? (int)(sbyte)wnaf[i] : 0;
                    if (wi != 0)
                    {
                        int             n     = System.Math.Abs(wi);
                        WNafPreCompInfo info  = infos[j];
                        ECPoint[]       table = wi < 0 ? info.PreCompNeg : info.PreComp;
                        r = r.Add(table[n >> 1]);
                    }
                }

                if (r == infinity)
                {
                    ++zeroes;
                    continue;
                }

                if (zeroes > 0)
                {
                    R      = R.TimesPow2(zeroes);
                    zeroes = 0;
                }

                R = R.TwicePlus(r);
            }

            if (zeroes > 0)
            {
                R = R.TimesPow2(zeroes);
            }

            return(R);
        }
Exemplo n.º 15
0
        internal static ECPoint ImplShamirsTrickWNaf(ECPoint P, BigInteger k, ECPoint Q, BigInteger l)
        {
            int widthP = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(k.BitLength)));
            int widthQ = System.Math.Max(2, System.Math.Min(16, WNafUtilities.GetWindowSize(l.BitLength)));

            WNafPreCompInfo infoP = WNafUtilities.Precompute(P, widthP, true);
            WNafPreCompInfo infoQ = WNafUtilities.Precompute(Q, widthQ, true);

            ECPoint[] preCompP    = infoP.PreComp;
            ECPoint[] preCompQ    = infoQ.PreComp;
            ECPoint[] preCompNegP = infoP.PreCompNeg;
            ECPoint[] preCompNegQ = infoQ.PreCompNeg;

            byte[] wnafP = WNafUtilities.GenerateWindowNaf(widthP, k);
            byte[] wnafQ = WNafUtilities.GenerateWindowNaf(widthQ, l);

            int len = System.Math.Max(wnafP.Length, wnafQ.Length);

            ECCurve curve    = P.Curve;
            ECPoint infinity = curve.Infinity;

            ECPoint R      = infinity;
            int     zeroes = 0;

            for (int i = len - 1; i >= 0; --i)
            {
                int wiP = i < wnafP.Length ? (int)(sbyte)wnafP[i] : 0;
                int wiQ = i < wnafQ.Length ? (int)(sbyte)wnafQ[i] : 0;

                if ((wiP | wiQ) == 0)
                {
                    ++zeroes;
                    continue;
                }

                ECPoint r = infinity;
                if (wiP != 0)
                {
                    int       nP     = System.Math.Abs(wiP);
                    ECPoint[] tableP = wiP < 0 ? preCompNegP : preCompP;
                    r = r.Add(tableP[nP >> 1]);
                }
                if (wiQ != 0)
                {
                    int       nQ     = System.Math.Abs(wiQ);
                    ECPoint[] tableQ = wiQ < 0 ? preCompNegQ : preCompQ;
                    r = r.Add(tableQ[nQ >> 1]);
                }

                if (zeroes > 0)
                {
                    R      = R.TimesPow2(zeroes);
                    zeroes = 0;
                }

                R = R.TwicePlus(r);
            }

            if (zeroes > 0)
            {
                R = R.TimesPow2(zeroes);
            }

            return(R);
        }