42                        size_t key_len)
 const {
 
   43   argon2(output, output_len, password, password_len, salt, salt_len, key, key_len, ad, ad_len);
 
 
   78                                                  std::chrono::milliseconds msec,
 
   80                                                  std::chrono::milliseconds tune_time)
 const {
 
   81   const size_t max_kib = (max_memory == 0) ? 256 * 1024 : max_memory * 1024;
 
   85   const size_t tune_M = (msec >= std::chrono::milliseconds(200) ? 128 : 36) * 1024;
 
   93   auto tune_fn = [&]() {
 
   94      uint8_t output[64] = {0};
 
   95      pwhash->derive_key(output, 
sizeof(output), 
"test", 4, 
nullptr, 0);
 
   98   const uint64_t measured_time = 
measure_cost(tune_time, tune_fn) / (tune_M / M);
 
  100   const uint64_t target_nsec = msec.count() * 
static_cast<uint64_t
>(1000000);
 
  110   uint64_t est_nsec = measured_time;
 
  112   if(est_nsec < target_nsec && M < max_kib) {
 
  113      const uint64_t desired_cost_increase = (target_nsec + est_nsec - 1) / est_nsec;
 
  114      const uint64_t mem_headroom = max_kib / M;
 
  116      const uint64_t M_mult = std::min(desired_cost_increase, mem_headroom);
 
  117      M *= 
static_cast<size_t>(M_mult);
 
  121   if(est_nsec < target_nsec / 2) {
 
  122      const uint64_t desired_cost_increase = (target_nsec + est_nsec - 1) / est_nsec;
 
  123      t *= 
static_cast<size_t>(desired_cost_increase);
 
 
void derive_key(uint8_t out[], size_t out_len, const char *password, size_t password_len, const uint8_t salt[], size_t salt_len) const override