in src/ecp.js [707:994]
add: function(Q) {
var b, t0, t1, t2, t3, t4, x3, y3, z3,
A, B, C, D, E, F, G;
if (ECP.CURVETYPE == ECP.WEIERSTRASS) {
if (ctx.ROM_CURVE.CURVE_A == 0) {
b = 3 * ctx.ROM_CURVE.CURVE_B_I;
t0 = new ctx.FP(0);
t0.copy(this.x);
t0.mul(Q.x);
t1 = new ctx.FP(0);
t1.copy(this.y);
t1.mul(Q.y);
t2 = new ctx.FP(0);
t2.copy(this.z);
t2.mul(Q.z);
t3 = new ctx.FP(0);
t3.copy(this.x);
t3.add(this.y);
t3.norm();
t4 = new ctx.FP(0);
t4.copy(Q.x);
t4.add(Q.y);
t4.norm();
t3.mul(t4);
t4.copy(t0);
t4.add(t1);
t3.sub(t4);
t3.norm();
t4.copy(this.y);
t4.add(this.z);
t4.norm();
x3 = new ctx.FP(0);
x3.copy(Q.y);
x3.add(Q.z);
x3.norm();
t4.mul(x3);
x3.copy(t1);
x3.add(t2);
t4.sub(x3);
t4.norm();
x3.copy(this.x);
x3.add(this.z);
x3.norm();
y3 = new ctx.FP(0);
y3.copy(Q.x);
y3.add(Q.z);
y3.norm();
x3.mul(y3);
y3.copy(t0);
y3.add(t2);
y3.rsub(x3);
y3.norm();
x3.copy(t0);
x3.add(t0);
t0.add(x3);
t0.norm();
t2.imul(b);
z3 = new ctx.FP(0);
z3.copy(t1);
z3.add(t2);
z3.norm();
t1.sub(t2);
t1.norm();
y3.imul(b);
x3.copy(y3);
x3.mul(t4);
t2.copy(t3);
t2.mul(t1);
x3.rsub(t2);
y3.mul(t0);
t1.mul(z3);
y3.add(t1);
t0.mul(t3);
z3.mul(t4);
z3.add(t0);
this.x.copy(x3);
this.x.norm();
this.y.copy(y3);
this.y.norm();
this.z.copy(z3);
this.z.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);
t4 = new ctx.FP(0);
t4.copy(Q.x);
z3 = new ctx.FP(0);
y3 = new ctx.FP(0);
y3.copy(Q.x);
x3 = new ctx.FP(0);
x3.copy(Q.y);
b = new ctx.FP(0);
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
b.rcopy(ctx.ROM_CURVE.CURVE_B);
}
t0.mul(Q.x); //1
t1.mul(Q.y); //2
t2.mul(Q.z); //3
t3.add(this.y);
t3.norm(); //4
t4.add(Q.y);
t4.norm(); //5
t3.mul(t4); //6
t4.copy(t0);
t4.add(t1); //7
t3.sub(t4);
t3.norm(); //8
t4.copy(this.y);
t4.add(this.z);
t4.norm(); //9
x3.add(Q.z);
x3.norm(); //10
t4.mul(x3); //11
x3.copy(t1);
x3.add(t2); //12
t4.sub(x3);
t4.norm(); //13
x3.copy(this.x);
x3.add(this.z);
x3.norm(); //14
y3.add(Q.z);
y3.norm(); //15
x3.mul(y3); //16
y3.copy(t0);
y3.add(t2); //17
y3.rsub(x3);
y3.norm(); //18
z3.copy(t2);
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
z3.mul(b); //18
} else {
z3.imul(ctx.ROM_CURVE.CURVE_B_I);
}
x3.copy(y3);
x3.sub(z3);
x3.norm(); //20
z3.copy(x3);
z3.add(x3); //21
x3.add(z3); //22
z3.copy(t1);
z3.sub(x3);
z3.norm(); //23
x3.add(t1);
x3.norm(); //24
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
y3.mul(b); //18
} else {
y3.imul(ctx.ROM_CURVE.CURVE_B_I);
}
t1.copy(t2);
t1.add(t2); //26
t2.add(t1); //27
y3.sub(t2); //28
y3.sub(t0);
y3.norm(); //29
t1.copy(y3);
t1.add(y3); //30
y3.add(t1);
y3.norm(); //31
t1.copy(t0);
t1.add(t0); //32
t0.add(t1); //33
t0.sub(t2);
t0.norm(); //34
t1.copy(t4);
t1.mul(y3); //35
t2.copy(t0);
t2.mul(y3); //36
y3.copy(x3);
y3.mul(z3); //37
y3.add(t2); //38
x3.mul(t3); //39
x3.sub(t1); //40
z3.mul(t4); //41
t1.copy(t3);
t1.mul(t0); //42
z3.add(t1);
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) {
A = new ctx.FP(0);
A.copy(this.z);
B = new ctx.FP(0);
C = new ctx.FP(0);
C.copy(this.x);
D = new ctx.FP(0);
D.copy(this.y);
E = new ctx.FP(0);
F = new ctx.FP(0);
G = new ctx.FP(0);
A.mul(Q.z); //A=2
B.copy(A);
B.sqr(); //B=2
C.mul(Q.x); //C=2
D.mul(Q.y); //D=2
E.copy(C);
E.mul(D); //E=2
if (ctx.ROM_CURVE.CURVE_B_I == 0) {
b = new ctx.FP(0);
b.rcopy(ctx.ROM_CURVE.CURVE_B);
E.mul(b);
} else {
E.imul(ctx.ROM_CURVE.CURVE_B_I); //E=22222
}
F.copy(B);
F.sub(E); //F=22224
G.copy(B);
G.add(E); //G=22224
if (ctx.ROM_CURVE.CURVE_A == 1) {
E.copy(D);
E.sub(C); //E=4
}
C.add(D); //C=4
B.copy(this.x);
B.add(this.y); //B=4
D.copy(Q.x);
D.add(Q.y);
B.norm();
D.norm(); //D=4
B.mul(D); //B=2
B.sub(C);
B.norm();
F.norm(); // B=6
B.mul(F); //B=2
this.x.copy(A);
this.x.mul(B);
G.norm(); // x=2
if (ctx.ROM_CURVE.CURVE_A == 1) {
E.norm();
C.copy(E);
C.mul(G); //C=2
}
if (ctx.ROM_CURVE.CURVE_A == -1) {
C.norm();
C.mul(G);
}
this.y.copy(A);
this.y.mul(C); //y=2
this.z.copy(F);
this.z.mul(G);
}
return;
},