private static void PointAddPrecomp(PointPrecomp p, PointAccum r) { int[] A = X25519Field.Create(); int[] B = X25519Field.Create(); int[] C = X25519Field.Create(); int[] E = r.u; int[] F = X25519Field.Create(); int[] G = X25519Field.Create(); int[] H = r.v; X25519Field.Apm(r.y, r.x, B, A); X25519Field.Mul(A, p.ymx_h, A); X25519Field.Mul(B, p.ypx_h, B); X25519Field.Mul(r.u, r.v, C); X25519Field.Mul(C, p.xyd, C); X25519Field.Apm(B, A, H, E); X25519Field.Apm(r.z, C, G, F); X25519Field.Carry(G); X25519Field.Mul(E, F, r.x); X25519Field.Mul(G, H, r.y); X25519Field.Mul(F, G, r.z); }
private static void PointAddVar(bool negate, PointExt p, PointExt q, PointExt r) { int[] A = X25519Field.Create(); int[] B = X25519Field.Create(); int[] C = X25519Field.Create(); int[] D = X25519Field.Create(); int[] E = X25519Field.Create(); int[] F = X25519Field.Create(); int[] G = X25519Field.Create(); int[] H = X25519Field.Create(); int[] c, d, f, g; if (negate) { c = D; d = C; f = G; g = F; } else { c = C; d = D; f = F; g = G; } X25519Field.Apm(p.y, p.x, B, A); X25519Field.Apm(q.y, q.x, d, c); X25519Field.Mul(A, C, A); X25519Field.Mul(B, D, B); X25519Field.Mul(p.t, q.t, C); X25519Field.Mul(C, C_d2, C); X25519Field.Mul(p.z, q.z, D); X25519Field.Add(D, D, D); X25519Field.Apm(B, A, H, E); X25519Field.Apm(D, C, g, f); X25519Field.Carry(g); X25519Field.Mul(E, F, r.x); X25519Field.Mul(G, H, r.y); X25519Field.Mul(F, G, r.z); X25519Field.Mul(E, H, r.t); }
private static void PointDouble(PointAccum r) { int[] A = X25519Field.Create(); int[] B = X25519Field.Create(); int[] C = X25519Field.Create(); int[] E = r.u; int[] F = X25519Field.Create(); int[] G = X25519Field.Create(); int[] H = r.v; X25519Field.Sqr(r.x, A); X25519Field.Sqr(r.y, B); X25519Field.Sqr(r.z, C); X25519Field.Add(C, C, C); X25519Field.Apm(A, B, H, G); X25519Field.Add(r.x, r.y, E); X25519Field.Sqr(E, E); X25519Field.Sub(H, E, E); X25519Field.Add(C, G, F); X25519Field.Carry(F); X25519Field.Mul(E, F, r.x); X25519Field.Mul(G, H, r.y); X25519Field.Mul(F, G, r.z); }