in src/ristretto255.js [556:602]
function fromBytes(h, s) {
const invSqrt = lowlevel.gf();
const one = lowlevel.gf();
const sVar = lowlevel.gf();
const ss = lowlevel.gf();
const u1 = lowlevel.gf();
const u2 = lowlevel.gf();
const u1u1 = lowlevel.gf();
const u2u2 = lowlevel.gf();
const v = lowlevel.gf();
const vU2U2 = lowlevel.gf();
if (isCanonical(s) === 0) {
return -1;
}
lowlevel.unpack25519(sVar, s);
lowlevel.S(ss, sVar); /* ss = s^2 */
lowlevel.set25519(u1, gf1); /* u1 = 1 */
lowlevel.Z(u1, u1, ss); /* u1 = 1-ss */
lowlevel.S(u1u1, u1); /* u1u1 = u1^2 */
lowlevel.set25519(u2, gf1); /* u2 = 1 */
lowlevel.A(u2, u2, ss); /* u2 = 1+ss */
lowlevel.S(u2u2, u2); /* u2u2 = u2^2 */
lowlevel.M(v, lowlevel.D, u1u1); /* v = d*u1^2 */
neg25519(v, v); /* v = -d*u1^2 */
lowlevel.Z(v, v, u2u2); /* v = -(d*u1^2)-u2^2 */
lowlevel.M(vU2U2, v, u2u2); /* v_u2u2 = v*u2^2 */
lowlevel.set25519(one, gf1); /* one = 1 */
const wasSquare = sqrtRatioM1(invSqrt, one, vU2U2);
lowlevel.M(h[0], invSqrt, u2);
lowlevel.M(h[1], invSqrt, h[0]);
lowlevel.M(h[1], h[1], v);
lowlevel.M(h[0], h[0], sVar);
lowlevel.A(h[0], h[0], h[0]);
abs25519(h[0], h[0]);
lowlevel.M(h[1], u1, h[1]);
lowlevel.set25519(h[2], gf1); /* h->Z = 1 */
lowlevel.M(h[3], h[0], h[1]);
return -((1 - wasSquare) | isneg25519(h[3]) | iszero25519(h[1]));
}