defmodule RSA do
def decrypt_priv(text, key, b64 \\ false) do
text = if b64, do: :base64.decode(text) ,else: text
:public_key.decrypt_private(text,ensure_asn1(key))
end
def decrypt_pub(text, key, b64 \\ false) do
text = if b64, do: :base64.decode(text) ,else: text
:public_key.decrypt_public(text,ensure_asn1(key))
end
def encrypt_priv(text, key, b64 \\ false) do
r = :public_key.encrypt_private(text,ensure_asn1(key))
if b64, do: :base64.encode_to_string(r) ,else: r
end
def encrypt_pub(text, key, b64 \\ false) do
r = :public_key.encrypt_public(text,ensure_asn1(key))
if b64, do: :base64.encode_to_string(r) ,else: r
end
def sign(msg, priv, b64 \\ false) do
r = :public_key.sign(msg, :sha256, ensure_asn1(priv))
if b64, do: :base64.encode_to_string(r) ,else: r
end
def verify(msg, sign, pub, b64 \\ false) do
sign = if b64, do: :base64.decode(sign) ,else: sign
:public_key.verify(msg, :sha256, sign, ensure_asn1(pub))
end
#CONVERT PEM TO ASN1
defp ensure_asn1(key) do
if is_tuple(key) do
key
else
from_pem(key)
end
end
def from_pem(text) do
[entry] = :public_key.pem_decode(text)
:public_key.pem_entry_decode(entry)
end
def generate_pair(x \\ "2048") do
#https://github.com/elefthei/krypto
publicKey = "ExPublicKey.pem"
privateKey = "ExPrivateKey.pem"
{_, 0} = System.cmd "openssl", [ "genrsa", "-out", privateKey, x], [stderr_to_stdout: true]
{_, 0} = System.cmd "openssl", [ "rsa", "-pubout", "-in" , privateKey, "-out", publicKey ], [stderr_to_stdout: true]
{:ok, priv} = File.read(privateKey)
{:ok, pub} = File.read(publicKey)
# Overwrite with random to ensure non-retrieval of keys
File.copy("/dev/random", privateKey, byte_size(priv))
File.copy("/dev/random", publicKey, byte_size(pub))
{_, 0} = System.cmd "rm", ["-f", privateKey]
{_, 0} = System.cmd "rm", ["-f", publicKey]
{priv,pub}
end
end