View Source ExSecp256k1 (ExSecp256k1 v0.7.1)

NIF for secp256k1 curve functions.

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

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

Types

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

Functions

Link to this function

create_public_key(private_key)

View Source
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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
@spec 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)