geTripleScalarMultPrecompPointVar static method
Implementation
static EDPoint geTripleScalarMultPrecompPointVar(
List<int> a,
List<EDPoint> aI,
List<int> b,
List<EDPoint> bI,
List<int> c,
List<EDPoint> cI) {
final aslide = List<int>.filled(256, 0);
final bslide = List<int>.filled(256, 0);
final cslide = List<int>.filled(256, 0);
CryptoOps.slide(aslide, a);
CryptoOps.slide(bslide, b);
CryptoOps.slide(cslide, c);
EDPoint? r;
for (int i = 255; i >= 0; i--) {
final aVal = aslide[i];
final bVal = bslide[i];
final cVal = cslide[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 (cVal != 0) {
final idx = (cVal.abs() - 1) ~/ 2;
final ci = cI[idx];
r = (r == null) ? (cVal > 0 ? ci : -ci) : (r + (cVal > 0 ? ci : -ci));
}
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 (cVal != 0) {
final idx = (cVal.abs() - 1) ~/ 2;
final ci = cI[idx];
r += cVal > 0 ? ci : -ci;
}
}
}
if (r == null) {
throw CryptoException(
"All scalars are zero; result undefined without identity support.");
}
return r;
}