in src/ecp.js [479:699]
dbl: function() {
var t0, t1, t2, t3, x3, y3, z3, b,
C, D, H, J,
A, B, AA, BB;
if (ECP.CURVETYPE == ECP.WEIERSTRASS) {
if (ctx.ROM_CURVE.CURVE_A == 0) {
t0 = new ctx.FP(0);
t0.copy(this.y);
t0.sqr();
t1 = new ctx.FP(0);
t1.copy(this.y);
t1.mul(this.z);
t2 = new ctx.FP(0);
t2.copy(this.z);
t2.sqr();
this.z.copy(t0);
this.z.add(t0);
this.z.norm();
this.z.add(this.z);
this.z.add(this.z);
this.z.norm();
t2.imul(3 * ctx.ROM_CURVE.CURVE_B_I);
x3 = new ctx.FP(0);
x3.copy(t2);
x3.mul(this.z);
y3 = new ctx.FP(0);
y3.copy(t0);
y3.add(t2);
y3.norm();
this.z.mul(t1);
t1.copy(t2);
t1.add(t2);
t2.add(t1);
t0.sub(t2);
t0.norm();
y3.mul(t0);
y3.add(x3);
t1.copy(this.x);
t1.mul(this.y);
this.x.copy(t0);
this.x.norm();
this.x.mul(t1);
this.x.add(this.x);
this.x.norm();
this.y.copy(y3);
this.y.norm();
} else {
t0 = new ctx.FP(0);
t0.copy(this.x);
t1 = new ctx.FP(0);
t1.copy(this.y);
t2 = new ctx.FP(0);
t2.copy(this.z);
t3 = new ctx.FP(0);
t3.copy(this.x);
z3 = new ctx.FP(0);
z3.copy(this.z);
y3 = new ctx.FP(0);
x3 = new ctx.FP(0);
b = new ctx.FP(0);
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
b.rcopy(ctx.ROM_CURVE.CURVE_B);
}
t0.sqr(); //1 x^2
t1.sqr(); //2 y^2
t2.sqr(); //3
t3.mul(this.y); //4
t3.add(t3);
t3.norm(); //5
z3.mul(this.x); //6
z3.add(z3);
z3.norm(); //7
y3.copy(t2);
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
y3.mul(b); //8
} else {
y3.imul(ctx.ROM_CURVE.CURVE_B_I);
}
y3.sub(z3); //9 ***
x3.copy(y3);
x3.add(y3);
x3.norm(); //10
y3.add(x3); //11
x3.copy(t1);
x3.sub(y3);
x3.norm(); //12
y3.add(t1);
y3.norm(); //13
y3.mul(x3); //14
x3.mul(t3); //15
t3.copy(t2);
t3.add(t2); //16
t2.add(t3); //17
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
z3.mul(b); //18
} else {
z3.imul(ctx.ROM_CURVE.CURVE_B_I);
}
z3.sub(t2); //19
z3.sub(t0);
z3.norm(); //20 ***
t3.copy(z3);
t3.add(z3); //21
z3.add(t3);
z3.norm(); //22
t3.copy(t0);
t3.add(t0); //23
t0.add(t3); //24
t0.sub(t2);
t0.norm(); //25
t0.mul(z3); //26
y3.add(t0); //27
t0.copy(this.y);
t0.mul(this.z); //28
t0.add(t0);
t0.norm(); //29
z3.mul(t0); //30
x3.sub(z3); //31
t0.add(t0);
t0.norm(); //32
t1.add(t1);
t1.norm(); //33
z3.copy(t0);
z3.mul(t1); //34
this.x.copy(x3);
this.x.norm();
this.y.copy(y3);
this.y.norm();
this.z.copy(z3);
this.z.norm();
}
}
if (ECP.CURVETYPE == ECP.EDWARDS) {
C = new ctx.FP(0);
C.copy(this.x);
D = new ctx.FP(0);
D.copy(this.y);
H = new ctx.FP(0);
H.copy(this.z);
J = new ctx.FP(0);
this.x.mul(this.y);
this.x.add(this.x);
this.x.norm();
C.sqr();
D.sqr();
if (ctx.ROM_CURVE.CURVE_A == -1) {
C.neg();
}
this.y.copy(C);
this.y.add(D);
this.y.norm();
H.sqr();
H.add(H);
this.z.copy(this.y);
J.copy(this.y);
J.sub(H);
J.norm();
this.x.mul(J);
C.sub(D);
C.norm();
this.y.mul(C);
this.z.mul(J);
}
if (ECP.CURVETYPE == ECP.MONTGOMERY) {
A = new ctx.FP(0);
A.copy(this.x);
B = new ctx.FP(0);
B.copy(this.x);
AA = new ctx.FP(0);
BB = new ctx.FP(0);
C = new ctx.FP(0);
A.add(this.z);
A.norm();
AA.copy(A);
AA.sqr();
B.sub(this.z);
B.norm();
BB.copy(B);
BB.sqr();
C.copy(AA);
C.sub(BB);
C.norm();
this.x.copy(AA);
this.x.mul(BB);
A.copy(C);
A.imul((ctx.ROM_CURVE.CURVE_A + 2) >> 2);
BB.add(A);
BB.norm();
this.z.copy(BB);
this.z.mul(C);
}
return;
},