lib/starcoin/signing_key.ex

defmodule Web3MoveEx.Starcoin.SigningKey do
  @moduledoc """
  An Ed25519 keypair.
  """

  import Web3MoveEx.Starcoin.Helpers

  defstruct [
    :private_key,
    :public_key
  ]

  def new() do
    {public_key, private_key} = ed25519_new()

    {:ok,
     %__MODULE__{
       private_key: private_key,
       public_key: public_key
     }}
  end

  def new(private_key) do
    with {:ok, private_key} <- normalize_key(private_key) do
      public_key = ed25519_public_key(private_key)

      {:ok,
       %__MODULE__{
         private_key: private_key,
         public_key: public_key
       }}
    end
  end

  def ed25519_new() do
    :crypto.generate_key(:eddsa, :ed25519)
  end

  def ed25519_new(private_key) do
    :crypto.generate_key(:eddsa, :ed25519, private_key)
  end

  def ed25519_public_key(private_key) do
    {public_key, _} = ed25519_new(private_key)
    public_key
  end
end