Current section
Files
Jump to
Current section
Files
src/munch@internal@sha256.erl
-module(munch@internal@sha256).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/munch/internal/sha256.gleam").
-export([new/0, new224/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(),
integer(),
integer(),
integer(),
integer(),
bitstring(),
integer()}.
-file("src/munch/internal/sha256.gleam", 106).
?DOC(false).
-spec ch(integer(), integer(), integer()) -> integer().
ch(X, Y, Z) ->
munch@internal@bitwise:'xor'(
Z,
munch@internal@bitwise:'band'(X, munch@internal@bitwise:'xor'(Y, Z))
).
-file("src/munch/internal/sha256.gleam", 110).
?DOC(false).
-spec maj(integer(), integer(), integer()) -> integer().
maj(X, Y, Z) ->
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'band'(X, Y),
munch@internal@bitwise:'band'(Z, munch@internal@bitwise:'xor'(X, Y))
).
-file("src/munch/internal/sha256.gleam", 114).
?DOC(false).
-spec bsig0(integer()) -> integer().
bsig0(X) ->
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:ror(X, 2),
munch@internal@bitwise:ror(X, 13)
),
munch@internal@bitwise:ror(X, 22)
).
-file("src/munch/internal/sha256.gleam", 118).
?DOC(false).
-spec bsig1(integer()) -> integer().
bsig1(X) ->
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:ror(X, 6),
munch@internal@bitwise:ror(X, 11)
),
munch@internal@bitwise:ror(X, 25)
).
-file("src/munch/internal/sha256.gleam", 122).
?DOC(false).
-spec ssig0(integer()) -> integer().
ssig0(X) ->
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:ror(X, 7),
munch@internal@bitwise:ror(X, 18)
),
munch@internal@bitwise:shr(X, 3)
).
-file("src/munch/internal/sha256.gleam", 126).
?DOC(false).
-spec ssig1(integer()) -> integer().
ssig1(X) ->
munch@internal@bitwise:'xor'(
munch@internal@bitwise:'xor'(
munch@internal@bitwise:ror(X, 17),
munch@internal@bitwise:ror(X, 19)
),
munch@internal@bitwise:shr(X, 10)
).
-file("src/munch/internal/sha256.gleam", 130).
?DOC(false).
-spec schedule(integer(), integer(), integer(), integer()) -> integer().
schedule(W2, W7, W15, W16) ->
munch@internal@bitwise:'band'(
((ssig1(W2) + W7) + ssig0(W15)) + W16,
16#ffffffff
).
-file("src/munch/internal/sha256.gleam", 134).
?DOC(false).
-spec r1(integer(), integer(), integer(), integer(), integer(), integer()) -> integer().
r1(E, F, G, H, Constant, W) ->
munch@internal@bitwise:'band'(
(((H + bsig1(E)) + ch(E, F, G)) + Constant) + W,
16#ffffffff
).
-file("src/munch/internal/sha256.gleam", 138).
?DOC(false).
-spec r2(integer(), integer(), integer()) -> integer().
r2(A, B, C) ->
munch@internal@bitwise:'band'(bsig0(A) + maj(A, B, C), 16#ffffffff).
-file("src/munch/internal/sha256.gleam", 269).
?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(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
list({integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()}),
bitstring()
) -> {integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
bitstring()}.
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
Oh5,
Oh6,
Oh7,
A,
B,
C,
D,
E,
F,
G,
H,
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,
Oh5,
Oh6,
Oh7,
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
Oh5,
Oh6,
Oh7,
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,
[{16#428A2F98,
16#71374491,
16#B5C0FBCF,
16#E9B5DBA5,
16#3956C25B,
16#59F111F1,
16#923F82A4,
16#AB1C5ED5},
{16#D807AA98,
16#12835B01,
16#243185BE,
16#550C7DC3,
16#72BE5D74,
16#80DEB1FE,
16#9BDC06A7,
16#C19BF174},
{16#E49B69C1,
16#EFBE4786,
16#0FC19DC6,
16#240CA1CC,
16#2DE92C6F,
16#4A7484AA,
16#5CB0A9DC,
16#76F988DA},
{16#983E5152,
16#A831C66D,
16#B00327C8,
16#BF597FC7,
16#C6E00BF3,
16#D5A79147,
16#06CA6351,
16#14292967},
{16#27B70A85,
16#2E1B2138,
16#4D2C6DFC,
16#53380D13,
16#650A7354,
16#766A0ABB,
16#81C2C92E,
16#92722C85},
{16#A2BFE8A1,
16#A81A664B,
16#C24B8B70,
16#C76C51A3,
16#D192E819,
16#D6990624,
16#F40E3585,
16#106AA070},
{16#19A4C116,
16#1E376C08,
16#2748774C,
16#34B0BCB5,
16#391C0CB3,
16#4ED8AA4A,
16#5B9CCA4F,
16#682E6FF3},
{16#748F82EE,
16#78A5636F,
16#84C87814,
16#8CC70208,
16#90BEFFFA,
16#A4506CEB,
16#BEF9A3F7,
16#C67178F2}],
Rest
);
{[], Rest@1} ->
{Oh0, Oh1, Oh2, Oh3, Oh4, Oh5, Oh6, Oh7, Rest@1};
{[{K0, K1, K2, K3, K4, K5, K6, K7} | Groups@1], _} ->
T1 = r1(E, F, G, H, K0, W0),
H@1 = munch@internal@bitwise:'band'(T1 + r2(A, B, C), 16#ffffffff),
D@1 = munch@internal@bitwise:'band'(D + T1, 16#ffffffff),
T1@1 = r1(D@1, E, F, G, K1, W1),
G@1 = munch@internal@bitwise:'band'(
T1@1 + r2(H@1, A, B),
16#ffffffff
),
C@1 = munch@internal@bitwise:'band'(C + T1@1, 16#ffffffff),
T1@2 = r1(C@1, D@1, E, F, K2, W2),
F@1 = munch@internal@bitwise:'band'(
T1@2 + r2(G@1, H@1, A),
16#ffffffff
),
B@1 = munch@internal@bitwise:'band'(B + T1@2, 16#ffffffff),
T1@3 = r1(B@1, C@1, D@1, E, K3, W3),
E@1 = munch@internal@bitwise:'band'(
T1@3 + r2(F@1, G@1, H@1),
16#ffffffff
),
A@1 = munch@internal@bitwise:'band'(A + T1@3, 16#ffffffff),
T1@4 = r1(A@1, B@1, C@1, D@1, K4, W4),
D@2 = munch@internal@bitwise:'band'(
T1@4 + r2(E@1, F@1, G@1),
16#ffffffff
),
H@2 = munch@internal@bitwise:'band'(H@1 + T1@4, 16#ffffffff),
T1@5 = r1(H@2, A@1, B@1, C@1, K5, W5),
C@2 = munch@internal@bitwise:'band'(
T1@5 + r2(D@2, E@1, F@1),
16#ffffffff
),
G@2 = munch@internal@bitwise:'band'(G@1 + T1@5, 16#ffffffff),
T1@6 = r1(G@2, H@2, A@1, B@1, K6, W6),
B@2 = munch@internal@bitwise:'band'(
T1@6 + r2(C@2, D@2, E@1),
16#ffffffff
),
F@2 = munch@internal@bitwise:'band'(F@1 + T1@6, 16#ffffffff),
T1@7 = r1(F@2, G@2, H@2, A@1, K7, W7),
A@2 = munch@internal@bitwise:'band'(
T1@7 + r2(B@2, C@2, D@2),
16#ffffffff
),
E@2 = munch@internal@bitwise:'band'(E@1 + T1@7, 16#ffffffff),
case Groups@1 of
[] ->
H0 = munch@internal@bitwise:'band'(Oh0 + A@2, 16#ffffffff),
H1 = munch@internal@bitwise:'band'(Oh1 + B@2, 16#ffffffff),
H2 = munch@internal@bitwise:'band'(Oh2 + C@2, 16#ffffffff),
H3 = munch@internal@bitwise:'band'(Oh3 + D@2, 16#ffffffff),
H4 = munch@internal@bitwise:'band'(Oh4 + E@2, 16#ffffffff),
H5 = munch@internal@bitwise:'band'(Oh5 + F@2, 16#ffffffff),
H6 = munch@internal@bitwise:'band'(Oh6 + G@2, 16#ffffffff),
H7 = munch@internal@bitwise:'band'(Oh7 + H@2, 16#ffffffff),
rounds(
H0,
H1,
H2,
H3,
H4,
H5,
H6,
H7,
A@2,
B@2,
C@2,
D@2,
E@2,
F@2,
G@2,
H@2,
W0,
W1,
W2,
W3,
W4,
W5,
W6,
W7,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
[],
Data
);
_ ->
N0 = schedule(W14, W9, W1, W0),
N1 = schedule(W15, W10, W2, W1),
N2 = schedule(N0, W11, W3, W2),
N3 = schedule(N1, W12, W4, W3),
N4 = schedule(N2, W13, W5, W4),
N5 = schedule(N3, W14, W6, W5),
N6 = schedule(N4, W15, W7, W6),
N7 = schedule(N5, N0, W8, W7),
rounds(
Oh0,
Oh1,
Oh2,
Oh3,
Oh4,
Oh5,
Oh6,
Oh7,
A@2,
B@2,
C@2,
D@2,
E@2,
F@2,
G@2,
H@2,
W8,
W9,
W10,
W11,
W12,
W13,
W14,
W15,
N0,
N1,
N2,
N3,
N4,
N5,
N6,
N7,
Groups@1,
Data
)
end
end.
-file("src/munch/internal/sha256.gleam", 211).
?DOC(false).
-spec blocks(
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
bitstring()
) -> {integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
bitstring()}.
blocks(H0, H1, H2, H3, H4, H5, H6, H7, Data) ->
rounds(
H0,
H1,
H2,
H3,
H4,
H5,
H6,
H7,
H0,
H1,
H2,
H3,
H4,
H5,
H6,
H7,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
[],
Data
).
-file("src/munch/internal/sha256.gleam", 196).
?DOC(false).
-spec finish(state()) -> {integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()}.
finish(State) ->
{state, H0, H1, H2, H3, H4, H5, H6, H7, 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, H5@1, H6@1, H7@1, _} = blocks(
H0,
H1,
H2,
H3,
H4,
H5,
H6,
H7,
Padded
),
{H0@1, H1@1, H2@1, H3@1, H4@1, H5@1, H6@1, H7@1}.
-file("src/munch/internal/sha256.gleam", 186).
?DOC(false).
-spec finish256(state()) -> bitstring().
finish256(State) ->
{H0, H1, H2, H3, H4, H5, H6, H7} = finish(State),
<<H0:32, H1:32, H2:32, H3:32, H4:32, H5:32, H6:32, H7:32>>.
-file("src/munch/internal/sha256.gleam", 178).
?DOC(false).
-spec update(state(), bitstring()) -> state().
update(State, Data) ->
{state, H0, H1, H2, H3, H4, H5, H6, H7, Buffer, Length} = State,
Length@1 = Length + erlang:bit_size(Data),
{H0@1, H1@1, H2@1, H3@1, H4@1, H5@1, H6@1, H7@1, Buffer@1} = blocks(
H0,
H1,
H2,
H3,
H4,
H5,
H6,
H7,
<<Buffer/bitstring, Data/bitstring>>
),
{state, H0@1, H1@1, H2@1, H3@1, H4@1, H5@1, H6@1, H7@1, Buffer@1, Length@1}.
-file("src/munch/internal/sha256.gleam", 157).
?DOC(false).
-spec new() -> munch@internal@hash:hash().
new() ->
_pipe = {state,
16#6A09E667,
16#BB67AE85,
16#3C6EF372,
16#A54FF53A,
16#510E527F,
16#9B05688C,
16#1F83D9AB,
16#5BE0CD19,
<<>>,
0},
munch@internal@hash:from(_pipe, fun update/2, fun finish256/1).
-file("src/munch/internal/sha256.gleam", 191).
?DOC(false).
-spec finish224(state()) -> bitstring().
finish224(State) ->
{H0, H1, H2, H3, H4, H5, H6, _} = finish(State),
<<H0:32, H1:32, H2:32, H3:32, H4:32, H5:32, H6:32>>.
-file("src/munch/internal/sha256.gleam", 162).
?DOC(false).
-spec new224() -> munch@internal@hash:hash().
new224() ->
_pipe = {state,
16#C1059ED8,
16#367CD507,
16#3070DD17,
16#F70E5939,
16#FFC00B31,
16#68581511,
16#64F98FA7,
16#BEFA4FA4,
<<>>,
0},
munch@internal@hash:from(_pipe, fun update/2, fun finish224/1).