time = $options['time'] ?? $this->time; $this->memory = $options['memory'] ?? $this->memory; $this->threads = $options['threads'] ?? $this->threads; } /** * Hash the given value. * * @param string $value * @param array $options * @return string */ public function make($value, array $options = []) { $hash = password_hash($value, PASSWORD_ARGON2I, [ 'memory_cost' => $this->memory($options), 'time_cost' => $this->time($options), 'threads' => $this->threads($options), ]); if ($hash === false) { throw new RuntimeException('Argon2 hashing not supported.'); } return $hash; } /** * Check if the given hash has been hashed using the given options. * * @param string $hashedValue * @param array $options * @return bool */ public function needsRehash($hashedValue, array $options = []) { return password_needs_rehash($hashedValue, PASSWORD_ARGON2I, [ 'memory_cost' => $this->memory($options), 'time_cost' => $this->time($options), 'threads' => $this->threads($options), ]); } /** * Set the default password memory factor. * * @param int $memory * @return $this */ public function setMemory(int $memory) { $this->memory = $memory; return $this; } /** * Set the default password timing factor. * * @param int $time * @return $this */ public function setTime(int $time) { $this->time = $time; return $this; } /** * Set the default password threads factor. * * @param int $threads * @return $this */ public function setThreads(int $threads) { $this->threads = $threads; return $this; } /** * Extract the memory cost value from the options array. * * @param array $options * @return int */ protected function memory(array $options) { return $options['memory'] ?? $this->memory; } /** * Extract the time cost value from the options array. * * @param array $options * @return int */ protected function time(array $options) { return $options['time'] ?? $this->time; } /** * Extract the threads value from the options array. * * @param array $options * @return int */ protected function threads(array $options) { return $options['threads'] ?? $this->threads; } }