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,
|
decode_bytearray_fate/1, decode_bytearray/2,
|
||||||
spend/5, spend/10,
|
spend/5, spend/10,
|
||||||
sign_tx/2, sign_tx/3,
|
sign_tx/2, sign_tx/3,
|
||||||
sign_message/2,
|
sign_message/2, verify_signature/3,
|
||||||
verify_signature/3]).
|
sign_binary/2, verify_bin_signature/3]).
|
||||||
|
|
||||||
|
|
||||||
%%% Types
|
%%% Types
|
||||||
@ -2398,7 +2398,7 @@ spend3(DSenderID,
|
|||||||
Sig :: binary().
|
Sig :: binary().
|
||||||
|
|
||||||
sign_message(Message, SecKey) ->
|
sign_message(Message, SecKey) ->
|
||||||
Prefix = <<"Gajumaru Signed Message:\n">>,
|
Prefix = message_sig_prefix(),
|
||||||
{ok, PSize} = vencode(byte_size(Prefix)),
|
{ok, PSize} = vencode(byte_size(Prefix)),
|
||||||
{ok, MSize} = vencode(byte_size(Message)),
|
{ok, MSize} = vencode(byte_size(Message)),
|
||||||
Smashed = iolist_to_binary([PSize, Prefix, MSize, Message]),
|
Smashed = iolist_to_binary([PSize, Prefix, MSize, Message]),
|
||||||
@ -2407,7 +2407,7 @@ sign_message(Message, SecKey) ->
|
|||||||
|
|
||||||
|
|
||||||
-spec verify_signature(Sig, Message, PubKey) -> Result
|
-spec verify_signature(Sig, Message, PubKey) -> Result
|
||||||
when Sig :: binary(),
|
when Sig :: string(), % base64 encoded signature,
|
||||||
Message :: iodata(),
|
Message :: iodata(),
|
||||||
PubKey :: pubkey(),
|
PubKey :: pubkey(),
|
||||||
Result :: {ok, Outcome :: boolean()}
|
Result :: {ok, Outcome :: boolean()}
|
||||||
@ -2432,7 +2432,7 @@ verify_signature2(Sig, Message, PK) ->
|
|||||||
% the user from accidentally signing a transaction disguised as a message.
|
% the user from accidentally signing a transaction disguised as a message.
|
||||||
%
|
%
|
||||||
% Salt the message then hash with blake2b.
|
% Salt the message then hash with blake2b.
|
||||||
Prefix = <<"Gajumaru Signed Message:\n">>,
|
Prefix = message_sig_prefix(),
|
||||||
{ok, PSize} = vencode(byte_size(Prefix)),
|
{ok, PSize} = vencode(byte_size(Prefix)),
|
||||||
{ok, MSize} = vencode(byte_size(Message)),
|
{ok, MSize} = vencode(byte_size(Message)),
|
||||||
Smashed = iolist_to_binary([PSize, Prefix, MSize, 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),
|
Result = ecu_eddsa:sign_verify_detached(Signature, Hashed, PK),
|
||||||
{ok, Result}.
|
{ok, Result}.
|
||||||
|
|
||||||
|
message_sig_prefix() -> <<"Gajumaru Signed Message:\n">>.
|
||||||
|
|
||||||
% This is Bitcoin's variable-length unsigned integer encoding
|
% This is Bitcoin's variable-length unsigned integer encoding
|
||||||
% See: https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
|
% See: https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
|
||||||
@ -2469,6 +2470,42 @@ eu(N, Size) ->
|
|||||||
<<Bytes/binary, ExtraZeros/binary>>.
|
<<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 functionality
|
||||||
|
|
||||||
% debug_network() ->
|
% debug_network() ->
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user