defmodule Vuforex.Signature do @moduledoc false @hex_digest "d41d8cd98f00b204e9800998ecf8427e" @server_secret_key Application.compile_env!(:vuforex, :server_secret_key) @spec generate(String.t(), String.t() | nil, String.t(), String.t()) :: any() @doc """ Generates the signature based on path, body, http verb and time. ## Examples iex> Vuforex.Signature.generate("/summary", nil, "GET", "Sun, 25 Apr 2021 17:34:44 GMT") "JLJTY+J/6O6FpXsY4t3CbGRwmOc=" """ def generate(path, body, verb, time) when body in ["POST", "PUT"] do hex_digest = :crypto.hash(:md5, Jason.encode!(body)) |> Base.encode16() to_digest = "#{verb}\n#{hex_digest}\napplication/json\n#{time}\n#{path}" to_digest |> do_generate_hash() end def generate(path, _body, verb, time) do to_digest = "#{verb}\n#{@hex_digest}\n\n#{time}\n#{path}" to_digest |> do_generate_hash() end defp do_generate_hash(to_digest) do :crypto.hmac(:sha, @server_secret_key, to_digest) |> Base.encode64() end end