lib/cmp.ex

defmodule CA.CMP do

   # IETF 2510:2005 X.509 PKI CMP

   # openssl cmp -cmd genm -server 127.0.0.1:829 \
   #             -recipient "/CN=CMPserver" -ref 1234 -secret pass:0000

   # openssl cmp -cmd ir -server 127.0.0.1:829 \
   #             -path priv/certs -srvcert caroot.pem -ref NewUser \
   #             -secret pass:0000 -certout x.pem -newkey maxim.key.enc -subject "/CN=maxim/O=SYNRC/ST=Kyiv/C=UA"
 
   def start(), do: :erlang.spawn(fn -> listen(829) end)
   def listen(port) do
       {:ok, socket} = :gen_tcp.listen(port,
         [:binary, {:packet, 0}, {:active, false}, {:reuseaddr, true}])
       accept(socket)
   end
   def accept(socket) do
       {:ok, fd} = :gen_tcp.accept(socket)
       :erlang.spawn(fn -> loop(fd) end)
       accept(socket)
   end
   def loop(socket) do
       case :gen_tcp.recv(socket, 0) do
            {:ok, data} ->
                 {{_,headers},asn} = :asn1rt_nif.decode_ber_tlv(data)
                 [_,body] = :string.split asn, "\r\n\r\n", :all
                 {:ok,dec} = :'PKIXCMP-2009'.decode(:'PKIMessage', body)
                 :io.format 'CMP: ~p~n', [dec]
                 loop(socket)
            {:error, :closed} -> :exit
       end
   end
end