Add binary signatures
This commit is contained in:
parent
39b92996aa
commit
f2fa83c215
47
src/hz.erl
47
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) ->
|
||||
<<Bytes/binary, ExtraZeros/binary>>.
|
||||
|
||||
|
||||
-spec sign_binary(Binary, SecKey) -> Sig
|
||||
when Binary :: binary(),
|
||||
SecKey :: binary(),
|
||||
Sig :: binary().
|
||||
|
||||
sign_binary(Binary, SecKey) ->
|
||||
Prefix = binary_sig_prefix(),
|
||||
Target = <<Prefix/binary, Binary/binary>>,
|
||||
{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 = <<Prefix/binary, Binary/binary>>,
|
||||
{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() ->
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user