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(); } }
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); }
internal static EdwardsPoint Double(EdwardsPoint point) { return(point.ToProjective().Double().ToExtended()); }
public EdwardsPoint Add(EdwardsPoint other) { return(Add(other.ToProjectiveNiels()).ToExtended()); }
public static LookupTable From(EdwardsPoint ep) { return(new LookupTable(ep)); }
/// 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()); }
public RistrettoPoint(EdwardsPoint ep) { Ep = ep; }