diff --git a/src/aeso_abi.erl b/src/aeso_abi.erl index d4b371b..da507ab 100644 --- a/src/aeso_abi.erl +++ b/src/aeso_abi.erl @@ -106,7 +106,7 @@ function_type_hash(Name, ArgType, OutType) when is_binary(Name) -> , aeso_heap:to_binary(OutType) ]), %% Calculate a 256 bit digest BLAKE2b hash value of a binary - {ok, Hash} = aeso_blake2:blake2b(?HASH_SIZE, Bin), + {ok, Hash} = eblake2:blake2b(?HASH_SIZE, Bin), Hash. -spec arg_typerep_from_function(function_name(), type_info()) -> diff --git a/src/aeso_blake2.erl b/src/aeso_blake2.erl deleted file mode 100644 index 960f42b..0000000 --- a/src/aeso_blake2.erl +++ /dev/null @@ -1,149 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 2019, Aeternity Anstalt -%%% @doc -%%% BLAKE2b implementation in Erlang - for details see: https://blake2.net -%%% @end -%%%============================================================================= - --module(aeso_blake2). - --export([ blake2b/2 - , blake2b/3 - ]). - --define(MAX_64BIT, 16#ffffffffffffffff). - --spec blake2b(HashLen :: integer(), Msg :: binary()) -> {ok, binary()}. -blake2b(HashLen, Msg) -> - blake2b(HashLen, Msg, <<>>). - --spec blake2b(HashLen :: integer(), Msg :: binary(), Key :: binary()) -> {ok, binary()}. -blake2b(HashLen, Msg0, Key) -> - %% If message should be keyed, prepend message with padded key. - Msg = <<(pad(128, Key))/binary, Msg0/binary>>, - - %% Set up the initial state - Init = (16#01010000 + (byte_size(Key) bsl 8) + HashLen), - <> = blake_iv(), - H = <<(H0 bxor Init):64, H1_7/binary>>, - - %% Perform the compression - message will be chopped into 128-byte chunks. - State = blake2b_compress(H, Msg, 0), - - %% Just return the requested part of the hash - {ok, binary_part(to_little_endian(State), {0, HashLen})}. - -blake2b_compress(H, <>, BCompr) when Rest /= <<>> -> - H1 = blake2b_compress(H, <>, BCompr + 128, false), - blake2b_compress(H1, Rest, BCompr + 128); -blake2b_compress(H, SmallChunk, BCompr) -> - Size = byte_size(SmallChunk), - FillSize = (128 - Size) * 8, - blake2b_compress(H, <>, BCompr + Size, true). - -blake2b_compress(H, Chunk0, BCompr, Last) -> - Chunk = to_big_endian(Chunk0), - <> = <>, - V12_ = V12 bxor (BCompr band ?MAX_64BIT), - V13_ = V13 bxor ((BCompr bsr 64) band ?MAX_64BIT), - V14_ = case Last of - false -> V14; - true -> V14 bxor ?MAX_64BIT - end, - V = <>, - - <> = - lists:foldl(fun(Round, Vx) -> blake2b_mix(Round, Chunk, Vx) end, V, lists:seq(0, 11)), - - <> = H, - <<((HInt bxor VLow) bxor VHigh):(8*64)>>. - -blake2b_mix(Rnd, Chunk, V) -> - <> = V, - <> = 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), - - {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)), - - <>. - -blake2b_mix(Va, Vb, Vc, Vd, X, Y) -> - Va1 = (Va + Vb + X) band ?MAX_64BIT, - Vd1 = rotr64(32, Vd bxor Va1), - - Vc1 = (Vc + Vd1) band ?MAX_64BIT, - Vb1 = rotr64(24, Vb bxor Vc1), - - Va2 = (Va1 + Vb1 + Y) band ?MAX_64BIT, - Vd2 = rotr64(16, Va2 bxor Vd1), - - Vc2 = (Vc1 + Vd2) band ?MAX_64BIT, - Vb2 = rotr64(63, Vb1 bxor Vc2), - - {Va2, Vb2, Vc2, Vd2}. - -blake_iv() -> - IV0 = 16#6A09E667F3BCC908, - IV1 = 16#BB67AE8584CAA73B, - IV2 = 16#3C6EF372FE94F82B, - IV3 = 16#A54FF53A5F1D36F1, - IV4 = 16#510E527FADE682D1, - IV5 = 16#9B05688C2B3E6C1F, - IV6 = 16#1F83D9ABFB41BD6B, - IV7 = 16#5BE0CD19137E2179, - <>. - -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]}]. - -rotr64(N, I64) -> - <> = rotr641(N, <>), - I64rot. - -rotr641(16, <>) -> <>; -rotr641(24, <>) -> <>; -rotr641(32, <>) -> <>; -rotr641(63, <>) -> <>. - -pad(N, Bin) -> - case (N - (byte_size(Bin) rem N)) rem N of - 0 -> Bin; - Pad -> <> - end. - -to_big_endian(Bin) -> to_big_endian(Bin, <<>>). -to_big_endian(<<>>, Acc) -> Acc; -to_big_endian(<>, Acc) -> - to_big_endian(Rest, <>). - -to_little_endian(Bin) -> to_little_endian(Bin, <<>>). -to_little_endian(<<>>, Acc) -> Acc; -to_little_endian(<>, Acc) -> - to_little_endian(Rest, <>). - diff --git a/test/aeso_blake2_tests.erl b/test/aeso_blake2_tests.erl deleted file mode 100644 index 09af0ae..0000000 --- a/test/aeso_blake2_tests.erl +++ /dev/null @@ -1,73 +0,0 @@ -%%%============================================================================= -%%% @copyright (C) 2019, Aeternity Anstalt -%%% @doc -%%% Unit tests for the aeso_blake2 module -%%% -%%% In addition the aeso_blake2 module was compared to the C reference -%%% implementation by writing a QuickCheck property. -%%% @end -%%%============================================================================= --module(aeso_blake2_tests). - --ifdef(TEST). - --include_lib("eunit/include/eunit.hrl"). - -blake2b_test_() -> - {"Tests for BLAKE2b hash implementation", - [ fun() -> blake2b(Data) end || Data <- test_data_blake2b() ]}. - -blake2b({Msg0, Key0, ExpectedOut0}) -> - Msg = mk_binary(Msg0), - Key = mk_binary(Key0), - ExpectedOut = mk_binary(ExpectedOut0), - Result = aeso_blake2:blake2b(byte_size(ExpectedOut), Msg, Key), - ?assertEqual(Result, {ok, ExpectedOut}). - -mk_binary(Bin) when is_binary(Bin) -> Bin; -mk_binary(HexStr) when is_list(HexStr) -> - << << (erlang:list_to_integer([H], 16)):4 >> || H <- HexStr >>. - -test_data_blake2b() -> - [ %% {Message, Key, ExpectedHash} - %% From Wikipedia - %% https://en.wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2 - {<<>>, - <<>>, - "786A02F742015903C6C6FD852552D272912F4740E15847618A86E217F71F5419D25E1031AFEE585313896444934EB04B903A685B1448B755D56F701AFE9BE2CE"} - , {<<"The quick brown fox jumps over the lazy dog">>, - <<>>, - "A8ADD4BDDDFD93E4877D2746E62817B116364A1FA7BC148D95090BC7333B3673F82401CF7AA2E4CB1ECD90296E3F14CB5413F8ED77BE73045B13914CDCD6A918"} - - %% From reference implementation testvectors - %% https://github.com/BLAKE2/BLAKE2/tree/master/testvectors - %% - %% Non-keyed - , {"00", - "", - "2FA3F686DF876995167E7C2E5D74C4C7B6E48F8068FE0E44208344D480F7904C36963E44115FE3EB2A3AC8694C28BCB4F5A0F3276F2E79487D8219057A506E4B"} - , {"0001", - "", - "1C08798DC641ABA9DEE435E22519A4729A09B2BFE0FF00EF2DCD8ED6F8A07D15EAF4AEE52BBF18AB5608A6190F70B90486C8A7D4873710B1115D3DEBBB4327B5"} - , {"00010203040506070809", - "", - "29102511D749DB3CC9B4E335FA1F5E8FACA8421D558F6A3F3321D50D044A248BA595CFC3EFD3D2ADC97334DA732413F5CBF4751C362BA1D53862AC1E8DABEEE8"} - - %% Keyed - , {"", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568"} - , {"00", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd"} - , {"0001", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "da2cfbe2d8409a0f38026113884f84b50156371ae304c4430173d08a99d9fb1b983164a3770706d537f49e0c916d9f32b95cc37a95b99d857436f0232c88a965"} - , {"00010203040506070809", - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - "4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd"} - ]. - - --endif. -