private static void PointExtendXY(PointExt p) { X25519Field.One(p.z); X25519Field.Mul(p.x, p.y, p.t); }
public static void Precompute() { lock (precompLock) { if (precompBase != null) { return; } // Precomputed table for the base point in verification ladder { PointExt b = new PointExt(); X25519Field.Copy(B_x, 0, b.x, 0); X25519Field.Copy(B_y, 0, b.y, 0); PointExtendXY(b); precompBaseTable = PointPrecompVar(b, 1 << (WnafWidthBase - 2)); } PointAccum p = new PointAccum(); X25519Field.Copy(B_x, 0, p.x, 0); X25519Field.Copy(B_y, 0, p.y, 0); PointExtendXY(p); precompBase = new int[PrecompBlocks * PrecompPoints * 3 * X25519Field.Size]; int off = 0; for (int b = 0; b < PrecompBlocks; ++b) { PointExt[] ds = new PointExt[PrecompTeeth]; PointExt sum = new PointExt(); PointSetNeutral(sum); for (int t = 0; t < PrecompTeeth; ++t) { PointExt q = PointCopy(p); PointAddVar(true, sum, q, sum); PointDouble(p); ds[t] = PointCopy(p); if (b + t != PrecompBlocks + PrecompTeeth - 2) { for (int s = 1; s < PrecompSpacing; ++s) { PointDouble(p); } } } PointExt[] points = new PointExt[PrecompPoints]; int k = 0; points[k++] = sum; for (int t = 0; t < (PrecompTeeth - 1); ++t) { int size = 1 << t; for (int j = 0; j < size; ++j, ++k) { PointAddVar(false, points[k - size], ds[t], points[k] = new PointExt()); } } Debug.Assert(k == PrecompPoints); for (int i = 0; i < PrecompPoints; ++i) { PointExt q = points[i]; int[] x = X25519Field.Create(); int[] y = X25519Field.Create(); X25519Field.Add(q.z, q.z, x); // TODO[ed25519] Batch inversion X25519Field.Inv(x, y); X25519Field.Mul(q.x, y, x); X25519Field.Mul(q.y, y, y); PointPrecomp r = new PointPrecomp(); X25519Field.Apm(y, x, r.ypx_h, r.ymx_h); X25519Field.Mul(x, y, r.xyd); X25519Field.Mul(r.xyd, C_d4, r.xyd); X25519Field.Normalize(r.ypx_h); X25519Field.Normalize(r.ymx_h); //X25519Field.Normalize(r.xyd); X25519Field.Copy(r.ypx_h, 0, precompBase, off); off += X25519Field.Size; X25519Field.Copy(r.ymx_h, 0, precompBase, off); off += X25519Field.Size; X25519Field.Copy(r.xyd, 0, precompBase, off); off += X25519Field.Size; } } Debug.Assert(off == precompBase.Length); } }
private static void PointSetNeutral(PointExt p) { X448Field.Zero(p.x); X448Field.One(p.y); X448Field.One(p.z); }
public static void Precompute() { lock (precompLock) { if (precompBase != null) { return; } PointExt p = new PointExt(); X448Field.Copy(B_x, 0, p.x, 0); X448Field.Copy(B_y, 0, p.y, 0); PointExtendXY(p); precompBaseTable = PointPrecompVar(p, 1 << (WnafWidthBase - 2)); precompBase = new uint[PrecompBlocks * PrecompPoints * 2 * X448Field.Size]; int off = 0; for (int b = 0; b < PrecompBlocks; ++b) { PointExt[] ds = new PointExt[PrecompTeeth]; PointExt sum = new PointExt(); PointSetNeutral(sum); for (int t = 0; t < PrecompTeeth; ++t) { PointAddVar(true, p, sum); PointDouble(p); ds[t] = PointCopy(p); if (b + t != PrecompBlocks + PrecompTeeth - 2) { for (int s = 1; s < PrecompSpacing; ++s) { PointDouble(p); } } } PointExt[] points = new PointExt[PrecompPoints]; int k = 0; points[k++] = sum; for (int t = 0; t < (PrecompTeeth - 1); ++t) { int size = 1 << t; for (int j = 0; j < size; ++j, ++k) { points[k] = PointCopy(points[k - size]); PointAddVar(false, ds[t], points[k]); } } Debug.Assert(k == PrecompPoints); for (int i = 0; i < PrecompPoints; ++i) { PointExt q = points[i]; // TODO[ed448] Batch inversion X448Field.Inv(q.z, q.z); X448Field.Mul(q.x, q.z, q.x); X448Field.Mul(q.y, q.z, q.y); //X448Field.Normalize(q.x); //X448Field.Normalize(q.y); X448Field.Copy(q.x, 0, precompBase, off); off += X448Field.Size; X448Field.Copy(q.y, 0, precompBase, off); off += X448Field.Size; } } Debug.Assert(off == precompBase.Length); } }
private static void PointExtendXY(PointExt p) { X448Field.One(p.z); }
public static void Precompute() { lock (precompLock) { if (precompBase != null) { return; } // Precomputed table for the base point in verification ladder { PointExt b = new PointExt(); F.Copy(B_x, 0, b.x, 0); F.Copy(B_y, 0, b.y, 0); PointExtendXY(b); precompBaseTable = PointPrecomputeVar(b, 1 << (WnafWidthBase - 2)); } PointAccum p = new PointAccum(); F.Copy(B_x, 0, p.x, 0); F.Copy(B_y, 0, p.y, 0); PointExtendXY(p); precompBase = F.CreateTable(PrecompBlocks * PrecompPoints * 3); int off = 0; for (int b = 0; b < PrecompBlocks; ++b) { PointExt[] ds = new PointExt[PrecompTeeth]; PointExt sum = new PointExt(); PointSetNeutral(sum); for (int t = 0; t < PrecompTeeth; ++t) { PointExt q = PointCopy(p); PointAddVar(true, sum, q, sum); PointDouble(p); ds[t] = PointCopy(p); if (b + t != PrecompBlocks + PrecompTeeth - 2) { for (int s = 1; s < PrecompSpacing; ++s) { PointDouble(p); } } } PointExt[] points = new PointExt[PrecompPoints]; int k = 0; points[k++] = sum; for (int t = 0; t < (PrecompTeeth - 1); ++t) { int size = 1 << t; for (int j = 0; j < size; ++j, ++k) { PointAddVar(false, points[k - size], ds[t], points[k] = new PointExt()); } } Debug.Assert(k == PrecompPoints); int[] cs = F.CreateTable(PrecompPoints); // TODO[ed25519] A single batch inversion across all blocks? { int[] u = F.Create(); F.Copy(points[0].z, 0, u, 0); F.Copy(u, 0, cs, 0); int i = 0; while (++i < PrecompPoints) { F.Mul(u, points[i].z, u); F.Copy(u, 0, cs, i * F.Size); } F.Add(u, u, u); F.InvVar(u, u); --i; int[] t = F.Create(); while (i > 0) { int j = i--; F.Copy(cs, i * F.Size, t, 0); F.Mul(t, u, t); F.Copy(t, 0, cs, j * F.Size); F.Mul(u, points[j].z, u); } F.Copy(u, 0, cs, 0); } for (int i = 0; i < PrecompPoints; ++i) { PointExt q = points[i]; int[] x = F.Create(); int[] y = F.Create(); //F.Add(q.z, q.z, x); //F.InvVar(x, y); F.Copy(cs, i * F.Size, y, 0); F.Mul(q.x, y, x); F.Mul(q.y, y, y); PointPrecomp r = new PointPrecomp(); F.Apm(y, x, r.ypx_h, r.ymx_h); F.Mul(x, y, r.xyd); F.Mul(r.xyd, C_d4, r.xyd); F.Normalize(r.ypx_h); F.Normalize(r.ymx_h); //F.Normalize(r.xyd); F.Copy(r.ypx_h, 0, precompBase, off); off += F.Size; F.Copy(r.ymx_h, 0, precompBase, off); off += F.Size; F.Copy(r.xyd, 0, precompBase, off); off += F.Size; } } Debug.Assert(off == precompBase.Length); } }
private static void PointExtendXY(PointExt p) { F.One(p.z); F.Mul(p.x, p.y, p.t); }
private static void Precompute() { PointAccum p = new PointAccum(); X25519Field.Copy(B_x, 0, p.x, 0); X25519Field.Copy(B_y, 0, p.y, 0); PointExtendXY(p); precompBase = new int[PrecompBlocks * PrecompPoints * 3 * X25519Field.Size]; int off = 0; for (int b = 0; b < PrecompBlocks; ++b) { PointExt[] ds = new PointExt[PrecompTeeth]; PointExt sum = new PointExt(); PointSetNeutral(sum); for (int t = 0; t < PrecompTeeth; ++t) { PointExt q = PointCopy(p); PointAddVar(true, sum, q, sum); PointDouble(p); ds[t] = PointCopy(p); if (b + t != PrecompBlocks + PrecompTeeth - 2) { for (int s = 1; s < PrecompSpacing; ++s) { PointDouble(p); } } } PointExt[] points = new PointExt[PrecompPoints]; int k = 0; points[k++] = sum; for (int t = 0; t < (PrecompTeeth - 1); ++t) { int size = 1 << t; for (int j = 0; j < size; ++j, ++k) { PointAddVar(false, points[k - size], ds[t], points[k] = new PointExt()); } } for (int i = 0; i < PrecompPoints; ++i) { PointExt q = points[i]; int[] x = new int[X25519Field.Size]; int[] y = new int[X25519Field.Size]; X25519Field.Add(q.z, q.z, x); X25519Field.Inv(x, y); X25519Field.Mul(q.x, y, x); X25519Field.Mul(q.y, y, y); PointPrecomp r = new PointPrecomp(); X25519Field.Apm(y, x, r.ypx_h, r.ymx_h); X25519Field.Mul(x, y, r.xyd); X25519Field.Mul(r.xyd, C_d4, r.xyd); X25519Field.Normalize(r.ypx_h); X25519Field.Normalize(r.ymx_h); X25519Field.Copy(r.ypx_h, 0, precompBase, off); off += X25519Field.Size; X25519Field.Copy(r.ymx_h, 0, precompBase, off); off += X25519Field.Size; X25519Field.Copy(r.xyd, 0, precompBase, off); off += X25519Field.Size; } } }
public override void OnEnable() { base.OnEnable(); _previousFrameInfo = new CharacterInfo(); _currentInfo = new CharacterInfo(); _partyBarPoints = new PointGroup(PointExt.New(393, 47), PointExt.New(599, 52), PointExt.New(605, 45)); _partyBarPointsOffseted = _partyBarPoints.OffsetCopy(0, 40); _previousFrameInfo = new CharacterInfo(); _hpBar = new ResourceBar(27, 217, 36, ResourceBar.EResourceType.Hp); _hpBar.ColorDiffTolerance = 5; _mpBar = new ResourceBar(27, 217, 53, ResourceBar.EResourceType.Mana); _mpBar.ColorDiffTolerance = 5; _partyBar = new ResourceBar(406, 598, 49, ResourceBar.EResourceType.PartyMemberHp); _monsterBar = new ResourceBar(406, 598, 49, ResourceBar.EResourceType.MonsterHp); _monsterBar.NbConsistencyFrame = 1; CalculateAttributes(); _currentInfo.InitialPosition = _currentInfo.Position; _previousFrameInfo.CopyFrom(_currentInfo); }