Packages

A replacement for gleam_crypto that works on all targets.

Current section

Files

Jump to
munch src munch@internal@sha1.erl
Raw

src/munch@internal@sha1.erl

-module(munch@internal@sha1).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/munch/internal/sha1.gleam").
-export([new/0]).
-export_type([round_function/0, 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).
-type round_function() :: choose | parity | majority.
-opaque state() :: {state,
integer(),
integer(),
integer(),
integer(),
integer(),
bitstring(),
integer()}.
-file("src/munch/internal/sha1.gleam", 15).
?DOC(false).
-spec f(integer(), integer(), integer(), integer()) -> integer().
f(W3, W8, W14, W16) ->
munch@internal@bitwise:rol(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(W3, W8),
W14
),
W16
),
1
).
-file("src/munch/internal/sha1.gleam", 19).
?DOC(false).
-spec ch(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
ch(A, B, C, D, E, S, W) ->
Ch = munch@internal@bitwise:'xor'(
munch@internal@bitwise:'band'(B, C),
munch@internal@bitwise:'band'(munch@internal@bitwise:'bnot'(B), D)
),
munch@internal@bitwise:'band'(
(((E + munch@internal@bitwise:rol(A, 5)) + Ch) + S) + W,
16#ffffffff
).
-file("src/munch/internal/sha1.gleam", 24).
?DOC(false).
-spec par(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
par(A, B, C, D, E, S, W) ->
munch@internal@bitwise:'band'(
(((E + munch@internal@bitwise:rol(A, 5)) + munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(B, C),
D
))
+ S)
+ W,
16#ffffffff
).
-file("src/munch/internal/sha1.gleam", 28).
?DOC(false).
-spec maj(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> integer().
maj(A, B, C, D, E, S, W) ->
Maj = munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'band'(B, C),
munch@internal@bitwise:'band'(B, D)
),
munch@internal@bitwise:'band'(C, D)
),
munch@internal@bitwise:'band'(
(((E + munch@internal@bitwise:rol(A, 5)) + Maj) + S) + W,
16#ffffffff
).
-file("src/munch/internal/sha1.gleam", 135).
?DOC(false).
-spec rounds(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
list({round_function(), integer()}),
bitstring()
) -> {integer(), integer(), integer(), integer(), integer(), bitstring()}.
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
A,
B,
C,
D,
E,
W0,
W1,
W2,
W3,
W4,
W5,
W6,
W7,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
Groups,
Data
) ->
case {Groups, Data} of
{[],
<<W0@1:32,
W1@1:32,
W2@1:32,
W3@1:32,
W4@1:32,
W5@1:32,
W6@1:32,
W7@1:32,
W8@1:32,
W9@1:32,
W10@1:32,
W11@1:32,
W12@1:32,
W13@1:32,
W14@1:32,
W15@1:32,
Rest/bitstring>>} ->
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
W0@1,
W1@1,
W2@1,
W3@1,
W4@1,
W5@1,
W6@1,
W7@1,
W8@1,
W9@1,
W10@1,
W11@1,
W12@1,
W13@1,
W14@1,
W15@1,
[{choose, 16#5A827999},
{choose, 16#5A827999},
{parity, 16#6ED9EBA1},
{parity, 16#6ED9EBA1},
{majority, 16#8F1BBCDC},
{majority, 16#8F1BBCDC},
{parity, 16#CA62C1D6},
{parity, 16#CA62C1D6}],
Rest
);
{[], Rest@1} ->
{Oh0, Oh1, Oh2, Oh3, Oh4, Rest@1};
{[{choose, S} | Groups@1], _} ->
E@1 = ch(A, B, C, D, E, S, W0),
B@1 = munch@internal@bitwise:rol(B, 30),
D@1 = ch(E@1, A, B@1, C, D, S, W1),
A@1 = munch@internal@bitwise:rol(A, 30),
C@1 = ch(D@1, E@1, A@1, B@1, C, S, W2),
E@2 = munch@internal@bitwise:rol(E@1, 30),
B@2 = ch(C@1, D@1, E@2, A@1, B@1, S, W3),
D@2 = munch@internal@bitwise:rol(D@1, 30),
A@2 = ch(B@2, C@1, D@2, E@2, A@1, S, W4),
C@2 = munch@internal@bitwise:rol(C@1, 30),
E@3 = ch(A@2, B@2, C@2, D@2, E@2, S, W5),
B@3 = munch@internal@bitwise:rol(B@2, 30),
D@3 = ch(E@3, A@2, B@3, C@2, D@2, S, W6),
A@3 = munch@internal@bitwise:rol(A@2, 30),
C@3 = ch(D@3, E@3, A@3, B@3, C@2, S, W7),
E@4 = munch@internal@bitwise:rol(E@3, 30),
B@4 = ch(C@3, D@3, E@4, A@3, B@3, S, W8),
D@4 = munch@internal@bitwise:rol(D@3, 30),
A@4 = ch(B@4, C@3, D@4, E@4, A@3, S, W9),
C@4 = munch@internal@bitwise:rol(C@3, 30),
case Groups@1 of
[] ->
H0 = munch@internal@bitwise:'band'(Oh0 + A@4, 16#ffffffff),
H1 = munch@internal@bitwise:'band'(Oh1 + B@4, 16#ffffffff),
H2 = munch@internal@bitwise:'band'(Oh2 + C@4, 16#ffffffff),
H3 = munch@internal@bitwise:'band'(Oh3 + D@4, 16#ffffffff),
H4 = munch@internal@bitwise:'band'(Oh4 + E@4, 16#ffffffff),
rounds(
H0,
H1,
H2,
H3,
H4,
A@4,
B@4,
C@4,
D@4,
E@4,
W0,
W1,
W2,
W3,
W4,
W5,
W6,
W7,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
[],
Data
);
_ ->
N0 = f(W13, W8, W2, W0),
N1 = f(W14, W9, W3, W1),
N2 = f(W15, W10, W4, W2),
N3 = f(N0, W11, W5, W3),
N4 = f(N1, W12, W6, W4),
N5 = f(N2, W13, W7, W5),
N6 = f(N3, W14, W8, W6),
N7 = f(N4, W15, W9, W7),
N8 = f(N5, N0, W10, W8),
N9 = f(N6, N1, W11, W9),
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
A@4,
B@4,
C@4,
D@4,
E@4,
W10,
W11,
W12,
W13,
W14,
W15,
N0,
N1,
N2,
N3,
N4,
N5,
N6,
N7,
N8,
N9,
Groups@1,
Data
)
end;
{[{parity, S@1} | Groups@2], _} ->
E@5 = par(A, B, C, D, E, S@1, W0),
B@5 = munch@internal@bitwise:rol(B, 30),
D@5 = par(E@5, A, B@5, C, D, S@1, W1),
A@5 = munch@internal@bitwise:rol(A, 30),
C@5 = par(D@5, E@5, A@5, B@5, C, S@1, W2),
E@6 = munch@internal@bitwise:rol(E@5, 30),
B@6 = par(C@5, D@5, E@6, A@5, B@5, S@1, W3),
D@6 = munch@internal@bitwise:rol(D@5, 30),
A@6 = par(B@6, C@5, D@6, E@6, A@5, S@1, W4),
C@6 = munch@internal@bitwise:rol(C@5, 30),
E@7 = par(A@6, B@6, C@6, D@6, E@6, S@1, W5),
B@7 = munch@internal@bitwise:rol(B@6, 30),
D@7 = par(E@7, A@6, B@7, C@6, D@6, S@1, W6),
A@7 = munch@internal@bitwise:rol(A@6, 30),
C@7 = par(D@7, E@7, A@7, B@7, C@6, S@1, W7),
E@8 = munch@internal@bitwise:rol(E@7, 30),
B@8 = par(C@7, D@7, E@8, A@7, B@7, S@1, W8),
D@8 = munch@internal@bitwise:rol(D@7, 30),
A@8 = par(B@8, C@7, D@8, E@8, A@7, S@1, W9),
C@8 = munch@internal@bitwise:rol(C@7, 30),
case Groups@2 of
[] ->
H0@1 = munch@internal@bitwise:'band'(Oh0 + A@8, 16#ffffffff),
H1@1 = munch@internal@bitwise:'band'(Oh1 + B@8, 16#ffffffff),
H2@1 = munch@internal@bitwise:'band'(Oh2 + C@8, 16#ffffffff),
H3@1 = munch@internal@bitwise:'band'(Oh3 + D@8, 16#ffffffff),
H4@1 = munch@internal@bitwise:'band'(Oh4 + E@8, 16#ffffffff),
rounds(
H0@1,
H1@1,
H2@1,
H3@1,
H4@1,
A@8,
B@8,
C@8,
D@8,
E@8,
W0,
W1,
W2,
W3,
W4,
W5,
W6,
W7,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
[],
Data
);
_ ->
N0@1 = f(W13, W8, W2, W0),
N1@1 = f(W14, W9, W3, W1),
N2@1 = f(W15, W10, W4, W2),
N3@1 = f(N0@1, W11, W5, W3),
N4@1 = f(N1@1, W12, W6, W4),
N5@1 = f(N2@1, W13, W7, W5),
N6@1 = f(N3@1, W14, W8, W6),
N7@1 = f(N4@1, W15, W9, W7),
N8@1 = f(N5@1, N0@1, W10, W8),
N9@1 = f(N6@1, N1@1, W11, W9),
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
A@8,
B@8,
C@8,
D@8,
E@8,
W10,
W11,
W12,
W13,
W14,
W15,
N0@1,
N1@1,
N2@1,
N3@1,
N4@1,
N5@1,
N6@1,
N7@1,
N8@1,
N9@1,
Groups@2,
Data
)
end;
{[{majority, S@2} | Groups@3], _} ->
E@9 = maj(A, B, C, D, E, S@2, W0),
B@9 = munch@internal@bitwise:rol(B, 30),
D@9 = maj(E@9, A, B@9, C, D, S@2, W1),
A@9 = munch@internal@bitwise:rol(A, 30),
C@9 = maj(D@9, E@9, A@9, B@9, C, S@2, W2),
E@10 = munch@internal@bitwise:rol(E@9, 30),
B@10 = maj(C@9, D@9, E@10, A@9, B@9, S@2, W3),
D@10 = munch@internal@bitwise:rol(D@9, 30),
A@10 = maj(B@10, C@9, D@10, E@10, A@9, S@2, W4),
C@10 = munch@internal@bitwise:rol(C@9, 30),
E@11 = maj(A@10, B@10, C@10, D@10, E@10, S@2, W5),
B@11 = munch@internal@bitwise:rol(B@10, 30),
D@11 = maj(E@11, A@10, B@11, C@10, D@10, S@2, W6),
A@11 = munch@internal@bitwise:rol(A@10, 30),
C@11 = maj(D@11, E@11, A@11, B@11, C@10, S@2, W7),
E@12 = munch@internal@bitwise:rol(E@11, 30),
B@12 = maj(C@11, D@11, E@12, A@11, B@11, S@2, W8),
D@12 = munch@internal@bitwise:rol(D@11, 30),
A@12 = maj(B@12, C@11, D@12, E@12, A@11, S@2, W9),
C@12 = munch@internal@bitwise:rol(C@11, 30),
case Groups@3 of
[] ->
H0@2 = munch@internal@bitwise:'band'(
Oh0 + A@12,
16#ffffffff
),
H1@2 = munch@internal@bitwise:'band'(
Oh1 + B@12,
16#ffffffff
),
H2@2 = munch@internal@bitwise:'band'(
Oh2 + C@12,
16#ffffffff
),
H3@2 = munch@internal@bitwise:'band'(
Oh3 + D@12,
16#ffffffff
),
H4@2 = munch@internal@bitwise:'band'(
Oh4 + E@12,
16#ffffffff
),
rounds(
H0@2,
H1@2,
H2@2,
H3@2,
H4@2,
A@12,
B@12,
C@12,
D@12,
E@12,
W0,
W1,
W2,
W3,
W4,
W5,
W6,
W7,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
[],
Data
);
_ ->
N0@2 = f(W13, W8, W2, W0),
N1@2 = f(W14, W9, W3, W1),
N2@2 = f(W15, W10, W4, W2),
N3@2 = f(N0@2, W11, W5, W3),
N4@2 = f(N1@2, W12, W6, W4),
N5@2 = f(N2@2, W13, W7, W5),
N6@2 = f(N3@2, W14, W8, W6),
N7@2 = f(N4@2, W15, W9, W7),
N8@2 = f(N5@2, N0@2, W10, W8),
N9@2 = f(N6@2, N1@2, W11, W9),
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
A@12,
B@12,
C@12,
D@12,
E@12,
W10,
W11,
W12,
W13,
W14,
W15,
N0@2,
N1@2,
N2@2,
N3@2,
N4@2,
N5@2,
N6@2,
N7@2,
N8@2,
N9@2,
Groups@3,
Data
)
end
end.
-file("src/munch/internal/sha1.gleam", 93).
?DOC(false).
-spec blocks(integer(), integer(), integer(), integer(), integer(), bitstring()) -> {integer(),
integer(),
integer(),
integer(),
integer(),
bitstring()}.
blocks(H0, H1, H2, H3, H4, Data) ->
rounds(
H0,
H1,
H2,
H3,
H4,
H0,
H1,
H2,
H3,
H4,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
[],
Data
).
-file("src/munch/internal/sha1.gleam", 79).
?DOC(false).
-spec finish(state()) -> bitstring().
finish(State) ->
{state, H0, H1, H2, H3, H4, 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>>,
{H0@1, H1@1, H2@1, H3@1, H4@1, _} = blocks(H0, H1, H2, H3, H4, Padded),
<<H0@1:32, H1@1:32, H2@1:32, H3@1:32, H4@1:32>>.
-file("src/munch/internal/sha1.gleam", 71).
?DOC(false).
-spec update(state(), bitstring()) -> state().
update(State, Data) ->
{state, H0, H1, H2, H3, H4, Buffer, Length} = State,
Length@1 = Length + erlang:bit_size(Data),
{H0@1, H1@1, H2@1, H3@1, H4@1, Buffer@1} = blocks(
H0,
H1,
H2,
H3,
H4,
<<Buffer/bitstring, Data/bitstring>>
),
{state, H0@1, H1@1, H2@1, H3@1, H4@1, Buffer@1, Length@1}.
-file("src/munch/internal/sha1.gleam", 66).
?DOC(false).
-spec new() -> munch@internal@hash:hash().
new() ->
State = {state,
16#67452301,
16#EFCDAB89,
16#98BADCFE,
16#10325476,
16#C3D2E1F0,
<<>>,
0},
munch@internal@hash:from(State, fun update/2, fun finish/1).