docs: public org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement doubleScalarMultiplyVariableTime(
            final org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement A, final byte[] a,
            final byte[] b) {
      // TODO-CR BR: A check that this is the base point is needed.
      final byte[] aslide = slide(a);
      final byte[] bslide = slide(b);
  
      org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement r = this.curve
          .getZero(Representation.P2);
  
      int i;
      for (i = 255; i >= 0; --i) {
        if (aslide[i] != 0 || bslide[i] != 0) {
          break;
        }
      }
  
      synchronized (this) {
        // TODO-CR BR strange comment below.
        // TODO: Get opinion from a crypto professional.
        // This should in practice never be necessary, the only point that
        // this should get called on is EdDSA's B.
        //precompute();
        for (; i >= 0; --i) {
          org.mariadb.jdbc.internal.com.send.authentication.ed25519.math.GroupElement t = r.dbl();
  
          if (aslide[i] > 0) {
            t = t.toP3().madd(A.dblPrecmp[aslide[i] / 2]);
          } else if (aslide[i] < 0) {
            t = t.toP3().msub(A.dblPrecmp[(-aslide[i]) / 2]);
          }
  
          if (bslide[i] > 0) {
            t = t.toP3().madd(this.dblPrecmp[bslide[i] / 2]);
          } else if (bslide[i] < 0) {
            t = t.toP3().msub(this.dblPrecmp[(-bslide[i]) / 2]);
          }
  
          r = t.toP2();
        }
      }
  
      return r;
    }