public static void Mainloop(int[] Work, byte[] E) { int[] xzm1 = new int[64]; int[] xzm = new int[64]; int[] xzmb = new int[64]; int[] Xzm1B = new int[64]; int[] xznb = new int[64]; int[] Xzn1B = new int[64]; int[] a0 = new int[64]; int[] a1 = new int[64]; int[] b0 = new int[64]; int[] b1 = new int[64]; int[] c1 = new int[64]; int[] r = new int[32]; int[] s = new int[32]; int[] t = new int[32]; int[] u = new int[32]; for (int j = 0; j < 32; ++j) { xzm1[j] = Work[j]; } xzm1[32] = 1; for (int j = 33; j < 64; ++j) { xzm1[j] = 0; } xzm[0] = 1; for (int j = 1; j < 64; ++j) { xzm[j] = 0; } int[] xzmbp = xzmb, A0P = a0, Xzm1Bp = Xzm1B; int[] A1P = a1, B0P = b0, B1P = b1, C1P = c1; int[] xznbp = xznb, up = u, Xzn1Bp = Xzn1B; int[] workp = Work, sp = s, rp = r; for (int pos = 254; pos >= 0; --pos) { int b = (int)((uint)(E[pos / 8] & 0xFF) >> (pos & 7)); b &= 1; Curve25519.Select(xzmb, Xzm1B, xzm, xzm1, b); Curve25519.Add(a0, 0, xzmb, 0, xzmbp, 32); Curve25519.Sub(A0P, 32, xzmb, 0, xzmbp, 32); Curve25519.Add(a1, 0, Xzm1B, 0, Xzm1Bp, 32); Curve25519.Sub(A1P, 32, Xzm1B, 0, Xzm1Bp, 32); Curve25519.Square(B0P, 0, A0P, 0); Curve25519.Square(B0P, 32, A0P, 32); Curve25519.Mult(B1P, 0, A1P, 0, A0P, 32); Curve25519.Mult(B1P, 32, A1P, 32, A0P, 0); Curve25519.Add(c1, 0, b1, 0, B1P, 32); Curve25519.Sub(C1P, 32, b1, 0, B1P, 32); Curve25519.Square(rp, 0, C1P, 32); Curve25519.Sub(sp, 0, b0, 0, B0P, 32); Curve25519.Mult121665(t, s); Curve25519.Add(u, 0, t, 0, B0P, 0); Curve25519.Mult(xznbp, 0, B0P, 0, B0P, 32); Curve25519.Mult(xznbp, 32, sp, 0, up, 0); Curve25519.Square(Xzn1Bp, 0, C1P, 0); Curve25519.Mult(Xzn1Bp, 32, rp, 0, workp, 0); Curve25519.Select(xzm, xzm1, xznb, Xzn1B, b); } for (int j = 0; j < 64; ++j) { Work[j] = xzm[j]; } }