Removed references to ports implemetation

This commit is contained in:
John Newby 2019-08-08 12:40:25 +02:00
parent 5ad01ed69f
commit da9248df2a
4 changed files with 65 additions and 116 deletions

View File

@ -7,7 +7,6 @@
stdlib, stdlib,
lager, lager,
enacl, enacl,
ecrecover,
ecrecoverprebuilt ecrecoverprebuilt
]}, ]},
{env,[]}, {env,[]},

View File

@ -1,50 +1,70 @@
-module(ecrecover). -module(nifecrecover).
-export([start/1, stop/0, init/1]).
-export([ecrecover/1]).
-export([time_taken_to_execute/1]).
%% API
-export([ecrecover/1,
ecrecover_hex/1,
bin_to_hexstr/1,
hexstr_to_bin/1,
time_taken_to_execute/1
]).
%% Native library support
-export([load/0]).
-on_load(load/0).
ecrecover(_Input) ->
not_loaded(?LINE).
ecrecover_hex(Input) ->
Decoded = hexstr_to_bin(Input),
{ok, PubKey} = ecrecover(Decoded),
Encoded = bin_to_hexstr(PubKey),
Encoded.
load() ->
erlang:display(file:get_cwd()),
Dir = case code:priv_dir(nifecrecover) of
{error, bad_name} ->
filename:join(
filename:dirname(
filename:dirname(
code:which(?MODULE))), "priv");
D -> D
end,
SoName = filename:join(Dir, atom_to_list(?MODULE)),
ok = erlang:load_nif(SoName, 0).
not_loaded(Line) ->
erlang:nif_error({error, {not_loaded, [{module, ?MODULE}, {line, Line}]}}).
priv()->
case code:priv_dir(?MODULE) of
{error, _} ->
EbinDir = filename:dirname(code:which(?MODULE)),
AppPath = filename:dirname(EbinDir),
filename:join(AppPath, "priv");
Path ->
Path
end.
%%
time_taken_to_execute(F) -> Start = os:timestamp(), time_taken_to_execute(F) -> Start = os:timestamp(),
F(), F(),
io:format("total time taken ~f seconds~n", [timer:now_diff(os:timestamp(), Start) / 1000000]). io:format("total time taken ~f seconds~n", [timer:now_diff(os:timestamp(), Start) / 1000000]).
start(ExtPrg) -> %%
spawn(?MODULE, init, [ExtPrg]). bin_to_hexstr(Bin) ->
stop() -> lists:flatten([io_lib:format("~2.16.0B", [X]) ||
ecrecover ! stop. X <- binary_to_list(Bin)]).
ecrecover(X) -> hexstr_to_bin(S) ->
call_port({ecrecover, X}). hexstr_to_bin(S, []).
hexstr_to_bin([], Acc) ->
call_port(Msg) -> list_to_binary(lists:reverse(Acc));
ecrecover ! {call, self(), Msg}, hexstr_to_bin([X,Y|T], Acc) ->
receive {ok, [V], []} = io_lib:fread("~16u", [X,Y]),
{ecrecover, Result} -> hexstr_to_bin(T, [V | Acc]);
Result hexstr_to_bin([X|T], Acc) ->
end. {ok, [V], []} = io_lib:fread("~16u", lists:flatten([X,"0"])),
hexstr_to_bin(T, [V | Acc]).
init(ExtPrg) ->
register(ecrecover, self()),
process_flag(trap_exit, true),
Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
loop(Port).
loop(Port) ->
receive
{call, Caller, Msg} ->
Port ! {self(), {command, encode(Msg)}},
receive
{Port, {data, Data}} ->
Caller ! {ecrecover, Data}
end,
loop(Port);
stop ->
Port ! {self(), close},
receive
{Port, closed} ->
exit(normal)
end;
{'EXIT', Port, _} ->
exit(port_terminated)
end.
encode({_, X}) -> [1, X].

View File

@ -1,70 +0,0 @@
-module(nifecrecover).
%% API
-export([ecrecover/1,
ecrecover_hex/1,
bin_to_hexstr/1,
hexstr_to_bin/1,
time_taken_to_execute/1
]).
%% Native library support
-export([load/0]).
-on_load(load/0).
ecrecover(_Input) ->
not_loaded(?LINE).
ecrecover_hex(Input) ->
Decoded = hexstr_to_bin(Input),
{ok, PubKey} = ecrecover(Decoded),
Encoded = bin_to_hexstr(PubKey),
Encoded.
load() ->
erlang:display(file:get_cwd()),
Dir = case code:priv_dir(nifecrecover) of
{error, bad_name} ->
filename:join(
filename:dirname(
filename:dirname(
code:which(?MODULE))), "priv");
D -> D
end,
SoName = filename:join(Dir, atom_to_list(?MODULE)),
ok = erlang:load_nif(SoName, 0).
not_loaded(Line) ->
erlang:nif_error({error, {not_loaded, [{module, ?MODULE}, {line, Line}]}}).
priv()->
case code:priv_dir(?MODULE) of
{error, _} ->
EbinDir = filename:dirname(code:which(?MODULE)),
AppPath = filename:dirname(EbinDir),
filename:join(AppPath, "priv");
Path ->
Path
end.
%%
time_taken_to_execute(F) -> Start = os:timestamp(),
F(),
io:format("total time taken ~f seconds~n", [timer:now_diff(os:timestamp(), Start) / 1000000]).
%%
bin_to_hexstr(Bin) ->
lists:flatten([io_lib:format("~2.16.0B", [X]) ||
X <- binary_to_list(Bin)]).
hexstr_to_bin(S) ->
hexstr_to_bin(S, []).
hexstr_to_bin([], Acc) ->
list_to_binary(lists:reverse(Acc));
hexstr_to_bin([X,Y|T], Acc) ->
{ok, [V], []} = io_lib:fread("~16u", [X,Y]),
hexstr_to_bin(T, [V | Acc]);
hexstr_to_bin([X|T], Acc) ->
{ok, [V], []} = io_lib:fread("~16u", lists:flatten([X,"0"])),
hexstr_to_bin(T, [V | Acc]).