Skip to content

Repository files navigation

Elliptic Curve Cryptography (ECC) for Elixir [travis]

An elixir library for elliptic curve cryptography (MIT License). You can use it to sign messages and to verify signatures with a public key.

Generate public key pair

Use an existing elliptic curve public key pair or generate one using openssl (adapt the curve name according to your needs):

openssl ecparam -out ec_private_key.pem -name secp521r1 -genkey
openssl ec -in ec_private_key.pem -pubout -out ec_public_key.pem

Install

Simply add {:ecc, "~>0.1.0"} to the dependencies in your projects mix.exs file and run mix deps.get ecc

Use as GenServer-Module

ECC is a GenServer-Module. You can start a new process passing in both the private and the public key combined in one (still pem-style) string:

pem_public=File.read!("ec_public_key.pem")pem_private=File.read!("ec_private_key.pem")pem=Enum.join([pem_public,pem_private]){:ok,_}=ECC.start_link(pem,:ecc){:ok,signature}=GenServer.call(:ecc,{:sign,"Hello",:sha512})public_key=GenServer.call(:ecc,:get_public_key){:ok,result}=GenServer.call(:ecc,{:verify_signature,"Hello",signature,public_key,:sha512})IO.puts("Hello == Hello? #{result}")# true{:ok,result}=GenServer.call(:ecc,{:verify_signature,"World",signature,public_key,:sha512})IO.puts("Hello == World? #{result}")# false

Use as a library

You can also use ECC.Crypto as a library. The pem-string passed to ECC.Crypto.parse_public_key/1 needs to additionally include an EC PARAMETERS section. In the example, we therefore join both pems to one string:

pem_public=File.read!("ec_public_key.pem")pem_private=File.read!("ec_private_key.pem")pem=Enum.join([pem_public,pem_private]){:ok,public_key}=ECC.Crypto.parse_public_key(pem){:ok,private_key}=ECC.Crypto.parse_private_key(pem){:ok,signature}=ECC.Crypto.sign("Hello",:sha512,private_key){:ok,result}=ECC.Crypto.verify_signature("Hello",signature,:sha512,public_key)IO.puts("Hello == Hello? #{result}")# true{:ok,result}=ECC.Crypto.verify_signature("World",signature,:sha512,public_key)IO.puts("Hello == World? #{result}")# false

About

An elixir module for elliptic curve cryptography

Resources

Stars

20 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages