diff --git a/ebin/hakuzaru.app b/ebin/hakuzaru.app index 19e270a..4a0499f 100644 --- a/ebin/hakuzaru.app +++ b/ebin/hakuzaru.app @@ -3,7 +3,7 @@ {included_applications,[]}, {applications,[stdlib,kernel]}, {description,"Gajumaru interoperation library"}, - {vsn,"0.6.3"}, + {vsn,"0.7.0"}, {modules,[hakuzaru,hz,hz_fetcher,hz_grids,hz_key_master,hz_man, hz_sup]}, {mod,{hakuzaru,[]}}]}. diff --git a/src/hakuzaru.erl b/src/hakuzaru.erl index 1ecfe87..3545e07 100644 --- a/src/hakuzaru.erl +++ b/src/hakuzaru.erl @@ -6,7 +6,7 @@ %%% @end -module(hakuzaru). --vsn("0.6.3"). +-vsn("0.7.0"). -author("Craig Everett "). -copyright("Craig Everett "). -license("GPL-3.0-or-later"). diff --git a/src/hz.erl b/src/hz.erl index 829f178..b081f5d 100644 --- a/src/hz.erl +++ b/src/hz.erl @@ -23,7 +23,7 @@ %%% @end -module(hz). --vsn("0.6.3"). +-vsn("0.7.0"). -author("Craig Everett "). -copyright("Craig Everett "). -license("GPL-3.0-or-later"). @@ -73,8 +73,8 @@ decode_bytearray_fate/1, decode_bytearray/2, spend/5, spend/10, sign_tx/2, sign_tx/3, - sign_message/2, - verify_signature/3]). + sign_message/2, verify_signature/3, + sign_binary/2, verify_bin_signature/3]). %%% Types @@ -2431,7 +2431,7 @@ spend3(DSenderID, Sig :: binary(). sign_message(Message, SecKey) -> - Prefix = <<"Gajumaru Signed Message:\n">>, + Prefix = message_sig_prefix(), {ok, PSize} = vencode(byte_size(Prefix)), {ok, MSize} = vencode(byte_size(Message)), Smashed = iolist_to_binary([PSize, Prefix, MSize, Message]), @@ -2440,7 +2440,7 @@ sign_message(Message, SecKey) -> -spec verify_signature(Sig, Message, PubKey) -> Result - when Sig :: binary(), + when Sig :: string(), % base64 encoded signature, Message :: iodata(), PubKey :: pubkey(), Result :: {ok, Outcome :: boolean()} @@ -2465,7 +2465,7 @@ verify_signature2(Sig, Message, PK) -> % the user from accidentally signing a transaction disguised as a message. % % Salt the message then hash with blake2b. - Prefix = <<"Gajumaru Signed Message:\n">>, + Prefix = message_sig_prefix(), {ok, PSize} = vencode(byte_size(Prefix)), {ok, MSize} = vencode(byte_size(Message)), Smashed = iolist_to_binary([PSize, Prefix, MSize, Message]), @@ -2475,6 +2475,7 @@ verify_signature2(Sig, Message, PK) -> Result = ecu_eddsa:sign_verify_detached(Signature, Hashed, PK), {ok, Result}. +message_sig_prefix() -> <<"Gajumaru Signed Message:\n">>. % This is Bitcoin's variable-length unsigned integer encoding % See: https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer @@ -2502,6 +2503,42 @@ eu(N, Size) -> <>. +-spec sign_binary(Binary, SecKey) -> Sig + when Binary :: binary(), + SecKey :: binary(), + Sig :: binary(). + +sign_binary(Binary, SecKey) -> + Prefix = binary_sig_prefix(), + Target = <>, + {ok, Hash} = eblake2:blake2b(32, Target), + ecu_eddsa:sign_detached(Hash, SecKey). + + +-spec verify_bin_signature(Sig, Binary, PubKey) -> Result + when Sig :: string(), % base64 encoded signature, + Binary :: binary(), + PubKey :: pubkey(), + Result :: {ok, Outcome :: boolean()} + | {error, Reason :: term()}. + +verify_bin_signature(Sig, Binary, PubKey) -> + case gmser_api_encoder:decode(PubKey) of + {account_pubkey, PK} -> verify_bin_signature2(Sig, Binary, PK); + Other -> {error, {bad_key, Other}} + end. + +verify_bin_signature2(Sig, Binary, PK) -> + Prefix = binary_sig_prefix(), + Target = <>, + {ok, Hash} = eblake2:blake2b(32, Target), + Signature = base64:decode(Sig), + Result = ecu_eddsa:sign_verify_detached(Signature, Hash, PK), + {ok, Result}. + +binary_sig_prefix() -> <<"Gajumaru Signed Binary:">>. + + %%% Debug functionality % debug_network() -> diff --git a/src/hz_fetcher.erl b/src/hz_fetcher.erl index 9fa30c9..7e713a7 100644 --- a/src/hz_fetcher.erl +++ b/src/hz_fetcher.erl @@ -1,5 +1,5 @@ -module(hz_fetcher). --vsn("0.6.3"). +-vsn("0.7.0"). -author("Craig Everett "). -copyright("Craig Everett "). -license("MIT"). diff --git a/src/hz_grids.erl b/src/hz_grids.erl index 709c90a..4fc9381 100644 --- a/src/hz_grids.erl +++ b/src/hz_grids.erl @@ -37,7 +37,7 @@ %%% @end -module(hz_grids). --vsn("0.6.3"). +-vsn("0.7.0"). -export([url/2, parse/1, req/2, req/3]). diff --git a/src/hz_key_master.erl b/src/hz_key_master.erl index 0d9638e..87c4a55 100644 --- a/src/hz_key_master.erl +++ b/src/hz_key_master.erl @@ -8,7 +8,7 @@ %%% @end -module(hz_key_master). --vsn("0.6.3"). +-vsn("0.7.0"). -export([make_key/1, encode/1, decode/1]). diff --git a/src/hz_man.erl b/src/hz_man.erl index 16120f2..18248ff 100644 --- a/src/hz_man.erl +++ b/src/hz_man.erl @@ -9,7 +9,7 @@ %%% @end -module(hz_man). --vsn("0.6.3"). +-vsn("0.7.0"). -behavior(gen_server). -author("Craig Everett "). -copyright("Craig Everett "). diff --git a/src/hz_sup.erl b/src/hz_sup.erl index 3a65894..a1bf645 100644 --- a/src/hz_sup.erl +++ b/src/hz_sup.erl @@ -9,7 +9,7 @@ %%% @end -module(hz_sup). --vsn("0.6.3"). +-vsn("0.7.0"). -behaviour(supervisor). -author("Craig Everett "). -copyright("Craig Everett "). diff --git a/zomp.meta b/zomp.meta index 824bf2a..ec30618 100644 --- a/zomp.meta +++ b/zomp.meta @@ -2,9 +2,9 @@ {type,app}. {modules,[]}. {prefix,"hz"}. -{author,"Craig Everett"}. {desc,"Gajumaru interoperation library"}. -{package_id,{"otpr","hakuzaru",{0,6,3}}}. +{author,"Craig Everett"}. +{package_id,{"otpr","hakuzaru",{0,7,0}}}. {deps,[{"otpr","sophia",{9,0,0}}, {"otpr","gmserialization",{0,1,3}}, {"otpr","gmbytecode",{3,4,1}},