in src/pair192.js [36:137]
line: function(A, B, Qx, Qy) {
var r = new ctx.FP24(1),
XX, YY, ZZ, YZ, sb,
X1, Y1, T1, T2,
a, b, c;
if (A == B) { /* Doubling */
XX = new ctx.FP4(A.getx());
YY = new ctx.FP4(A.gety());
ZZ = new ctx.FP4(A.getz());
YZ = new ctx.FP4(YY);
YZ.mul(ZZ); //YZ
XX.sqr(); //X^2
YY.sqr(); //Y^2
ZZ.sqr(); //Z^2
YZ.imul(4);
YZ.neg();
YZ.norm(); //-2YZ
YZ.qmul(Qy); //-2YZ.Ys
XX.imul(6); //3X^2
XX.qmul(Qx); //3X^2.Xs
sb = 3 * ctx.ROM_CURVE.CURVE_B_I;
ZZ.imul(sb);
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.D_TYPE) {
ZZ.div_2i();
}
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.M_TYPE) {
ZZ.times_i();
ZZ.add(ZZ);
YZ.times_i();
YZ.norm();
}
ZZ.norm(); // 3b.Z^2
YY.add(YY);
ZZ.sub(YY);
ZZ.norm(); // 3b.Z^2-Y^2
a = new ctx.FP8(YZ, ZZ); // -2YZ.Ys | 3b.Z^2-Y^2 | 3X^2.Xs
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.D_TYPE) {
b = new ctx.FP8(XX); // L(0,1) | L(0,0) | L(1,0)
c = new ctx.FP8(0);
}
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.M_TYPE) {
b = new ctx.FP8(0);
c = new ctx.FP8(XX); c.times_i();
}
A.dbl();
} else { /* Addition */
X1 = new ctx.FP4(A.getx()); // X1
Y1 = new ctx.FP4(A.gety()); // Y1
T1 = new ctx.FP4(A.getz()); // Z1
T2 = new ctx.FP4(A.getz()); // Z1
T1.mul(B.gety()); // T1=Z1.Y2
T2.mul(B.getx()); // T2=Z1.X2
X1.sub(T2);
X1.norm(); // X1=X1-Z1.X2
Y1.sub(T1);
Y1.norm(); // Y1=Y1-Z1.Y2
T1.copy(X1); // T1=X1-Z1.X2
X1.qmul(Qy); // X1=(X1-Z1.X2).Ys
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.M_TYPE) {
X1.times_i();
X1.norm();
}
T1.mul(B.gety()); // T1=(X1-Z1.X2).Y2
T2.copy(Y1); // T2=Y1-Z1.Y2
T2.mul(B.getx()); // T2=(Y1-Z1.Y2).X2
T2.sub(T1);
T2.norm(); // T2=(Y1-Z1.Y2).X2 - (X1-Z1.X2).Y2
Y1.qmul(Qx);
Y1.neg();
Y1.norm(); // Y1=-(Y1-Z1.Y2).Xs
a = new ctx.FP8(X1, T2); // (X1-Z1.X2).Ys | (Y1-Z1.Y2).X2 - (X1-Z1.X2).Y2 | - (Y1-Z1.Y2).Xs
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.D_TYPE) {
b = new ctx.FP8(Y1);
c = new ctx.FP8(0);
}
if (ctx.ECP.SEXTIC_TWIST == ctx.ECP.M_TYPE) {
b = new ctx.FP8(0);
c = new ctx.FP8(Y1); c.times_i();
}
A.add(B);
}
r.set(a, b, c);
r.settype(ctx.FP.SPARSER);
return r;
},