View Source ExSecp256k1 (ExSecp256k1 v0.5.0)

NIF for secp256k1 curve functions.

It uses https://github.com/paritytech/libsecp256k1

Link to this section Summary

Functions

Create a public key from a private key

Tweak public key by adding to it

Tweak private key by multiplying it

Compresses public key

Decompresses public key

Tweak public key by adding to it

Tweak public key by multiplying it

Recover public key from a message, its signature and a recovery id

Recover public key from a message, its compact signature and a recovery id

Sign a message with the provided private key

Sign a message with the provided private key. It returns a compact signature

Verify a signature of a message

Link to this section Types

Specs

error() :: {:error, atom()}

Link to this section Functions

Link to this function

create_public_key(private_key)

View Source

Specs

create_public_key(binary()) :: {:ok, binary()} | atom()

Create a public key from a private key

Examples

iex> private_key = :crypto.strong_rand_bytes(32)
iex> {:ok, _public_key} = ExSecp256k1.create_public_key(private_key)
Link to this function

private_key_tweak_add(private_key, tweak_key)

View Source

Specs

private_key_tweak_add(binary(), binary()) :: {:ok, binary()} | atom()

Tweak public key by adding to it

Examples

iex> private_key = <<72, 91, 33, 135, 186, 13, 21, 144, 75, 36, 27, 203, 157, 203, 177, 166, 86, 92, 151, 137, 148, 205, 234, 174, 192, 12, 9, 227, 208, 173, 74, 69>>
iex> {:ok, _result} = ExSecp256k1.private_key_tweak_add(private_key, private_key)
Link to this function

private_key_tweak_mult(private_key, tweak_key)

View Source

Specs

private_key_tweak_mult(binary(), binary()) :: {:ok, binary()} | atom()

Tweak private key by multiplying it

Examples

iex> private_key = <<72, 91, 33, 135, 186, 13, 21, 144, 75, 36, 27, 203, 157, 203, 177, 166, 86, 92, 151, 137, 148, 205, 234, 174, 192, 12, 9, 227, 208, 173, 74, 69>>
iex> {:ok, _result} = ExSecp256k1.private_key_tweak_mult(private_key, private_key)
Link to this function

public_key_compress(public_key)

View Source

Specs

public_key_compress(binary()) :: {:ok, binary()} | atom()

Compresses public key

Examples

iex> public_key = <<4, 204, 170, 92, 229, 234, 207, 153, 33, 250, 27, 208, 37, 71, 183, 155, 104, 155, 45, 114, 7, 156, 83, 199, 245, 83, 32, 128, 45, 174, 96, 24, 38, 220, 210, 198, 20, 132, 174, 75, 63, 131, 95, 120, 101, 186, 93, 179, 95, 14, 206, 46, 48, 6, 129, 8, 146, 40, 135, 251, 42, 71, 4, 83, 222>>
iex> {:ok, _result} = ExSecp256k1.public_key_compress(public_key)
Link to this function

public_key_decompress(public_key)

View Source

Specs

public_key_decompress(binary()) :: {:ok, binary()} | atom()

Decompresses public key

Examples

iex> public_key = <<2, 204, 170, 92, 229, 234, 207, 153, 33, 250, 27, 208, 37, 71, 183, 155, 104, 155, 45, 114, 7, 156, 83, 199, 245, 83, 32, 128, 45, 174, 96, 24, 38>>
iex> {:ok, _result} = ExSecp256k1.public_key_decompress(public_key)
Link to this function

public_key_tweak_add(public_key, tweak_key)

View Source

Specs

public_key_tweak_add(binary(), binary()) :: {:ok, binary()} | atom()

Tweak public key by adding to it

Examples

iex> public_key = <<4, 204, 170, 92, 229, 234, 207, 153, 33, 250, 27, 208, 37, 71, 183, 155, 104, 155, 45, 114, 7, 156, 83, 199, 245, 83, 32, 128, 45, 174, 96, 24, 38, 220, 210, 198, 20, 132, 174, 75, 63, 131, 95, 120, 101, 186, 93, 179, 95, 14, 206, 46, 48, 6, 129, 8, 146, 40, 135, 251, 42, 71, 4, 83, 222>>
iex> tweak_key = <<50, 8, 92, 222, 223, 155, 132, 50, 53, 227, 114, 79, 88, 11, 248, 24, 239, 76, 236, 39, 195, 198, 112, 133, 224, 41, 65, 138, 91, 47, 111, 43>>
iex> {:ok, _result} = ExSecp256k1.public_key_tweak_add(public_key, tweak_key)
Link to this function

public_key_tweak_mult(public_key, tweak_key)

View Source

Specs

public_key_tweak_mult(binary(), binary()) :: {:ok, binary()} | atom()

Tweak public key by multiplying it

Examples

iex> public_key = <<4, 204, 170, 92, 229, 234, 207, 153, 33, 250, 27, 208, 37, 71, 183, 155, 104, 155, 45, 114, 7, 156, 83, 199, 245, 83, 32, 128, 45, 174, 96, 24, 38, 220, 210, 198, 20, 132, 174, 75, 63, 131, 95, 120, 101, 186, 93, 179, 95, 14, 206, 46, 48, 6, 129, 8, 146, 40, 135, 251, 42, 71, 4, 83, 222>>
iex> tweak_key = <<50, 8, 92, 222, 223, 155, 132, 50, 53, 227, 114, 79, 88, 11, 248, 24, 239, 76, 236, 39, 195, 198, 112, 133, 224, 41, 65, 138, 91, 47, 111, 43>>
iex> {:ok, _result} = ExSecp256k1.public_key_tweak_mult(public_key, tweak_key)
Link to this function

recover(hash, r, s, recovery_id)

View Source

Specs

recover(binary(), binary(), binary(), non_neg_integer()) ::
  {:ok, binary()} | error()

Recover public key from a message, its signature and a recovery id

Examples

iex> hash = <<218, 245, 167, 121, 174, 151, 47, 151, 33, 151, 48, 61, 123, 87, 71, 70, 199, 239, 131, 234, 218, 192, 242, 121, 26, 210, 61, 185, 46, 76, 142, 83>>
iex> r = <<40, 239, 97, 52, 11, 217, 57, 188, 33, 149, 254, 83, 117, 103, 134, 96, 3, 225, 161, 93, 60, 113, 255, 99, 225, 89, 6, 32, 170, 99, 98, 118>>
iex> s = <<103, 203, 233, 216, 153, 127, 118, 26, 236, 183, 3, 48, 75, 56, 0, 204, 245, 85, 201, 243, 220, 100, 33, 75, 41, 127, 177, 150, 106, 59, 109, 131>>
iex> recovery_id = 0
iex> {:ok, _public_key_binary} = ExSecp256k1.recover(hash, r, s, recovery_id)
iex> {:error, :recovery_failure} = ExSecp256k1.recover(hash, r, s, 2)
Link to this function

recover_compact(hash, signature, recovery_id)

View Source

Specs

recover_compact(binary(), binary(), non_neg_integer()) ::
  {:ok, binary()} | error()

Recover public key from a message, its compact signature and a recovery id

Examples

iex> hash = <<218, 245, 167, 121, 174, 151, 47, 151, 33, 151, 48, 61, 123, 87, 71, 70, 199, 239, 131, 234, 218, 192, 242, 121, 26, 210, 61, 185, 46, 76, 142, 83>>
iex> r = <<40, 239, 97, 52, 11, 217, 57, 188, 33, 149, 254, 83, 117, 103, 134, 96, 3, 225, 161, 93, 60, 113, 255, 99, 225, 89, 6, 32, 170, 99, 98, 118>>
iex> s = <<103, 203, 233, 216, 153, 127, 118, 26, 236, 183, 3, 48, 75, 56, 0, 204, 245, 85, 201, 243, 220, 100, 33, 75, 41, 127, 177, 150, 106, 59, 109, 131>>
iex> recovery_id = 0
iex> {:ok, _public_key_binary} = ExSecp256k1.recover_compact(hash, r <> s, recovery_id)
iex> {:error, :recovery_failure} = ExSecp256k1.recover_compact(hash, r <>  s, 2)
Link to this function

sign(message, private_key)

View Source

Specs

sign(binary(), binary()) ::
  {:ok, {binary(), binary(), non_neg_integer()}} | error()

Sign a message with the provided private key

Examples

iex> message = <<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2>>
iex> private_key = <<120, 128, 174, 201, 52, 19, 241, 23, 239, 20, 189, 78, 109, 19, 8, 117, 171, 44, 125, 125, 85, 160, 100, 250, 195, 194, 247, 189, 81, 81, 99, 128>>
iex> {:ok, {_r_binary, _s_binary, _recovery_id_int}} = ExSecp256k1.sign(message, private_key)
Link to this function

sign_compact(message, private_key)

View Source

Specs

sign_compact(binary(), binary()) ::
  {:ok, {binary(), non_neg_integer()}} | error()

Sign a message with the provided private key. It returns a compact signature

Examples

iex> message = <<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2>>
iex> private_key = <<120, 128, 174, 201, 52, 19, 241, 23, 239, 20, 189, 78, 109, 19, 8, 117, 171, 44, 125, 125, 85, 160, 100, 250, 195, 194, 247, 189, 81, 81, 99, 128>>
iex> {:ok, {_signature_bin, _recovery_id_int}} = ExSecp256k1.sign_compact(message, private_key)
Link to this function

verify(message, signature, public_key)

View Source

Specs

verify(binary(), binary(), binary()) :: :ok | error()

Verify a signature of a message

Examples

iex> message = :crypto.strong_rand_bytes(32)
iex> private_key = :crypto.strong_rand_bytes(32)
iex> {:ok, {signature, _r}} = ExSecp256k1.sign_compact(message, private_key)
iex> {:ok, public_key} = ExSecp256k1.create_public_key(private_key)
iex> :ok = ExSecp256k1.verify(message, signature, public_key)