lib/macfly/nonce.ex

defmodule Macfly.Nonce do
  alias __MODULE__

  @enforce_keys [:kid, :rnd, :is_proof]
  defstruct [:kid, :rnd, :is_proof]
  @type t() :: %Nonce{kid: binary(), rnd: binary(), is_proof: boolean()}

  def new(kid, rnd \\ :crypto.strong_rand_bytes(16), is_proof \\ false) do
    %Nonce{kid: kid, rnd: rnd, is_proof: is_proof}
  end

  def from_wire([%Msgpax.Bin{data: kid}, %Msgpax.Bin{data: rnd}, is_proof]) do
    {:ok, new(kid, rnd, is_proof)}
  end

  def from_wire(_), do: {:error, "bad nonce format"}

  def to_wire(%Nonce{kid: kid, rnd: rnd, is_proof: is_proof}) do
    [Msgpax.Bin.new(kid), Msgpax.Bin.new(rnd), is_proof]
  end
end