lib/k256/schnorr.ex

defmodule K256.Schnorr do
  @type signing_key :: binary()
  @type verifying_key :: binary()
  @type signature :: binary()

  @type errors ::
          :signing_key_decoding_failed
          | :verifying_key_decoding_failed
          | :signature_decoding_failed
          | :invalid_signature

  @doc "Generates a random signing key"
  @spec generate_random_signing_key() :: signing_key()
  defdelegate generate_random_signing_key(),
    to: K256.Native,
    as: :schnorr_generate_random_signing_key

  @doc "Creates an returns a signature of the given message given a signing key"
  @spec create_signature(
          message :: binary(),
          signing_key :: signing_key()
        ) ::
          {:ok, signature()}
          | {:error, :signing_key_decoding_failed}
  defdelegate create_signature(message, signing_key),
    to: K256.Native,
    as: :schnorr_create_signature

  @doc "Creates a verifying key given a signing key"
  @spec verifying_key_from_signing_key(signing_key :: signing_key()) ::
          {:ok, verifying_key()}
          | {:error, :signing_key_decoding_failed}
  defdelegate verifying_key_from_signing_key(signing_key),
    to: K256.Native,
    as: :schnorr_verifying_key_from_signing_key

  @doc "Validates the signature of message given a signature and a verifying key"
  @spec verify_message(
          message :: binary(),
          signature :: signature(),
          verifying_key :: verifying_key()
        ) ::
          :ok
          | {:error, :invalid_signature}
          | {:error, :signature_decoding_failed}
          | {:error, :verifying_key_decoding_failed}
  defdelegate verify_message(message, signature, verifying_key),
    to: K256.Native,
    as: :schnorr_verify_message

  @doc "Validates a message digest given a signature and a verifying key"
  @spec verify_message_digest(
          message_digest :: binary(),
          signature :: signature(),
          verifying_key :: verifying_key()
        ) ::
          :ok
          | {:error, :message_digest_invalid}
          | {:error, :invalid_signature}
          | {:error, :signature_decoding_failed}
          | {:error, :verifying_key_decoding_failed}
  defdelegate verify_message_digest(message_digest, signature, verifying_key),
    to: K256.Native,
    as: :schnorr_verify_message_digest
end