Current section
Files
Jump to
Current section
Files
src/munch@internal@md5.erl
-module(munch@internal@md5).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/munch/internal/md5.gleam").
-export([new/0]).
-export_type([state/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.
?MODULEDOC(false).
-opaque state() :: {state,
integer(),
integer(),
integer(),
integer(),
bitstring(),
integer()}.
-file("src/munch/internal/md5.gleam", 15).
?DOC(false).
-spec f(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
f(A, B, C, D, K, M, S) ->
X = munch@internal@bitwise:'xor'(
D,
munch@internal@bitwise:'band'(B, munch@internal@bitwise:'xor'(C, D))
),
munch@internal@bitwise:'band'(
B + munch@internal@bitwise:rol(
munch@internal@bitwise:'band'(((A + X) + K) + M, 16#ffffffff),
S
),
16#ffffffff
).
-file("src/munch/internal/md5.gleam", 20).
?DOC(false).
-spec g(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
g(A, B, C, D, K, M, S) ->
X = munch@internal@bitwise:'xor'(
C,
munch@internal@bitwise:'band'(D, munch@internal@bitwise:'xor'(B, C))
),
munch@internal@bitwise:'band'(
B + munch@internal@bitwise:rol(
munch@internal@bitwise:'band'(((A + X) + K) + M, 16#ffffffff),
S
),
16#ffffffff
).
-file("src/munch/internal/md5.gleam", 25).
?DOC(false).
-spec h(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
h(A, B, C, D, K, M, S) ->
X = munch@internal@bitwise:'xor'(munch@internal@bitwise:'xor'(B, C), D),
munch@internal@bitwise:'band'(
B + munch@internal@bitwise:rol(
munch@internal@bitwise:'band'(((A + X) + K) + M, 16#ffffffff),
S
),
16#ffffffff
).
-file("src/munch/internal/md5.gleam", 30).
?DOC(false).
-spec i(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
i(A, B, C, D, K, M, S) ->
X = munch@internal@bitwise:'xor'(
C,
munch@internal@bitwise:'bor'(B, munch@internal@bitwise:'bnot'(D))
),
munch@internal@bitwise:'band'(
B + munch@internal@bitwise:rol(
munch@internal@bitwise:'band'(((A + X) + K) + M, 16#ffffffff),
S
),
16#ffffffff
).
-file("src/munch/internal/md5.gleam", 65).
?DOC(false).
-spec blocks(integer(), integer(), integer(), integer(), bitstring()) -> {integer(),
integer(),
integer(),
integer(),
bitstring()}.
blocks(Oa, Ob, Oc, Od, Data) ->
case Data of
<<M0:32/little,
M1:32/little,
M2:32/little,
M3:32/little,
M4:32/little,
M5:32/little,
M6:32/little,
M7:32/little,
M8:32/little,
M9:32/little,
M10:32/little,
M11:32/little,
M12:32/little,
M13:32/little,
M14:32/little,
M15:32/little,
Rest/bitstring>> ->
A = Oa,
B = Ob,
C = Oc,
D = Od,
A@1 = f(A, B, C, D, 16#D76AA478, M0, 7),
D@1 = f(D, A@1, B, C, 16#E8C7B756, M1, 12),
C@1 = f(C, D@1, A@1, B, 16#242070DB, M2, 17),
B@1 = f(B, C@1, D@1, A@1, 16#C1BDCEEE, M3, 22),
A@2 = f(A@1, B@1, C@1, D@1, 16#F57C0FAF, M4, 7),
D@2 = f(D@1, A@2, B@1, C@1, 16#4787C62A, M5, 12),
C@2 = f(C@1, D@2, A@2, B@1, 16#A8304613, M6, 17),
B@2 = f(B@1, C@2, D@2, A@2, 16#FD469501, M7, 22),
A@3 = f(A@2, B@2, C@2, D@2, 16#698098D8, M8, 7),
D@3 = f(D@2, A@3, B@2, C@2, 16#8B44F7AF, M9, 12),
C@3 = f(C@2, D@3, A@3, B@2, 16#FFFF5BB1, M10, 17),
B@3 = f(B@2, C@3, D@3, A@3, 16#895CD7BE, M11, 22),
A@4 = f(A@3, B@3, C@3, D@3, 16#6B901122, M12, 7),
D@4 = f(D@3, A@4, B@3, C@3, 16#FD987193, M13, 12),
C@4 = f(C@3, D@4, A@4, B@3, 16#A679438E, M14, 17),
B@4 = f(B@3, C@4, D@4, A@4, 16#49B40821, M15, 22),
A@5 = g(A@4, B@4, C@4, D@4, 16#F61E2562, M1, 5),
D@5 = g(D@4, A@5, B@4, C@4, 16#C040B340, M6, 9),
C@5 = g(C@4, D@5, A@5, B@4, 16#265E5A51, M11, 14),
B@5 = g(B@4, C@5, D@5, A@5, 16#E9B6C7AA, M0, 20),
A@6 = g(A@5, B@5, C@5, D@5, 16#D62F105D, M5, 5),
D@6 = g(D@5, A@6, B@5, C@5, 16#02441453, M10, 9),
C@6 = g(C@5, D@6, A@6, B@5, 16#D8A1E681, M15, 14),
B@6 = g(B@5, C@6, D@6, A@6, 16#E7D3FBC8, M4, 20),
A@7 = g(A@6, B@6, C@6, D@6, 16#21E1CDE6, M9, 5),
D@7 = g(D@6, A@7, B@6, C@6, 16#C33707D6, M14, 9),
C@7 = g(C@6, D@7, A@7, B@6, 16#F4D50D87, M3, 14),
B@7 = g(B@6, C@7, D@7, A@7, 16#455A14ED, M8, 20),
A@8 = g(A@7, B@7, C@7, D@7, 16#A9E3E905, M13, 5),
D@8 = g(D@7, A@8, B@7, C@7, 16#FCEFA3F8, M2, 9),
C@8 = g(C@7, D@8, A@8, B@7, 16#676F02D9, M7, 14),
B@8 = g(B@7, C@8, D@8, A@8, 16#8D2A4C8A, M12, 20),
A@9 = h(A@8, B@8, C@8, D@8, 16#FFFA3942, M5, 4),
D@9 = h(D@8, A@9, B@8, C@8, 16#8771F681, M8, 11),
C@9 = h(C@8, D@9, A@9, B@8, 16#6D9D6122, M11, 16),
B@9 = h(B@8, C@9, D@9, A@9, 16#FDE5380C, M14, 23),
A@10 = h(A@9, B@9, C@9, D@9, 16#A4BEEA44, M1, 4),
D@10 = h(D@9, A@10, B@9, C@9, 16#4BDECFA9, M4, 11),
C@10 = h(C@9, D@10, A@10, B@9, 16#F6BB4B60, M7, 16),
B@10 = h(B@9, C@10, D@10, A@10, 16#BEBFBC70, M10, 23),
A@11 = h(A@10, B@10, C@10, D@10, 16#289B7EC6, M13, 4),
D@11 = h(D@10, A@11, B@10, C@10, 16#EAA127FA, M0, 11),
C@11 = h(C@10, D@11, A@11, B@10, 16#D4EF3085, M3, 16),
B@11 = h(B@10, C@11, D@11, A@11, 16#04881D05, M6, 23),
A@12 = h(A@11, B@11, C@11, D@11, 16#D9D4D039, M9, 4),
D@12 = h(D@11, A@12, B@11, C@11, 16#E6DB99E5, M12, 11),
C@12 = h(C@11, D@12, A@12, B@11, 16#1FA27CF8, M15, 16),
B@12 = h(B@11, C@12, D@12, A@12, 16#C4AC5665, M2, 23),
A@13 = i(A@12, B@12, C@12, D@12, 16#F4292244, M0, 6),
D@13 = i(D@12, A@13, B@12, C@12, 16#432AFF97, M7, 10),
C@13 = i(C@12, D@13, A@13, B@12, 16#AB9423A7, M14, 15),
B@13 = i(B@12, C@13, D@13, A@13, 16#FC93A039, M5, 21),
A@14 = i(A@13, B@13, C@13, D@13, 16#655B59C3, M12, 6),
D@14 = i(D@13, A@14, B@13, C@13, 16#8F0CCC92, M3, 10),
C@14 = i(C@13, D@14, A@14, B@13, 16#FFEFF47D, M10, 15),
B@14 = i(B@13, C@14, D@14, A@14, 16#85845DD1, M1, 21),
A@15 = i(A@14, B@14, C@14, D@14, 16#6FA87E4F, M8, 6),
D@15 = i(D@14, A@15, B@14, C@14, 16#FE2CE6E0, M15, 10),
C@15 = i(C@14, D@15, A@15, B@14, 16#A3014314, M6, 15),
B@15 = i(B@14, C@15, D@15, A@15, 16#4E0811A1, M13, 21),
A@16 = i(A@15, B@15, C@15, D@15, 16#F7537E82, M4, 6),
D@16 = i(D@15, A@16, B@15, C@15, 16#BD3AF235, M11, 10),
C@16 = i(C@15, D@16, A@16, B@15, 16#2AD7D2BB, M2, 15),
B@16 = i(B@15, C@16, D@16, A@16, 16#EB86D391, M9, 21),
blocks(
munch@internal@bitwise:'band'(Oa + A@16, 16#ffffffff),
munch@internal@bitwise:'band'(Ob + B@16, 16#ffffffff),
munch@internal@bitwise:'band'(Oc + C@16, 16#ffffffff),
munch@internal@bitwise:'band'(Od + D@16, 16#ffffffff),
Rest
);
Rest@1 ->
{Oa, Ob, Oc, Od, Rest@1}
end.
-file("src/munch/internal/md5.gleam", 51).
?DOC(false).
-spec finish(state()) -> bitstring().
finish(State) ->
{state, A, B, C, D, Buffer, Length} = State,
Used = (erlang:bit_size(Buffer) + 1) rem 512,
Zeros = ((448 + 512) - Used) rem 512,
Padded = <<Buffer/bitstring,
1:1,
0:(erlang:max(0, Zeros)),
Length:64/little>>,
{A@1, B@1, C@1, D@1, _} = blocks(A, B, C, D, Padded),
<<A@1:32/little, B@1:32/little, C@1:32/little, D@1:32/little>>.
-file("src/munch/internal/md5.gleam", 44).
?DOC(false).
-spec update(state(), bitstring()) -> state().
update(State, Data) ->
{state, A, B, C, D, Buffer, Length} = State,
Length@1 = Length + erlang:bit_size(Data),
{A@1, B@1, C@1, D@1, Buffer@1} = blocks(
A,
B,
C,
D,
<<Buffer/bitstring, Data/bitstring>>
),
{state, A@1, B@1, C@1, D@1, Buffer@1, Length@1}.
-file("src/munch/internal/md5.gleam", 39).
?DOC(false).
-spec new() -> munch@internal@hash:hash().
new() ->
State = {state, 16#67452301, 16#efcdab89, 16#98badcfe, 16#10325476, <<>>, 0},
munch@internal@hash:from(State, fun update/2, fun finish/1).