add varuint module
This commit is contained in:
@@ -0,0 +1,56 @@
|
|||||||
|
% @doc Bitcoin varuint
|
||||||
|
% https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
|
||||||
|
-module(vu).
|
||||||
|
|
||||||
|
-compile([export_all, nowarn_export_all]).
|
||||||
|
|
||||||
|
-spec encode(Integer) -> Result
|
||||||
|
when Integer :: integer(),
|
||||||
|
Result :: {ok, Encoded :: binary()}
|
||||||
|
| {error, Reason :: term()}.
|
||||||
|
|
||||||
|
encode(N) when N < 0 ->
|
||||||
|
{error, {negative_N, N}};
|
||||||
|
encode(N) when N < 16#FD ->
|
||||||
|
{ok, <<N>>};
|
||||||
|
encode(N) when N =< 16#FFFF ->
|
||||||
|
NBytes = eu(N, 2),
|
||||||
|
{ok, <<16#FD, NBytes/binary>>};
|
||||||
|
encode(N) when N =< 16#FFFF_FFFF ->
|
||||||
|
NBytes = eu(N, 4),
|
||||||
|
{ok, <<16#FE, NBytes/binary>>};
|
||||||
|
encode(N) when N < (2 bsl 64) ->
|
||||||
|
NBytes = eu(N, 8),
|
||||||
|
{ok, <<16#FF, NBytes/binary>>}.
|
||||||
|
|
||||||
|
% add bytes to the end as needed
|
||||||
|
eu(N, Size) ->
|
||||||
|
Bytes = binary:encode_unsigned(N, little),
|
||||||
|
NExtraZeros = Size - byte_size(Bytes),
|
||||||
|
ExtraZeros = << <<0>> || _ <- lists:seq(1, NExtraZeros) >>,
|
||||||
|
<<Bytes/binary, ExtraZeros/binary>>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-spec decode(Encoded) -> Result
|
||||||
|
when Encoded :: binary(),
|
||||||
|
Result :: {ok, Integer :: integer()}
|
||||||
|
| {error, Reason :: term()}.
|
||||||
|
|
||||||
|
decode(<<N>>) when N < 16#FD ->
|
||||||
|
{ok, N};
|
||||||
|
decode(<<_, Rest/binary>>) ->
|
||||||
|
{ok, binary:decode_unsigned(Rest, little)};
|
||||||
|
decode(_) ->
|
||||||
|
{error, ur_mom}.
|
||||||
|
|
||||||
|
|
||||||
|
% See https://github.com/aeternity/aepp-sdk-js/blob/370f1e30064ad0239ba59931908d9aba0a2e86b6/src/utils/crypto.ts#L171-L175
|
||||||
|
salted_msg(Msg) when is_binary(Msg) ->
|
||||||
|
P = <<"aeternity Signed Message:\n">>,
|
||||||
|
{ok, SP} = encode(byte_size(P)),
|
||||||
|
{ok, SMsg} = encode(byte_size(Msg)),
|
||||||
|
<<SP/binary,
|
||||||
|
P/binary,
|
||||||
|
SMsg/binary,
|
||||||
|
Msg/binary>>.
|
||||||
Reference in New Issue
Block a user