BlsEx (bls_ex v0.1.1)

BlsEx provides utility to leverage BLS signatures

BLS scheme supports aggregation of public keys and aggregation of signatures.

Here an full example of aggregated signature verification

iex> seed = :crypto.hash(:sha512, "myseed")
iex> public_key1 = BlsEx.get_public_key!(seed)
iex> signature1 = BlsEx.sign!(seed, "hello")
iex> seed2 = :crypto.hash(:sha512, "myseed2")
iex> public_key2 = BlsEx.get_public_key!(seed2)
iex> signature2 = BlsEx.sign!(seed2, "hello")
iex> aggregated_signature = BlsEx.aggregate_signatures!([signature1, signature2], [public_key1, public_key2])
iex> aggregated_public_key = BlsEx.aggregate_public_keys!([public_key1, public_key2])
iex> BlsEx.verify_signature?(aggregated_public_key, "hello", aggregated_signature)
true

Summary

Functions

Aggregate a list of public keys

Aggregate a list of signatures

Generate a public key from a secret key

Same as get_public_key/1 but raise the error

Sign a message using the given secret key

Same as sign/2 but raise the error

Verifies a single BLS signature

Types

Link to this type

public_key()

@type public_key() :: <<_::384>>
Link to this type

secret_key()

@type secret_key() :: <<_::512>>
@type signature() :: <<_::768>>

Functions

Link to this function

aggregate_public_keys(public_keys)

@spec aggregate_public_keys(public_keys :: [public_key()]) ::
  {:ok, aggregated_public_key :: public_key()} | {:error, :no_valid_keys}

Aggregate a list of public keys

Link to this function

aggregate_public_keys!(public_keys)

@spec aggregate_public_keys!(public_keys :: [public_key()]) ::
  aggregated_public_key :: public_key()

Same as aggregate_public_keys/1 but raise the error

Link to this function

aggregate_signatures(signatures, public_keys)

@spec aggregate_signatures(signatures :: [signature()], public_keys :: [public_key()]) ::
  {:ok, aggregated_signature :: signature()}
  | {:error, :no_valid_keys_or_signatures}

Aggregate a list of signatures

Link to this function

aggregate_signatures!(signatures, public_keys)

@spec aggregate_signatures!(
  signatures :: [signature()],
  public_keys :: [public_key()]
) ::
  aggregated_signature :: signature()

Same as aggregate_signatures/2 but raise the error

Link to this function

get_public_key(secret_key)

@spec get_public_key(secret_key :: secret_key()) ::
  {:ok, public_key()} | {:error, :invalid_seed}

Generate a public key from a secret key

Link to this function

get_public_key!(secret_key)

@spec get_public_key!(secret_key :: secret_key()) :: public_key()

Same as get_public_key/1 but raise the error

Link to this function

sign(secret_key, data)

@spec sign(secret_key :: secret_key(), message :: binary()) ::
  {:ok, signature()} | {:error, :invalid_seed}

Sign a message using the given secret key

Link to this function

sign!(secret_key, data)

@spec sign!(secret_key :: secret_key(), message :: binary()) :: signature()

Same as sign/2 but raise the error

Link to this function

verify_signature?(public_key, message, signature)

@spec verify_signature?(
  public_key :: public_key(),
  message :: binary(),
  signature :: signature()
) :: boolean()

Verifies a single BLS signature