Current section
Files
Jump to
Current section
Files
lib/aether/atproto/crypto/pkce.ex
defmodule Aether.ATProto.Crypto.PKCE do
@moduledoc """
PKCE (Proof Key for Code Exchange) implementation for OAuth 2.1.
Generates code verifiers and challenges according to RFC 7636.
"""
@doc """
Generates PKCE code verifier and code challenge for OAuth flow.
Returns a map with:
- code_verifier: Random 43-128 character string
- code_challenge: Base64 URL-encoded SHA256 hash of verifier
- code_challenge_method: "S256"
"""
def generate do
code_verifier =
:crypto.strong_rand_bytes(32)
|> Base.url_encode64(padding: false)
code_challenge =
:crypto.hash(:sha256, code_verifier)
|> Base.url_encode64(padding: false)
%{
code_verifier: code_verifier,
code_challenge: code_challenge,
code_challenge_method: "S256"
}
end
@doc """
Verify PKCE code_verifier matches the stored code_challenge.
"""
def verify_pkce(code_verifier, code_challenge) do
computed_challenge =
:crypto.hash(:sha256, code_verifier)
|> Base.url_encode64(padding: false)
if computed_challenge == code_challenge do
:ok
else
{:error, :invalid_grant}
end
end
end