public EdwardsPoint Mul(Scalar sclr)
        {
            var a = sclr.ToRadix16();
            var P = EdwardsPoint.Identity();

            for (var i = 0; i < 64; i++)
            {
                if (i % 2 == 1)
                {
                    var s1 = lt[i / 2].Select(a[i]);
                    var s2 = P.Add(s1);
                    var s3 = s2.ToExtended();

                    P = s3;
                }
            }

            P = P.MulByPow2(4);

            for (var i = 0; i < 64; i++)
            {
                if (i % 2 == 0)
                {
                    P = P.Add(lt[i / 2].Select(a[i])).ToExtended();
                }
            }

            return(P);
        }
 public LookupTable(EdwardsPoint ep)
 {
     _ep = ep;
     affineNielsPoints    = new AffineNielsPoint[8];
     affineNielsPoints[0] = ep.ToAffineNiels();
     for (var j = 0; j < 7; j++)
     {
         affineNielsPoints[j + 1] = ep.Add(affineNielsPoints[j]).ToExtended().ToAffineNiels();
     }
 }
예제 #3
0
        public bool Equals(EdwardsPoint a)
        {
            bool result = true;

            for (var i = 0; i < 5; i++)
            {
                result &= X._data[i] == a.X._data[i] &&
                          Y._data[i] == a.Y._data[i] &&
                          Z._data[i] == a.Z._data[i] &&
                          T._data[i] == a.T._data[i];
            }

            return(result);
        }
예제 #4
0
 internal static EdwardsPoint Double(EdwardsPoint point)
 {
     return(point.ToProjective().Double().ToExtended());
 }
예제 #5
0
 public EdwardsPoint Add(EdwardsPoint other)
 {
     return(Add(other.ToProjectiveNiels()).ToExtended());
 }
 public static LookupTable From(EdwardsPoint ep)
 {
     return(new LookupTable(ep));
 }
예제 #7
0
        /// Compute \\(aA + bB\\) in variable time, where \\(B\\) is the
        /// Ristretto basepoint.
        public static EdwardsPoint VartimeDoubleScalarMulBasepoint(Scalar a, EdwardsPoint A, Scalar b)
        {
            var aNaf = a.NonAdjacentForm(5);
            var bNaf = b.NonAdjacentForm(8);
            int i    = 0;

            /// Find starting index
            for (var ind = 255; ind >= 0; ind--)
            {
                i = ind;
                if (aNaf[i] != 0 || bNaf[i] != 0)
                {
                    break;
                }
            }

            var tableA = NafLookupTable.FromEdwardsPoint(A);
            var tableB = Consts.AFFINE_ODD_MULTIPLES_OF_BASEPOINT;

            var r = ProjectivePoint.Identity();

            while (i >= 0)
            {
                var t = r.Double();

                if (aNaf[i] > 0)
                {
                    var t1 = t.ToExtended();
                    var i1 = Math.Abs((sbyte)(-1 * aNaf[i]) / 2);
                    var t2 = tableA.Pnp[i1];
                    t = t1.Add(t2);
                }
                else if (aNaf[i] < 0)
                {
                    var t1 = t.ToExtended();
                    var i1 = Math.Abs((sbyte)(-1 * aNaf[i]) / 2);
                    var t2 = tableA.Pnp[i1];
                    t = t1.Sub(t2);
                }

                if (bNaf[i] > 0)
                {
                    var t1 = t.ToExtended();
                    var i1 = Math.Abs((sbyte)(-1 * bNaf[i]) / 2);
                    var t2 = tableB.affineNielsPoints[i1];
                    t = t1.Add(t2);
                }
                else if (bNaf[i] < 0)
                {
                    var t1 = t.ToExtended();
                    var i1 = Math.Abs((sbyte)(-1 * bNaf[i]) / 2);
                    var t2 = tableB.affineNielsPoints[i1];
                    t = t1.Sub(t2);
                }

                r = t.ToProjective();

                i--;
            }

            return(r.ToExtended());
        }
예제 #8
0
 public RistrettoPoint(EdwardsPoint ep)
 {
     Ep = ep;
 }