Compare commits
10 Commits
af8ac8ba28
...
60a079f00d
Author | SHA1 | Date | |
---|---|---|---|
![]() |
60a079f00d | ||
![]() |
527a7f077f | ||
![]() |
d75e141f54 | ||
![]() |
8af4d27c75 | ||
![]() |
ac1fed46f9 | ||
![]() |
878d52f630 | ||
![]() |
5a562ae3ba | ||
![]() |
17923785b5 | ||
![]() |
d242c8c764 | ||
![]() |
b70d59333b |
37
.circleci/config.yml
Normal file
37
.circleci/config.yml
Normal file
@ -0,0 +1,37 @@
|
||||
version: 2.1
|
||||
|
||||
executors:
|
||||
aebuilder:
|
||||
docker:
|
||||
- image: aeternity/builder:bionic-otp23
|
||||
user: builder
|
||||
working_directory: ~/src
|
||||
|
||||
jobs:
|
||||
build:
|
||||
executor: aebuilder
|
||||
steps:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
keys:
|
||||
- dialyzer-cache-v1-{{ .Branch }}-{{ .Revision }}
|
||||
- dialyzer-cache-v1-{{ .Branch }}-
|
||||
- dialyzer-cache-v1-
|
||||
- run:
|
||||
name: Build
|
||||
command: rebar3 compile
|
||||
- run:
|
||||
name: Static Analysis
|
||||
command: rebar3 dialyzer
|
||||
- run:
|
||||
name: Eunit
|
||||
command: rebar3 eunit
|
||||
- run:
|
||||
name: Common Tests
|
||||
command: rebar3 ct
|
||||
- save_cache:
|
||||
key: dialyzer-cache-v1-{{ .Branch }}-{{ .Revision }}
|
||||
paths:
|
||||
- _build/default/rebar3_20.3.8_plt
|
||||
- store_artifacts:
|
||||
path: _build/test/logs
|
@ -4,7 +4,8 @@
|
||||
|
||||
{plugins, [rebar3_hex]}.
|
||||
|
||||
{profiles, [{test, [{deps, [{jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "2.8.0"}}}]}]}
|
||||
{profiles, [{test, [{deps, [{jsx, {git, "https://github.com/talentdeficit/jsx.git", {tag, "2.8.0"}}},
|
||||
{enacl, {git, "https://github.com/aeternity/enacl.git", {ref, "a3d010b"}}}]}]}
|
||||
]}.
|
||||
|
||||
{xref_checks, [undefined_function_calls, undefined_functions,
|
||||
|
@ -1,6 +1,6 @@
|
||||
{application, eblake2,
|
||||
[{description, "A pure Erlang Blake2 implementation"},
|
||||
{vsn, "0.1.0"},
|
||||
{vsn, "1.0.0"},
|
||||
{registered, []},
|
||||
{applications,
|
||||
[kernel,
|
||||
@ -8,8 +8,7 @@
|
||||
]},
|
||||
{env,[]},
|
||||
{modules, []},
|
||||
|
||||
{maintainers, []},
|
||||
{licenses, ["Apache 2.0"]},
|
||||
{links, []}
|
||||
{maintainers, ["Hans Svensson"]},
|
||||
{licenses, ["ISC"]},
|
||||
{links, [{"Github", "https://github.com/aeternity/enoise"}]}
|
||||
]}.
|
||||
|
108
src/eblake2.erl
108
src/eblake2.erl
@ -11,6 +11,7 @@
|
||||
, blake2b/3
|
||||
, blake2s/2
|
||||
, blake2s/3
|
||||
, hmac/3
|
||||
]).
|
||||
|
||||
-define(MAXINT_32, 16#FFFFffff).
|
||||
@ -59,6 +60,12 @@ blake2s(HashLen, Msg0, Key) ->
|
||||
%% Just return the requested part of the hash
|
||||
{ok, binary_part(to_little_endian(32, State), {0, HashLen})}.
|
||||
|
||||
-spec hmac(Hash :: blake2b | blake2s, Key :: binary(), Data :: binary()) -> binary().
|
||||
hmac(blake2b, Key, Data) ->
|
||||
hmac(128, fun(D) -> {ok, H} = blake2b(64, D), H end, Key, Data);
|
||||
hmac(blake2s, Key, Data) ->
|
||||
hmac(64, fun(D) -> {ok, H} = blake2s(32, D), H end, Key, Data).
|
||||
|
||||
|
||||
%%====================================================================
|
||||
%% Internal functions
|
||||
@ -97,19 +104,17 @@ blake2b_mix(Rnd, Chunk, V) ->
|
||||
<<M0:64, M1:64, M2:64, M3:64, M4:64, M5:64, M6:64, M7:64, M8:64,
|
||||
M9:64, M10:64, M11:64, M12:64, M13:64, M14:64, M15:64>> = Chunk,
|
||||
Ms = {M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, M14, M15},
|
||||
M = fun(Ix) -> element(Ix+1, Ms) end,
|
||||
{S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15} = sigma(Rnd rem 10, Ms),
|
||||
|
||||
[S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15] = sigma(Rnd rem 10),
|
||||
{Vx0, Vx4, Vx8, Vx12} = blake2b_mix(V0, V4, V8, V12, S0, S1),
|
||||
{Vx1, Vx5, Vx9, Vx13} = blake2b_mix(V1, V5, V9, V13, S2, S3),
|
||||
{Vx2, Vx6, Vx10, Vx14} = blake2b_mix(V2, V6, V10, V14, S4, S5),
|
||||
{Vx3, Vx7, Vx11, Vx15} = blake2b_mix(V3, V7, V11, V15, S6, S7),
|
||||
|
||||
{Vx0, Vx4, Vx8, Vx12} = blake2b_mix(V0, V4, V8, V12, M(S0), M(S1)),
|
||||
{Vx1, Vx5, Vx9, Vx13} = blake2b_mix(V1, V5, V9, V13, M(S2), M(S3)),
|
||||
{Vx2, Vx6, Vx10, Vx14} = blake2b_mix(V2, V6, V10, V14, M(S4), M(S5)),
|
||||
{Vx3, Vx7, Vx11, Vx15} = blake2b_mix(V3, V7, V11, V15, M(S6), M(S7)),
|
||||
|
||||
{Vy0, Vy5, Vy10, Vy15} = blake2b_mix(Vx0, Vx5, Vx10, Vx15, M(S8), M(S9)),
|
||||
{Vy1, Vy6, Vy11, Vy12} = blake2b_mix(Vx1, Vx6, Vx11, Vx12, M(S10), M(S11)),
|
||||
{Vy2, Vy7, Vy8, Vy13} = blake2b_mix(Vx2, Vx7, Vx8, Vx13, M(S12), M(S13)),
|
||||
{Vy3, Vy4, Vy9, Vy14} = blake2b_mix(Vx3, Vx4, Vx9, Vx14, M(S14), M(S15)),
|
||||
{Vy0, Vy5, Vy10, Vy15} = blake2b_mix(Vx0, Vx5, Vx10, Vx15, S8, S9),
|
||||
{Vy1, Vy6, Vy11, Vy12} = blake2b_mix(Vx1, Vx6, Vx11, Vx12, S10, S11),
|
||||
{Vy2, Vy7, Vy8, Vy13} = blake2b_mix(Vx2, Vx7, Vx8, Vx13, S12, S13),
|
||||
{Vy3, Vy4, Vy9, Vy14} = blake2b_mix(Vx3, Vx4, Vx9, Vx14, S14, S15),
|
||||
|
||||
<<Vy0:64, Vy1:64, Vy2:64, Vy3:64, Vy4:64, Vy5:64, Vy6:64, Vy7:64, Vy8:64,
|
||||
Vy9:64, Vy10:64, Vy11:64, Vy12:64, Vy13:64, Vy14:64, Vy15:64>>.
|
||||
@ -140,20 +145,26 @@ blake2b_iv() ->
|
||||
IV7 = 16#5BE0CD19137E2179,
|
||||
<<IV0:64, IV1:64, IV2:64, IV3:64, IV4:64, IV5:64, IV6:64, IV7:64>>.
|
||||
|
||||
sigma(N) ->
|
||||
{_, Row} = lists:keyfind(N, 1, sigma()), Row.
|
||||
|
||||
sigma() ->
|
||||
[{0, [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]},
|
||||
{1, [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3]},
|
||||
{2, [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4]},
|
||||
{3, [ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8]},
|
||||
{4, [ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13]},
|
||||
{5, [ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9]},
|
||||
{6, [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11]},
|
||||
{7, [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10]},
|
||||
{8, [ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5]},
|
||||
{9, [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0]}].
|
||||
sigma(0, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{ E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15};
|
||||
sigma(1, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{E14, E10, E4, E8, E9, E15, E13, E6, E1, E12, E0, E2, E11, E7, E5, E3};
|
||||
sigma(2, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{E11, E8, E12, E0, E5, E2, E15, E13, E10, E14, E3, E6, E7, E1, E9, E4};
|
||||
sigma(3, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{ E7, E9, E3, E1, E13, E12, E11, E14, E2, E6, E5, E10, E4, E0, E15, E8};
|
||||
sigma(4, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{ E9, E0, E5, E7, E2, E4, E10, E15, E14, E1, E11, E12, E6, E8, E3, E13};
|
||||
sigma(5, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{ E2, E12, E6, E10, E0, E11, E8, E3, E4, E13, E7, E5, E15, E14, E1, E9};
|
||||
sigma(6, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{E12, E5, E1, E15, E14, E13, E4, E10, E0, E7, E6, E3, E9, E2, E8, E11};
|
||||
sigma(7, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{E13, E11, E7, E14, E12, E1, E3, E9, E5, E0, E15, E4, E8, E6, E2, E10};
|
||||
sigma(8, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{ E6, E15, E14, E9, E11, E3, E0, E8, E12, E2, E13, E7, E1, E4, E10, E5};
|
||||
sigma(9, {E0, E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15}) ->
|
||||
{E10, E2, E8, E4, E7, E6, E1, E5, E15, E11, E9, E14, E3, E12, E13, E0}.
|
||||
|
||||
rotr64(N, I64) ->
|
||||
<<I64rot:64>> = rotr641(N, <<I64:64>>),
|
||||
@ -204,19 +215,20 @@ blake2s_mix(Rnd, Chunk, V) ->
|
||||
<<M0:32, M1:32, M2:32, M3:32, M4:32, M5:32, M6:32, M7:32, M8:32,
|
||||
M9:32, M10:32, M11:32, M12:32, M13:32, M14:32, M15:32>> = Chunk,
|
||||
Ms = {M0, M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, M14, M15},
|
||||
M = fun(Ix) -> element(Ix+1, Ms) end,
|
||||
|
||||
[S0, S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11, S12, S13, S14, S15] = sigma(Rnd rem 10),
|
||||
{S0, S1, S2, S3, S4, S5, S6, S7,
|
||||
S8, S9, S10, S11, S12, S13, S14, S15} = sigma(Rnd rem 10, Ms),
|
||||
|
||||
{Vx0, Vx4, Vx8, Vx12} = blake2s_mix(V0, V4, V8, V12, M(S0), M(S1)),
|
||||
{Vx1, Vx5, Vx9, Vx13} = blake2s_mix(V1, V5, V9, V13, M(S2), M(S3)),
|
||||
{Vx2, Vx6, Vx10, Vx14} = blake2s_mix(V2, V6, V10, V14, M(S4), M(S5)),
|
||||
{Vx3, Vx7, Vx11, Vx15} = blake2s_mix(V3, V7, V11, V15, M(S6), M(S7)),
|
||||
{Vx0, Vx4, Vx8, Vx12} = blake2s_mix(V0, V4, V8, V12, S0, S1),
|
||||
{Vx1, Vx5, Vx9, Vx13} = blake2s_mix(V1, V5, V9, V13, S2, S3),
|
||||
{Vx2, Vx6, Vx10, Vx14} = blake2s_mix(V2, V6, V10, V14, S4, S5),
|
||||
{Vx3, Vx7, Vx11, Vx15} = blake2s_mix(V3, V7, V11, V15, S6, S7),
|
||||
|
||||
{Vy0, Vy5, Vy10, Vy15} = blake2s_mix(Vx0, Vx5, Vx10, Vx15, S8, S9),
|
||||
{Vy1, Vy6, Vy11, Vy12} = blake2s_mix(Vx1, Vx6, Vx11, Vx12, S10, S11),
|
||||
{Vy2, Vy7, Vy8, Vy13} = blake2s_mix(Vx2, Vx7, Vx8, Vx13, S12, S13),
|
||||
{Vy3, Vy4, Vy9, Vy14} = blake2s_mix(Vx3, Vx4, Vx9, Vx14, S14, S15),
|
||||
|
||||
{Vy0, Vy5, Vy10, Vy15} = blake2s_mix(Vx0, Vx5, Vx10, Vx15, M(S8), M(S9)),
|
||||
{Vy1, Vy6, Vy11, Vy12} = blake2s_mix(Vx1, Vx6, Vx11, Vx12, M(S10), M(S11)),
|
||||
{Vy2, Vy7, Vy8, Vy13} = blake2s_mix(Vx2, Vx7, Vx8, Vx13, M(S12), M(S13)),
|
||||
{Vy3, Vy4, Vy9, Vy14} = blake2s_mix(Vx3, Vx4, Vx9, Vx14, M(S14), M(S15)),
|
||||
|
||||
<<Vy0:32, Vy1:32, Vy2:32, Vy3:32, Vy4:32, Vy5:32, Vy6:32, Vy7:32, Vy8:32,
|
||||
Vy9:32, Vy10:32, Vy11:32, Vy12:32, Vy13:32, Vy14:32, Vy15:32>>.
|
||||
@ -263,3 +275,29 @@ to_little_endian(X, Bin, Acc) ->
|
||||
<<UIntX:X/big-unsigned-integer, Rest/binary>> = Bin,
|
||||
to_little_endian(X, Rest, <<Acc/binary, UIntX:X/little-unsigned-integer>>).
|
||||
|
||||
%% HMAC
|
||||
hmac(BLen, HFun, Key, Data) ->
|
||||
Block1 = hmac_format_key(HFun, Key, 16#36, BLen),
|
||||
Hash1 = HFun(<<Block1/binary, Data/binary>>),
|
||||
Block2 = hmac_format_key(HFun, Key, 16#5C, BLen),
|
||||
HFun(<<Block2/binary, Hash1/binary>>).
|
||||
|
||||
hmac_format_key(HFun, Key0, Pad, BLen) ->
|
||||
Key1 =
|
||||
case byte_size(Key0) =< BLen of
|
||||
true -> Key0;
|
||||
false -> HFun(Key0)
|
||||
end,
|
||||
Key2 = pad(Key1, BLen, 0),
|
||||
<<PadWord:32>> = <<Pad:8, Pad:8, Pad:8, Pad:8>>,
|
||||
<< <<(Word bxor PadWord):32>> || <<Word:32>> <= Key2 >>.
|
||||
|
||||
pad(Data, MinSize, PadByte) ->
|
||||
case byte_size(Data) of
|
||||
N when N >= MinSize ->
|
||||
Data;
|
||||
N ->
|
||||
PadData = << <<PadByte:8>> || _ <- lists:seq(1, MinSize - N) >>,
|
||||
<<Data/binary, PadData/binary>>
|
||||
end.
|
||||
|
||||
|
@ -24,6 +24,60 @@ blake2s_test_() ->
|
||||
blake2s(_TC = #{in := Msg, key := Key, out := ExpectedOut}) ->
|
||||
?assertEqual(eblake2:blake2s(byte_size(ExpectedOut), Msg, Key), {ok, ExpectedOut}).
|
||||
|
||||
benchmark_test() ->
|
||||
%% Benchmark Blake2b against enacl.
|
||||
#{in := In, key := <<>>, out := Exp} = hd(filter_test_vectors(<<"blake2b">>)),
|
||||
HashLen = byte_size(Exp),
|
||||
{T1, _} = timer:tc(fun() -> [ Exp = enacl:generichash(HashLen, In) || _ <- lists:seq(1, 500) ] end),
|
||||
{T2, _} = timer:tc(fun() -> [ {ok, Exp} = eblake2:blake2b(HashLen, In) || _ <- lists:seq(1, 500) ] end),
|
||||
|
||||
?debugFmt("~.2f ms compared to ~.2f ms\n", [T1 / 1000, T2 / 1000]),
|
||||
|
||||
BigData = <<0:(1024*10)>>,
|
||||
|
||||
{T3, _} = timer:tc(fun() -> [ enacl:generichash(HashLen, BigData) || _ <- lists:seq(1, 50) ] end),
|
||||
{T4, _} = timer:tc(fun() -> [ {ok, _} = eblake2:blake2b(HashLen, BigData) || _ <- lists:seq(1, 50) ] end),
|
||||
|
||||
?debugFmt("~.2f ms compared to ~.2f ms\n", [T3 / 1000, T4 / 1000]),
|
||||
|
||||
ok.
|
||||
|
||||
random_test_() ->
|
||||
{generator, fun() ->
|
||||
[ {lists:concat(["Random test ", I]), fun() -> random_test(I) end} || I <- lists:seq(1, 50) ]
|
||||
end}.
|
||||
|
||||
random_test(I) ->
|
||||
Data = crypto:strong_rand_bytes(I * 50),
|
||||
Enacl = enacl:generichash(64, Data),
|
||||
{ok, Eblake} = eblake2:blake2b(64, Data),
|
||||
|
||||
?assertEqual(Eblake, Enacl).
|
||||
|
||||
hmac_blake2b_test_() ->
|
||||
{"Tests for BLAKE2b HMAC implementation",
|
||||
[ fun() -> hmac_blake2b(TC) end || TC <- hmac_testcases(blake2b) ]}.
|
||||
|
||||
hmac_blake2s_test_() ->
|
||||
{"Tests for BLAKE2s HMAC implementation",
|
||||
[ fun() -> hmac_blake2s(TC) end || TC <- hmac_testcases(blake2s) ]}.
|
||||
|
||||
hmac_blake2b({Key, Data, HMAC}) ->
|
||||
?assertEqual(HMAC, eblake2:hmac(blake2b, Key, Data)).
|
||||
|
||||
hmac_blake2s({Key, Data, HMAC}) ->
|
||||
?assertEqual(HMAC, eblake2:hmac(blake2s, Key, Data)).
|
||||
|
||||
hex_to_bin(<<>>) ->
|
||||
<<>>;
|
||||
hex_to_bin(HexStrBin) ->
|
||||
Size = byte_size(HexStrBin) div 2,
|
||||
<<(binary_to_integer(HexStrBin, 16)):Size/unit:8>>.
|
||||
|
||||
hmac_testcases(Algo) ->
|
||||
[ {hex_to_bin(list_to_binary(K)), hex_to_bin(list_to_binary(D)), H}
|
||||
|| {{K, D}, H} <- lists:zip(blake2_hmac_key_data(), blake2_hmac_hmac(Algo)) ].
|
||||
|
||||
%% Helper functions
|
||||
test_vectors() ->
|
||||
parse_test_vectors("test/blake2_testvectors.json").
|
||||
@ -31,21 +85,56 @@ test_vectors() ->
|
||||
parse_test_vectors(File) ->
|
||||
{ok, Bin} = file:read_file(File),
|
||||
Vectors = jsx:decode(Bin, [{labels, atom}, return_maps]),
|
||||
HexToBin = fun(<<>>) -> <<>>;
|
||||
(HexStrBin) ->
|
||||
Size = byte_size(HexStrBin) div 2,
|
||||
<<(binary_to_integer(HexStrBin, 16)):Size/unit:8>>
|
||||
end,
|
||||
FixBin = fun(TC = #{ in := In0, key := Key0, out := Out0 }) ->
|
||||
TC#{ in := HexToBin(In0),
|
||||
key := HexToBin(Key0),
|
||||
out := HexToBin(Out0) }
|
||||
TC#{ in := hex_to_bin(In0),
|
||||
key := hex_to_bin(Key0),
|
||||
out := hex_to_bin(Out0) }
|
||||
end,
|
||||
lists:map(FixBin, Vectors).
|
||||
|
||||
filter_test_vectors(Algo) ->
|
||||
[ X || X = #{ hash := Algo1 } <- test_vectors(), Algo == Algo1 ].
|
||||
|
||||
blake2_hmac_key_data() ->
|
||||
[ {"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
|
||||
"4869205468657265"}
|
||||
, {"4a656665",
|
||||
"7768617420646f2079612077616e7420666f72206e6f7468696e673f"}
|
||||
, {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"}
|
||||
, {"0102030405060708090a0b0c0d0e0f10111213141516171819",
|
||||
"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"}
|
||||
, {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a65204b6579202d2048617368204b6579204669727374"}
|
||||
, {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a65204b6579202d2048617368204b6579204669727374"}
|
||||
, {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"5468697320697320612074657374207573696e672061206c6172676572207468616e20626c6f636b2d73697a65206b657920616e642061206c6172676572207468616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565647320746f20626520686173686564206265666f7265206265696e6720757365642062792074686520484d414320616c676f726974686d2e"}
|
||||
, {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||
"5468697320697320612074657374207573696e672061206c6172676572207468616e20626c6f636b2d73697a65206b657920616e642061206c6172676572207468616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565647320746f20626520686173686564206265666f7265206265696e6720757365642062792074686520484d414320616c676f726974686d2e"}
|
||||
].
|
||||
|
||||
blake2_hmac_hmac(blake2b) ->
|
||||
[ <<53,138,106,24,73,36,137,79,195,75,238,86,128,238,223,87,216,74,55,187,56,131,47,40,142,59,39,220,99,169,140,200,201,30,118,218,71,107,80,139,198,178,212,8,162,72,133,116,82,144,110,74,32,180,140,107,75,85,210,223,15,225,221,36>>
|
||||
, <<111,248,132,248,221,194,166,88,107,60,152,164,205,110,189,241,78,193,2,4,182,113,0,115,235,88,101,173,227,122,38,67,184,128,124,19,53,209,7,236,219,159,254,174,182,130,140,70,37,186,23,44,102,55,158,252,210,34,194,222,17,114,122,180>>
|
||||
, <<244,59,198,44,122,153,53,60,59,44,96,232,239,36,251,189,66,233,84,120,102,220,156,91,228,237,198,244,167,212,188,10,198,32,194,198,0,52,208,64,240,219,175,134,249,233,205,120,145,160,149,89,94,237,85,226,169,150,33,95,12,21,192,24>>
|
||||
, <<229,219,182,222,47,238,66,161,202,160,110,78,123,132,206,64,143,250,92,74,157,226,99,46,202,118,156,222,136,117,1,76,114,208,114,15,234,245,63,118,230,161,128,53,127,82,141,123,244,132,250,58,20,232,204,31,15,59,173,167,23,180,52,145>>
|
||||
, <<165,75,41,67,178,162,2,39,212,28,164,108,9,69,175,9,188,31,174,251,47,73,137,76,35,174,188,85,127,183,156,72,137,220,167,68,8,220,134,80,134,102,122,237,238,74,49,133,197,58,73,200,11,129,76,76,88,19,234,12,139,56,168,248>>
|
||||
, <<180,214,140,139,182,82,151,170,52,132,168,110,29,51,183,138,70,159,33,234,170,158,212,218,159,236,145,218,71,23,34,61,44,15,163,134,170,47,209,241,255,207,89,23,178,103,84,96,53,237,48,238,164,178,19,162,133,148,211,211,169,179,140,170>>
|
||||
, <<171,52,121,128,166,75,94,130,93,209,14,125,50,253,67,160,26,142,109,234,38,122,185,173,125,145,53,36,82,102,24,146,83,17,175,188,176,196,149,25,203,235,221,112,149,64,168,215,37,251,145,26,194,174,233,178,163,170,67,215,150,18,51,147>>
|
||||
, <<97,220,242,140,166,12,169,92,130,89,147,39,171,215,169,161,152,111,242,219,211,199,73,69,198,227,35,186,203,76,159,26,94,103,82,93,20,186,141,98,36,177,98,229,102,23,21,37,83,3,69,169,178,86,8,178,125,251,163,180,146,115,213,6>>
|
||||
];
|
||||
blake2_hmac_hmac(blake2s) ->
|
||||
[ <<101,168,183,197,204,145,54,212,36,232,44,55,226,112,126,116,233,19,192,101,91,153,199,95,64,237,243,135,69,58,50,96>>
|
||||
, <<144,182,40,30,47,48,56,201,5,106,240,180,167,231,99,202,230,254,93,158,180,56,106,14,201,82,55,137,12,16,79,240>>
|
||||
, <<252,196,245,149,41,80,46,52,195,216,218,63,253,171,130,150,106,44,182,55,255,94,155,215,1,19,92,46,148,105,231,144>>
|
||||
, <<70,68,52,220,190,206,9,93,69,106,29,98,214,236,86,248,152,230,37,163,158,92,82,189,249,77,175,17,27,173,131,170>>
|
||||
, <<210,61,121,57,79,83,213,54,160,150,230,81,68,71,238,170,187,5,222,208,27,227,44,25,55,218,106,143,113,3,188,78>>
|
||||
, <<92,76,83,46,110,69,89,83,133,78,21,16,149,38,110,224,127,213,88,129,190,223,139,57,8,217,95,13,190,54,159,234>>
|
||||
, <<203,96,246,167,145,241,64,191,138,162,229,31,243,88,205,178,204,92,3,51,4,91,127,183,122,186,122,179,176,207,178,55>>
|
||||
, <<190,53,233,217,99,171,215,108,1,184,171,181,22,36,240,209,16,96,16,92,213,22,16,58,114,241,117,214,211,189,30,202>>
|
||||
].
|
||||
|
||||
-endif.
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user