geDoubleScalarMultPrecompPointVar static method
Implementation
static EDPoint geDoubleScalarMultPrecompPointVar(
List<int> a, List<EDPoint> aI, List<int> b, List<EDPoint> bI) {
final aslide = List<int>.filled(256, 0);
final bslide = List<int>.filled(256, 0);
CryptoOps.slide(aslide, a);
CryptoOps.slide(bslide, b);
EDPoint? r;
for (int i = 255; i >= 0; i--) {
final aVal = aslide[i];
final bVal = bslide[i];
if (r == null) {
if (aVal != 0) {
final idx = (aVal.abs() - 1) ~/ 2;
final ai = aI[idx];
r = aVal > 0 ? ai : -ai;
}
if (bVal != 0) {
final idx = (bVal.abs() - 1) ~/ 2;
final bi = bI[idx];
r = (r == null) ? (bVal > 0 ? bi : -bi) : (r + (bVal > 0 ? bi : -bi));
}
if (r == null) continue; // still no op
} else {
r = r * BigInt.two;
if (aVal != 0) {
final idx = (aVal.abs() - 1) ~/ 2;
final ai = aI[idx];
r += aVal > 0 ? ai : -ai;
}
if (bVal != 0) {
final idx = (bVal.abs() - 1) ~/ 2;
final bi = bI[idx];
r += bVal > 0 ? bi : -bi;
}
}
}
if (r == null) {
throw Exception(
"Both scalars are zero; result undefined without identity support.");
}
return r;
}