Packages
drab
0.5.1
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.6.0-pre.1
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Remote controlled frontend framework for Phoenix.
Current section
Files
Jump to
Current section
Files
lib/drab/live/crypto.ex
defmodule Drab.Live.Crypto do
@moduledoc false
alias Plug.Crypto.KeyGenerator
alias Plug.Crypto.MessageEncryptor
def uuid(), do: "u" <> ({now_ms(), make_ref()} |> hash())
# The most effective way for store assigns in the browser is basic encode
@doc false
def encode32(term) do
term |> :erlang.term_to_binary() |> Base.encode32(padding: false, case: :lower)
end
@doc false
def decode32(string) do
string |> Base.decode32!(padding: false, case: :lower) |> :erlang.binary_to_term()
end
@doc false
def encode64(term) do
term |> :erlang.term_to_binary() |> Base.url_encode64()
end
@doc false
def decode64(string) do
string |> Base.url_decode64!() |> :erlang.binary_to_term()
end
@doc false
def encrypt(term) do
{secret, sign_secret} = keys()
MessageEncryptor.encrypt(term, secret, sign_secret)
end
@doc false
def decrypt(crypted) do
{secret, sign_secret} = keys()
{:ok, decrypted} = MessageEncryptor.decrypt(crypted, secret, sign_secret)
decrypted
end
@doc false
defp keys() do
secret_key_base = Drab.Config.app_config(:secret_key_base)
secret = KeyGenerator.generate(secret_key_base, "Drab.Live.Crypto salt")
sign_secret = KeyGenerator.generate(secret_key_base, "Drab.Live.Crypto sign salt")
{secret, sign_secret}
end
defp now_ms(), do: System.system_time(:milli_seconds)
@doc false
def hash(term) do
:erlang.phash2(term) |> to_string() |> Base.encode32(padding: false, case: :lower)
end
end