Current section

Files

Jump to
diint_utilites_common_app src security diint_openssl.erl
Raw

src/security/diint_openssl.erl

%%%-------------------------------------------------------------------
%%% @author cheese
%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 04. Jul 2016 4:30 PM
%%%-------------------------------------------------------------------
-module(diint_openssl).
-author("cheese").
-include_lib("kernel/include/logger.hrl").
%% API
-export([execute/2, wait_for_port/1, mk_args/1, mk_val/1, pem_2_der/1]).
execute(Command, ArgsIn) ->
OpenSSL = os:find_executable("openssl"),
?LOG_INFO("OpenSSL: ~p~n", [OpenSSL]),
Args = [atom_to_list(Command) | mk_args(ArgsIn)],
Port = open_port({spawn_executable, OpenSSL}, [use_stdio, binary, {line, 1000}, {args, Args}, stderr_to_stdout, exit_status]),
wait_for_port(Port).
wait_for_port(Port) ->
wait_for_port(Port, <<>>).
wait_for_port(Port, Reply) ->
receive
{Port, {data, {eol, Data}}} ->
?LOG_INFO("wait eol~n", []),
wait_for_port(Port, <<Reply/binary, Data/binary>>);
{Port, {data, Data}} ->
?LOG_INFO("wait data: ~p~n", [Data]),
wait_for_port(Port, <<Reply/binary, Data/binary>>);
{Port, {exit_status, 0}} ->
?LOG_INFO("wait exit_status: 0~n", []),
{ok, Reply};
{Port, {exit_status, S}} ->
?LOG_INFO("wait exit_status: ~p~n", [S]),
{error, S, Reply}
end.
mk_args([]) ->
[];
mk_args([{K, V} | R]) ->
[mk_val(K), mk_val(V) | mk_args(R)];
mk_args([K | R]) ->
[mk_val(K) | mk_args(R)].
mk_val(I) when is_integer(I) ->
integer_to_list(I);
mk_val(A) when is_atom(A) ->
[$- | atom_to_list(A)];
mk_val(L) when is_list(L) ->
L;
mk_val(B) when is_binary(B) ->
binary_to_list(B).
pem_2_der(PemBin) ->
FromFile = lib:nonl(os:cmd("mktemp")),
file:write_file(FromFile, PemBin),
ToFile = lib:nonl(os:cmd("mktemp")),
case diint_openssl:execute(x509, [{in, FromFile}, {out, ToFile}, {outform, "DER"}]) of
{ok, Reply} ->
?LOG_INFO("openssl res or: ~s~n", [Reply]),
file:read_file(ToFile);
{error, S, Reply} ->
?LOG_INFO("openssl res error: ~p # ~s~n", [S, Reply]),
{error, {openssl, {S, Reply}}}
end.