Packages
ex_aws
2.2.5
2.7.0
2.6.1
2.6.0
2.5.11
2.5.10
2.5.9
2.5.8
2.5.7
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.1
1.0.0-beta3
1.0.0-beta2
1.0.0-beta1
1.0.0-beta0
0.5.0
0.4.19
0.4.18
0.4.17
0.4.15
0.4.14
0.4.13
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
AWS client for Elixir. Currently supports Dynamo, DynamoStreams, EC2, Firehose, Kinesis, KMS, Lambda, RRDS, Route53, S3, SES, SNS, SQS, STS and others.
Current section
Files
Jump to
Current section
Files
lib/ex_aws/auth/utils.ex
defmodule ExAws.Auth.Utils do
@moduledoc false
def uri_encode(url), do: ExAws.Request.Url.uri_encode(url)
def hash_sha256(data) do
:sha256
|> :crypto.hash(data)
|> bytes_to_hex
end
# :crypto.mac/4 is introduced in Erlang/OTP 22.1 and :crypto.hmac/3 is removed
# in Erlang/OTP 24. The check is needed for backwards compatibility.
# The Code.ensure_loaded/1 call is executed so function_expored?/3 can be used
# to determine which function to use.
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