defmodule HmCrypto do import HmCrypto.PublicKey @rsa_digest_types ~w(md5 ripemd160 sha sha224 sha256 sha384 sha512)a @moduledoc """ Main functional API of `HmCrypto` application. Provides signing and validation functionality. """ @doc """ Returns list of availiable digest types. ## Examples ``` iex> HmCrypto.rsa_digest_types [:md5, :ripemd160, :sha, :sha224, :sha256, :sha384, :sha512] ``` """ def rsa_digest_types, do: @rsa_digest_types @doc """ Generates base64-encoded signature of payload according given digest_type and private_key. ## Usage ``` signature = HmCrypto.sign!(payload, :sha512, priv_key) "XE54doOCtx+z2h9gILOHPKP8+RTnvQVAPUoKpux2PLZUBX2JVIaS3vNewQM6IpxvMzfewWm1H6j+SPbhhGpvcp3MiGo8426KlGoqg6jjuILAQ4jXzYrTa6HFBXhuk+Y34e0Hv1FKwbmVYXvn5RTmgYfI6vzA4spOoG/AMIis6hpnNE5lTsjHU76QtcVWJPfJKk2wDiZI9u2EWLGEq1BJuCfbZYSueNVe2aDqbZ7UANybyZsSHa1oPY6nP+FS5wm3zrKEdMV2PBGi63STg4WabBaaaB6s73GAA0IVogcysVtGKJ8vN17ion5zT6+r62DEHNGNGscjV7HTJd1tNNG9Iw==" ``` """ def sign!(payload, digest_type, private_key) when is_binary(payload) and (digest_type in @rsa_digest_types) do payload |> :public_key.sign(digest_type, parse_pem(private_key)) |> Base.encode64 end @doc """ Validates base64-encoded signature according given payload, digest_type and public_key. Returns `true` if signature is valid, else returns `false`. ## Usage ``` HmCrypto.valid?(payload, signature, :sha512, public_key) true ``` """ def valid?(payload, encoded_signature, digest_type, public_key) when is_binary(payload) and is_binary(encoded_signature) and (digest_type in @rsa_digest_types) do encoded_signature |> Base.decode64(ignore: :whitespace) |> case do {:ok, signature} -> :public_key.verify(payload, digest_type, signature, parse_pem(public_key)) _ -> false end end end