in src/ecp2.js [829:911]
ECP2.mapit = function(h) {
var fa = new ctx.BIG(0),
fb = new ctx.BIG(0),
q, x, one, Q, T, K, X, xQ, x2Q;
q = new ctx.BIG(0);
q.rcopy(ctx.ROM_FIELD.Modulus);
x = ctx.BIG.fromBytes(h);
one = new ctx.BIG(1);
x.mod(q);
for (;;) {
X = new ctx.FP2(one, x);
Q = new ECP2();
Q.setx(X);
if (!Q.is_infinity()) {
break;
}
x.inc(1);
x.norm();
}
/* Fast Hashing to G2 - Fuentes-Castaneda, Knapp and Rodriguez-Henriquez */
fa.rcopy(ctx.ROM_FIELD.Fra);
fb.rcopy(ctx.ROM_FIELD.Frb);
X = new ctx.FP2(fa, fb);
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.M_TYPE) {
X.inverse();
X.norm();
}
x = new ctx.BIG(0);
x.rcopy(ctx.ROM_CURVE.CURVE_Bnx);
if (ctx.ECP.CURVE_PAIRING_TYPE == ctx.ECP.BN) {
T = new ECP2();
T.copy(Q);
T = T.mul(x);
if (ctx.ECP.SIGN_OF_X == ctx.ECP.NEGATIVEX) {
T.neg();
}
K = new ECP2();
K.copy(T);
K.dbl();
K.add(T); //K.affine();
K.frob(X);
Q.frob(X);
Q.frob(X);
Q.frob(X);
Q.add(T);
Q.add(K);
T.frob(X);
T.frob(X);
Q.add(T);
}
if (ctx.ECP.CURVE_PAIRING_TYPE == ctx.ECP.BLS) {
xQ = Q.mul(x);
x2Q = xQ.mul(x);
if (ctx.ECP.SIGN_OF_X == ctx.ECP.NEGATIVEX) {
xQ.neg();
}
x2Q.sub(xQ);
x2Q.sub(Q);
xQ.sub(Q);
xQ.frob(X);
Q.dbl();
Q.frob(X);
Q.frob(X);
Q.add(x2Q);
Q.add(xQ);
}
Q.affine();
return Q;
};