Packages
ash_authentication
4.9.8
5.0.0-rc.12
5.0.0-rc.11
5.0.0-rc.10
5.0.0-rc.9
5.0.0-rc.8
5.0.0-rc.7
5.0.0-rc.6
5.0.0-rc.5
5.0.0-rc.4
5.0.0-rc.3
5.0.0-rc.2
5.0.0-rc.1
5.0.0-rc.0
4.14.1
4.14.0
4.13.7
4.13.6
4.13.5
4.13.4
4.13.3
4.13.2
retired
4.13.1
retired
4.13.0
4.12.0
4.11.0
4.10.0
4.9.9
4.9.8
4.9.7
4.9.6
4.9.5
4.9.4
4.9.3
4.9.2
4.9.1
4.9.0
4.8.7
4.8.6
4.8.5
4.8.3
4.8.2
4.8.1
4.8.0
4.7.6
4.7.5
4.7.4
4.7.3
4.7.2
4.7.1
4.7.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.6
4.5.5
4.5.4
4.5.3
4.5.2
4.5.1
4.5.0
4.4.9
4.4.8
4.4.7
4.4.6
4.4.5
4.4.4
4.4.3
4.4.2
4.4.1
4.4.0
4.3.12
4.3.11
4.3.10
4.3.9
4.3.8
4.3.7
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.7
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.4
4.0.3
4.0.2
4.0.1
4.0.0
4.0.0-rc.6
4.0.0-rc.5
4.0.0-rc.3
4.0.0-rc.2
4.0.0-rc.1
4.0.0-rc.0
3.12.4
3.12.3
3.12.2
3.12.1
3.12.0
3.11.16
3.11.15
3.11.14
3.11.13
3.11.12
3.11.11
3.11.10
3.11.9
3.11.8
3.11.7
3.11.6
3.11.5
3.11.4
3.11.3
3.11.2
3.11.1
3.11.0
3.10.8
3.10.7
3.10.6
3.10.5
3.10.4
3.10.3
3.10.2
3.10.1
3.10.0
3.9.6
3.9.5
3.9.4
3.9.3
3.9.2
3.9.1
3.9.0
3.8.0
3.7.9
3.7.8
3.7.6
3.7.5
3.7.4
3.7.3
3.7.2
3.7.1
3.7.0
3.6.1
3.6.0
3.5.3
3.5.2
3.5.1
3.5.0
3.3.1
3.3.0
3.2.2
3.2.1
3.2.0
3.1.0
3.0.3
Authentication extension for the Ash Framework.
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/ash_authentication/argon2_provider.ex
defmodule AshAuthentication.Argon2Provider do
@moduledoc """
Provides an implementation of `AshAuthentication.HashProvider` using `Argon2`.
"""
@behaviour AshAuthentication.HashProvider
@doc """
Given some user input as a string, convert it into it's hashed form using `Argon2`.
## Example
iex> {:ok, hashed} = hash("Marty McFly")
...> String.starts_with?(hashed, "$argon2id$")
true
"""
@impl true
@spec hash(String.t()) :: {:ok, String.t()} | :error
if Code.ensure_loaded?(Argon2) do
def hash(input) when is_binary(input), do: {:ok, Argon2.hash_pwd_salt(input)}
def hash(_input), do: :error
else
def hash(_input), do: raise("Argon2 is not available")
end
@doc """
Check if the user input matches the hash.
## Example
iex> valid?("Marty McFly", "$argon2id$v=19$m=256,t=1,p=2$T9zYADIg2xF5P21FgyIX5g$5K1vy8VTMlEZUWuO8HPOJcu239FkHen5XKmg7uviHEk")
true
"""
@impl true
@spec valid?(input :: String.t() | nil, hash :: String.t()) :: boolean()
if Code.ensure_loaded?(Argon2) do
def valid?(nil, _hash), do: Argon2.no_user_verify()
def valid?(input, hash) when is_binary(input) and is_binary(hash),
do: Argon2.verify_pass(input, hash)
else
def valid?(_input, _hash), do: raise("Argon2 is not available")
end
@doc """
Simulate a password check to help avoid timing attacks.
## Example
iex> simulate()
false
"""
@impl true
@spec simulate :: false
if Code.ensure_loaded?(Argon2) do
def simulate, do: Argon2.no_user_verify()
else
def simulate, do: raise("Argon2 is not available")
end
end