lib/salty/box.ex

defmodule Salty.Box do
  defmacro __using__(_opts) do
    quote do
      @behaviour Salty.Box
      alias Salty.Nif, as: C

      def open_easy(cipher, nonce, pk, sk) do
        mac_size = macbytes()
        <<mac::binary-size(mac_size),
          data::binary>> = cipher
        open_detached(data, mac, nonce, pk, sk)
      end

      def open_easy_afternm(cipher, nonce, k) do
        mac_size = macbytes()
        <<mac::binary-size(mac_size),
          data::binary>> = cipher
        open_detached_afternm(data, mac, nonce, k)
      end
    end
  end

  def primitive do
    Salty.Box.Curve25519xsalsa20poly1305
  end

  @callback seedbytes() :: non_neg_integer()

  @callback publickeybytes() :: non_neg_integer()

  @callback secretkeybytes() :: non_neg_integer()

  @callback noncebytes() :: non_neg_integer()

  @callback macbytes() :: non_neg_integer()

  @callback sealbytes() :: non_neg_integer()

  @callback seed_keypair(binary()) :: {:ok, binary(), binary()} | {:error, atom()}

  @callback keypair() :: {:ok, binary(), binary()} | {:error, atom()}

  @callback easy(binary(), binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback open_easy(binary(), binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback detached(binary(), binary(), binary(), binary()) :: {:ok, binary(), binary()} | {:error, atom()}

  @callback open_detached(binary(), binary(), binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback beforenm(binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback easy_afternm(binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback open_easy_afternm(binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback detached_afternm(binary(), binary(), binary()) :: {:ok, binary(), binary()} | {:error, atom()}

  @callback open_detached_afternm(binary(), binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback seal(binary(), binary()) :: {:ok, binary()} | {:error, atom()}

  @callback seal_open(binary(), binary(), binary()) :: {:ok, binary()} | {:error, atom()}

end