function toBytes()

in src/ristretto255.js [455:517]


function toBytes(h) {
  /* h.X = h[0], h.Y = h[1], h.Z = h[2], h.T = h[3] */
  const den1 = lowlevel.gf();
  const den2 = lowlevel.gf();
  let denInv = lowlevel.gf();
  const eden = lowlevel.gf();
  const invSqrt = lowlevel.gf();
  const ix = lowlevel.gf();
  const iy = lowlevel.gf();
  const sVar = lowlevel.gf();
  const tZInv = lowlevel.gf();
  const u1 = lowlevel.gf();
  const u2 = lowlevel.gf();
  const u1U2U2 = lowlevel.gf();
  let xVar = lowlevel.gf();
  let yVar = lowlevel.gf();
  const xZInv = lowlevel.gf();
  const zInv = lowlevel.gf();
  const zmy = lowlevel.gf();
  let rotate = 0;
  const s = new Uint8Array(32);

  lowlevel.A(u1, h[2], h[1]); /* u1 = Z+Y */
  lowlevel.Z(zmy, h[2], h[1]); /* zmy = Z-Y */
  lowlevel.M(u1, u1, zmy); /* u1 = (Z+Y)*(Z-Y) */

  lowlevel.M(u2, h[0], h[1]); /* u2 = X*Y */

  lowlevel.S(u1U2U2, u2); /* u1U2U2 = u2^2 */
  lowlevel.M(u1U2U2, u1, u1U2U2); /* u1U2U2 = u1*u2^2 */

  sqrtRatioM1(invSqrt, gf1, u1U2U2);

  lowlevel.M(den1, invSqrt, u1); /* den1 = invSqrt*u1 */
  lowlevel.M(den2, invSqrt, u2); /* den2 = invSqrt*u2 */
  lowlevel.M(zInv, den1, den2); /* z_inv = den1*den2 */
  lowlevel.M(zInv, zInv, h[3]); /* z_inv = den1*den2*T */

  lowlevel.M(ix, h[0], sqrtm1); /* ix = X*sqrt(-1) */
  lowlevel.M(iy, h[1], sqrtm1); /* iy = Y*sqrt(-1) */
  lowlevel.M(eden, den1, invsqrtamd); /* eden = den1*sqrt(a-d) */

  lowlevel.M(tZInv, h[3], zInv); /* tZInv = T*z_inv */
  rotate = isneg25519(tZInv);

  xVar = lowlevel.gf(h[0]);
  yVar = lowlevel.gf(h[1]);
  denInv = lowlevel.gf(den2);

  cmov25519(xVar, iy, rotate);
  cmov25519(yVar, ix, rotate);
  cmov25519(denInv, eden, rotate);

  lowlevel.M(xZInv, xVar, zInv);
  cneg25519(yVar, yVar, isneg25519(xZInv));

  lowlevel.Z(sVar, h[2], yVar);
  lowlevel.M(sVar, denInv, sVar);
  abs25519(sVar, sVar);

  lowlevel.pack25519(s, sVar);
  return s;
}