Current section

Files

Jump to
mcrypto lib mcrypto signer secp256k1.ex
Raw

lib/mcrypto/signer/secp256k1.ex

defmodule Mcrypto.Signer.Secp256k1 do
@moduledoc """
support Secp256k1 algo
"""
use TypedStruct
@typedoc """
Secp256k1 data structure contains the following keys:
* `:name`: signer name
"""
typedstruct do
field(:name, atom(), default: :secp256k1)
end
end
defimpl Mcrypto.Signer, for: Mcrypto.Signer.Secp256k1 do
def keypair(signer) do
sk = :crypto.strong_rand_bytes(32)
pk = sk_to_pk(signer, sk)
{pk, sk}
end
def sk_to_pk(_signer, sk) do
{:ok, pk} = :libsecp256k1.ec_pubkey_create(sk, :uncompressed)
pk
end
def sign!(_signer, data, sk) do
{:ok, signature} = :libsecp256k1.ecdsa_sign(data, sk, :default, <<>>)
signature
end
def verify(_signer, data, signature, pk) do
case :libsecp256k1.ecdsa_verify(data, signature, pk) do
:ok -> true
_ -> false
end
end
end