diff --git a/src/hz.erl b/src/hz.erl index f76b6ab..71e9be5 100644 --- a/src/hz.erl +++ b/src/hz.erl @@ -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 @@ -2398,7 +2398,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]), @@ -2407,7 +2407,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()} @@ -2432,7 +2432,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]), @@ -2442,6 +2442,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 @@ -2469,6 +2470,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() ->