geTripleScalarMultBasePrecompVartime static method
void
geTripleScalarMultBasePrecompVartime(
- GroupElementP2 r,
- List<
int> a, - GroupElementDsmp aI,
- List<
int> b, - GroupElementDsmp bI,
- List<
int> c, - GroupElementDsmp cI,
Implementation
static void geTripleScalarMultBasePrecompVartime(
GroupElementP2 r,
List<int> a,
GroupElementDsmp aI,
List<int> b,
GroupElementDsmp bI,
List<int> c,
GroupElementDsmp cI) {
b.asMin32("geTripleScalarMultBasePrecompVartime");
a.asMin32("geTripleScalarMultBasePrecompVartime");
c.asMin32("geTripleScalarMultBasePrecompVartime");
final List<int> aslide = List<int>.filled(256, 0);
final List<int> bslide = List<int>.filled(256, 0);
final List<int> cslide = List<int>.filled(256, 0);
final GroupElementP1P1 t = GroupElementP1P1();
final GroupElementP3 u = GroupElementP3();
int i;
slide(aslide, a);
slide(bslide, b);
slide(cslide, c);
geP2Zero(r);
for (i = 255; i >= 0; --i) {
if (aslide[i] != 0 || bslide[i] != 0 || cslide[i] != 0) {
break;
}
}
for (; i >= 0; --i) {
geP2Dbl(t, r);
if (aslide[i] > 0) {
geP1P1ToP3(u, t);
geAdd(t, u, aI[aslide[i] ~/ 2]);
} else if (aslide[i] < 0) {
geP1P1ToP3(u, t);
geSub(t, u, aI[(-aslide[i]) ~/ 2]);
}
if (bslide[i] > 0) {
geP1P1ToP3(u, t);
geAdd(t, u, bI[bslide[i] ~/ 2]);
} else if (bslide[i] < 0) {
geP1P1ToP3(u, t);
geSub(t, u, bI[(-bslide[i]) ~/ 2]);
}
if (cslide[i] > 0) {
geP1P1ToP3(u, t);
geAdd(t, u, cI[cslide[i] ~/ 2]);
} else if (cslide[i] < 0) {
geP1P1ToP3(u, t);
geSub(t, u, cI[(-cslide[i]) ~/ 2]);
}
geP1P1ToP2(r, t);
}
}