defmodule QRNBU.Validators.DigitalSignature do
@moduledoc """
Validator for digital signature strings.
Validates digital signatures used to authenticate invoices in V003 format.
"""
@max_length 1000
@doc """
Validates digital signature.
## Rules
- Maximum 1000 characters
- Base64-encoded string format expected
## Examples
iex> QRNBU.Validators.DigitalSignature.validate("SGVsbG8gV29ybGQ=")
{:ok, "SGVsbG8gV29ybGQ="}
iex> QRNBU.Validators.DigitalSignature.validate("")
{:error, "Digital signature cannot be empty"}
iex> QRNBU.Validators.DigitalSignature.validate(String.duplicate("A", 1001))
{:error, "Digital signature must not exceed 1000 characters"}
"""
@spec validate(String.t()) :: {:ok, String.t()} | {:error, String.t()}
def validate(signature) when is_binary(signature) do
cond do
String.trim(signature) == "" ->
{:error, "Digital signature cannot be empty"}
String.length(signature) > @max_length ->
{:error, "Digital signature must not exceed #{@max_length} characters"}
true ->
{:ok, signature}
end
end
def validate(_), do: {:error, "Digital signature must be a string"}
end