defmodule ExSecrets.AwsSecretsManager.Auth.Utils do @moduledoc false alias ExSecrets.AwsSecretsManager.Request.Url def uri_encode(url), do: Url.uri_encode(url) def hash_sha256(data) do :sha256 |> :crypto.hash(data) |> bytes_to_hex end Code.ensure_loaded?(:crypto) || IO.warn(":crypto module failed to load") case function_exported?(:crypto, :mac, 4) do true -> def hmac_sha256(key, data), do: :crypto.mac(:hmac, :sha256, key, data) false -> def hmac_sha256(key, data), do: :crypto.hmac(:sha256, key, data) end def bytes_to_hex(bytes) do bytes |> Base.encode16(case: :lower) end def service_name(service), do: service |> Atom.to_string() def method_string(method) do method |> Atom.to_string() |> String.upcase() end def date({date, _time}) do date |> quasi_iso_format end def amz_date({date, time}) do date = date |> quasi_iso_format time = time |> quasi_iso_format [date, "T", time, "Z"] |> IO.iodata_to_binary() end def quasi_iso_format({y, m, d}) do [y, m, d] |> Enum.map(&Integer.to_string/1) |> Enum.map(&zero_pad/1) end defp zero_pad(<<_>> = val), do: "0" <> val defp zero_pad(val), do: val end