3CTHANZURNIZCPQIVNDN5SV27KVSSUS7P7FQX4MEURL5ALQMB26AC
CBESKRU4ZIXAXDHYE24OAT4ATMKINJAEVNSAXZSTD7QOE5Q5NQOAC
ZXBMMJZ2RQC7IBUP5NMIP6T5NNZLXVP3QUFD3Z6D6C2BNX6WWMTAC
#{mode := client, host := Host, port := Port, keys := KeyFile} ->
#{mode := client, host := Host, port := Port, keys := KeyFile, server_pk := ServerPK} ->
{server_pk, ServerPK} = read_server_public(KeyFile),
ServerPK = hex_binary(ServerPK),
{ClientSK, ClientPK} = enoise_crypto:dh_keypair(dh25519), % Generate server keypair {ServerSK, ServerPK} = enoise_crypto:dh_keypair(dh25519),
{ClientSK, ClientPK} = enoise_crypto:dh_keypair(dh25519),
% Generate server keypair
{ServerSK, ServerPK} = enoise_crypto:dh_keypair(dh25519),
{kp, dh25519, Secret, Public} = enoise_keypair:new(dh25519),
ClientSKHex = bin_to_hex(ClientSK), ClientPKHex = bin_to_hex(ClientPK), ServerSKHex = bin_to_hex(ServerSK), ServerPKHex = bin_to_hex(ServerPK),
ClientSKHex = bin_to_hex(ClientSK),
ClientPKHex = bin_to_hex(ClientPK),
ServerSKHex = bin_to_hex(ServerSK),
ServerPKHex = bin_to_hex(ServerPK),
SKHex = bin_to_hex(Secret), PKHex = bin_to_hex(Public),
SKHex = bin_to_hex(Secret),
PKHex = bin_to_hex(Public),
"%% Client keypair~n"
"}}.~n" "~n" "%% Server's public key (for client verification)~n" "{server_pk, \"~s\"}.~n" "~n" "%% Server keypair (server side)~n" "{server_keys, #{~n" " priv => \"~s\",~n" " pub => \"~s\"~n"
"}}.~n"
"~n"
"%% Server's public key (for client verification)~n"
"{server_pk, \"~s\"}.~n"
"%% Server keypair (server side)~n"
"{server_keys, #{~n"
" priv => \"~s\",~n"
" pub => \"~s\"~n"
[ClientSKHex, ClientPKHex, ServerPKHex, ServerSKHex, ServerPKHex]
[SKHex, PKHex]
bin_to_hex(Bin) -> lists:flatten([io_lib:format("~2.16.0B", [X]) || X <- binary_to_list(Bin)]).
bin_to_hex(Bin) ->
lists:flatten([io_lib:format("~2.16.0B", [X]) || X <- binary_to_list(Bin)]).
end.read_server_public(File) -> case file:consult(File) of {ok, Terms} -> case lists:keyfind(server_pk, 1, Terms) of {server_pk, SPK} -> {server_pk, hex(SPK)}; false -> error(no_server_pk) end; {error, _} = Err -> Err
end.
read_server_public(File) ->
case file:consult(File) of
{ok, Terms} ->
case lists:keyfind(server_pk, 1, Terms) of
{server_pk, SPK} -> {server_pk, hex(SPK)};
false -> error(no_server_pk)
end;
{error, _} = Err -> Err
parse_args(["-mode", "keygen" | Rest], Acc) -> parse_args(Rest, Acc#{mode => keygen});
parse_args(["-mode", "keygen" | Rest], Acc) ->
parse_args(Rest, Acc#{mode => keygen});
parse_args(["-server-pk", PubKey | Rest], Acc) -> parse_args(Rest, Acc#{server_pk => PubKey});
parse_args(["-server-pk", PubKey | Rest], Acc) ->
parse_args(Rest, Acc#{server_pk => PubKey});
io:format(" -mode client|server~n"),
io:format(" -mode keygen|client|server~n"),
io:format(" rebar3 run -- -mode client -host localhost -port 7891 -keys keys.txt~n").
io:format(" rebar3 run -- -mode client -host localhost -port 7891 -keys keys.txt -sever-pk hexstring~n").