Current section
Files
Jump to
Current section
Files
src/hypersig@digest.erl
-module(hypersig@digest).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/hypersig/digest.gleam").
-export([to_string/1, from_string/1, with_method/2, new/1, verify/2, parse_header/1, verify_header/2]).
-export_type([digest/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type digest() :: {digest, gleam@crypto:hash_algorithm(), bitstring()}.
-file("src/hypersig/digest.gleam", 19).
-spec method_to_string(gleam@crypto:hash_algorithm()) -> binary().
method_to_string(Alg) ->
case Alg of
md5 ->
<<"md5"/utf8>>;
sha1 ->
<<"sha-1"/utf8>>;
sha224 ->
<<"sha-224"/utf8>>;
sha256 ->
<<"sha-256"/utf8>>;
sha384 ->
<<"sha-384"/utf8>>;
sha512 ->
<<"sha-512"/utf8>>
end.
-file("src/hypersig/digest.gleam", 30).
-spec method_from_string(binary()) -> {ok, gleam@crypto:hash_algorithm()} |
{error, hypersig@error:hyper_error()}.
method_from_string(Alg) ->
case Alg of
<<"md5"/utf8>> ->
{ok, md5};
<<"sha-1"/utf8>> ->
{ok, sha1};
<<"sha-224"/utf8>> ->
{ok, sha224};
<<"sha-256"/utf8>> ->
{ok, sha256};
<<"sha-384"/utf8>> ->
{ok, sha384};
<<"sha-512"/utf8>> ->
{ok, sha512};
_ ->
{error, unsupported_digest}
end.
-file("src/hypersig/digest.gleam", 44).
-spec to_string(digest()) -> binary().
to_string(Header) ->
<<<<(method_to_string(erlang:element(2, Header)))/binary, "="/utf8>>/binary,
(gleam@bit_array:base64_url_encode(erlang:element(3, Header), true))/binary>>.
-file("src/hypersig/digest.gleam", 50).
-spec from_string(binary()) -> {ok, digest()} |
{error, hypersig@error:hyper_error()}.
from_string(Header) ->
gleam@result:'try'(
begin
_pipe = gleam@string:split_once(Header, <<"="/utf8>>),
gleam@result:replace_error(_pipe, digest_parse)
end,
fun(_use0) ->
{Method, Digest} = _use0,
gleam@result:'try'(
method_from_string(Method),
fun(Method@1) ->
gleam@result:'try'(
begin
_pipe@1 = gleam@bit_array:base64_url_decode(Digest),
gleam@result:replace_error(_pipe@1, digest_parse)
end,
fun(Digest@1) -> {ok, {digest, Method@1, Digest@1}} end
)
end
)
end
).
-file("src/hypersig/digest.gleam", 71).
?DOC(" Hashes the data with the given method and creates a Digest object\n").
-spec with_method(gleam@crypto:hash_algorithm(), bitstring()) -> digest().
with_method(Method, Data) ->
Digest = gleam@crypto:hash(Method, Data),
{digest, Method, Digest}.
-file("src/hypersig/digest.gleam", 66).
?DOC(" Hashes the data using Sha256 and creates a Digest object\n").
-spec new(bitstring()) -> digest().
new(Data) ->
with_method(sha256, Data).
-file("src/hypersig/digest.gleam", 78).
?DOC(" Verifies the given digest object matches the given data\n").
-spec verify(digest(), bitstring()) -> boolean().
verify(Digest, Data) ->
Other = with_method(erlang:element(2, Digest), Data),
Other =:= Digest.
-file("src/hypersig/digest.gleam", 84).
-spec parse_header(binary()) -> {ok, list(digest())} |
{error, hypersig@error:hyper_error()}.
parse_header(Header) ->
_pipe = gleam@string:split(Header, <<","/utf8>>),
_pipe@1 = gleam@list:map(_pipe, fun from_string/1),
_pipe@2 = gleam@result:all(_pipe@1),
gleam@result:replace_error(_pipe@2, digest_parse).
-file("src/hypersig/digest.gleam", 92).
?DOC(" Verify all digests in a given header against the given data\n").
-spec verify_header(list(digest()), bitstring()) -> boolean().
verify_header(Header, Data) ->
gleam@list:all(Header, fun(_capture) -> verify(_capture, Data) end).