auth: use constant-time NIP-42 challenge comparison

This commit is contained in:
2026-03-20 02:32:30 +01:00
parent a4ded3c008
commit b22fe98ab0
2 changed files with 11 additions and 1 deletions

View File

@@ -67,7 +67,16 @@ defmodule Parrhesia.Auth.Challenges do
end
def handle_call({:valid?, owner_pid, challenge}, _from, state) do
{:reply, Map.get(state.entries, owner_pid) == challenge, state}
valid? =
case Map.get(state.entries, owner_pid) do
stored_challenge when is_binary(stored_challenge) ->
Plug.Crypto.secure_compare(stored_challenge, challenge)
_other ->
false
end
{:reply, valid?, state}
end
def handle_call({:clear, owner_pid}, _from, state) do

View File

@@ -13,6 +13,7 @@ defmodule Parrhesia.Auth.ChallengesTest do
assert Challenges.valid?(server, self(), challenge)
refute Challenges.valid?(server, self(), "wrong")
refute Challenges.valid?(server, self(), challenge <> "x")
assert :ok = Challenges.clear(server, self())
assert Challenges.current(server, self()) == nil