Packages
drab
0.8.0
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
@doc false
@spec uuid :: String.t()
def uuid(), do: "u" <> hash({now_ms(), make_ref()})
# The most effective way for store assigns in the browser is basic encode
@doc false
@spec encode32(term) :: String.t()
def encode32(term) do
term |> :erlang.term_to_binary() |> Base.encode32(padding: false, case: :lower)
end
@doc false
@spec decode32(String.t()) :: term()
def decode32(string) do
string |> Base.decode32!(padding: false, case: :lower) |> :erlang.binary_to_term()
end
@doc false
@spec encode64(term) :: String.t()
def encode64(term) do
# term |> :erlang.term_to_binary() |> Base.url_encode64()
encrypt(term)
end
@doc false
@spec decode64(String.t()) :: term()
def decode64(string) do
# string |> Base.url_decode64!() |> :erlang.binary_to_term()
decrypt(string)
end
@doc false
@spec encrypt(term) :: String.t()
def encrypt(term) do
{secret, sign_secret} = keys()
MessageEncryptor.encrypt(:erlang.term_to_binary(term), secret, sign_secret)
end
@doc false
@spec decrypt(String.t()) :: term
def decrypt(crypted) do
{secret, sign_secret} = keys()
{:ok, decrypted} = MessageEncryptor.decrypt(crypted, secret, sign_secret)
:erlang.binary_to_term(decrypted)
end
@doc false
@spec keys :: {String.t(), String.t()}
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
@spec now_ms :: integer
defp now_ms(), do: System.system_time(:millisecond)
@doc false
@spec hash(term) :: String.t()
def hash(term) do
term
|> :erlang.phash2(4_294_967_296)
|> to_string()
|> Base.encode32(padding: false, case: :lower)
end
end