Packages
elixium_core
0.2.2
0.6.3
0.6.2
0.6.1
0.6.0
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
The core package for the Elixium blockchain, containing all the modules needed to run the chain
Current section
Files
Jump to
Current section
Files
lib/keypair.ex
defmodule Elixium.KeyPair do
@algorithm :ecdh
@sigtype :ecdsa
@curve :secp256k1
@hashtype :sha256
@moduledoc """
All the functions responsible for creating keypairs and using them to sign data / verify signatures
"""
@doc """
Creates a new keypair and stores the private key in a keyfile. Returns the public and private key
"""
@spec create_keypair :: {binary, binary}
def create_keypair do
keypair = :crypto.generate_key(@algorithm, @curve)
keypair |> create_keyfile
keypair
end
@doc """
Reads in a private key from the given file, and returns a tuple with the public and private key
"""
@spec get_from_file(String.t()) :: {binary, binary}
def get_from_file(path) do
{:ok, private} = File.read(path)
private
|> (fn pkey -> :crypto.generate_key(@algorithm, @curve, pkey) end).()
end
@spec create_keyfile(tuple) :: :ok | {:error, any}
defp create_keyfile({public, private}) do
if !File.dir?(".keys"), do: File.mkdir(".keys")
pub_hex = public |> Base.encode16()
File.write(".keys/#{pub_hex}.key", private)
end
@spec sign(binary, String.t()) :: String.t()
def sign(private_key, data) do
:crypto.sign(@sigtype, @hashtype, data, [private_key, @curve])
end
@spec verify_signature(binary, binary, String.t()) :: boolean
def verify_signature(public_key, signature, data) do
:crypto.verify(@sigtype, @hashtype, data, signature, [public_key, @curve])
end
end