Current section
Files
Jump to
Current section
Files
lib/services/cmc.ex
defmodule CA.CMC do
@moduledoc "CA/CMC TLS TCP server."
require CA
# Authority PKI X.509 CMC over TCP RFC 5272-5275 6402
# [1] https://www.rfc-editor.org/rfc/rfc6402
# [2] https://www.rfc-editor.org/rfc/rfc5272
# [3] https://www.rfc-editor.org/rfc/rfc5273
# [4] https://www.rfc-editor.org/rfc/rfc5274
# [5] https://www.rfc-editor.org/rfc/rfc5275
def start_link(port: port), do: {:ok, :erlang.spawn_link(fn -> listen(port) end)}
def child_spec(opt) do
%{
id: CMC,
start: {CA.CMC, :start_link, [opt]},
type: :supervisor,
restart: :permanent,
shutdown: 500
}
end
def listen(port) do
:logger.info(~c"Running CA.CMC with Authority 5.11.15 at 0.0.0.0:~p (tcp)", [port])
{: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 -> __MODULE__.loop(fd) end)
accept(socket)
end
def message(_socket, cms) do
:logger.info(~c"Unknown message request ~p", [cms])
end
def answer(socket, res) do
:gen_tcp.send(socket, res)
end
def loop(socket) do
case :gen_tcp.recv(socket, 0) do
{:ok, data} ->
{:ok, dec} = :"EnrollmentMessageSyntax-2009".decode(:PKIData, data)
{:PKIData, _controlSequence, _reqSequence, cmsSequence, _otherMsgSequence} = dec
:io.format(~c"PKIData:~n~p~n", [dec])
__MODULE__.message(socket, cmsSequence)
__MODULE__.loop(socket)
{:error, _} ->
:exit
end
end
def oid(:"id-cmc-identification"), do: {1, 3, 6, 1, 5, 5, 7, 7, 2}
def oid(:"id-cmc-identityProof"), do: {1, 3, 6, 1, 5, 5, 7, 7, 3}
def oid(:"id-cmc-dataReturn"), do: {1, 3, 6, 1, 5, 5, 7, 7, 4}
def oid(:"id-cmc-transactionId"), do: {1, 3, 6, 1, 5, 5, 7, 7, 5}
def oid(:"id-cmc-senderNonce"), do: {1, 3, 6, 1, 5, 5, 7, 7, 6}
def oid(:"id-cmc-recipientNonce"), do: {1, 3, 6, 1, 5, 5, 7, 7, 7}
def oid(:"id-cmc-statusInfo"), do: {1, 3, 6, 1, 5, 5, 7, 7, 1}
def oid(:"id-cmc-addExtensions"), do: {1, 3, 6, 1, 5, 5, 7, 7, 8}
def oid(:"id-cmc-encryptedPOP"), do: {1, 3, 6, 1, 5, 5, 7, 7, 9}
def oid(:"id-cmc-decryptedPOP"), do: {1, 3, 6, 1, 5, 5, 7, 7, 10}
def oid(:"id-cmc-lraPOPWitness"), do: {1, 3, 6, 1, 5, 5, 7, 7, 11}
def oid(:"id-cmc-getCert"), do: {1, 3, 6, 1, 5, 5, 7, 7, 15}
def oid(:"id-cmc-getCRL"), do: {1, 3, 6, 1, 5, 5, 7, 7, 16}
def oid(:"id-cmc-revokeRequest"), do: {1, 3, 6, 1, 5, 5, 7, 7, 17}
def oid(:"id-cmc-regInfo"), do: {1, 3, 6, 1, 5, 5, 7, 7, 18}
def oid(:"id-cmc-responseInfo"), do: {1, 3, 6, 1, 5, 5, 7, 7, 19}
def oid(:"id-cmc-queryPending"), do: {1, 3, 6, 1, 5, 5, 7, 7, 21}
def oid(:"id-cmc-popLinkRandom"), do: {1, 3, 6, 1, 5, 5, 7, 7, 22}
def oid(:"id-cmc-popLinkWitness"), do: {1, 3, 6, 1, 5, 5, 7, 7, 23}
def oid(:"id-cmc-confirmCertAcceptance"), do: {1, 3, 6, 1, 5, 5, 7, 7, 24}
def oid(:"id-cmc-statusInfoV2"), do: {1, 3, 6, 1, 5, 5, 7, 7, 25}
def oid(:"id-cmc-trustedAnchors"), do: {1, 3, 6, 1, 5, 5, 7, 7, 26}
def oid(:"id-cmc-authData"), do: {1, 3, 6, 1, 5, 5, 7, 7, 27}
def oid(:"id-cmc-batchRequests"), do: {1, 3, 6, 1, 5, 5, 7, 7, 28}
def oid(:"id-cmc-batchResponses"), do: {1, 3, 6, 1, 5, 5, 7, 7, 29}
def oid(:"id-cmc-publishCert"), do: {1, 3, 6, 1, 5, 5, 7, 7, 30}
def oid(:"id-cmc-modCertTemplate"), do: {1, 3, 6, 1, 5, 5, 7, 7, 31}
def oid(:"id-cmc-controlProcessed"), do: {1, 3, 6, 1, 5, 5, 7, 7, 32}
def oid(:"id-cmc-identityProofV2"), do: {1, 3, 6, 1, 5, 5, 7, 7, 33}
def oid(:"id-cmc-popLinkWitnessV2"), do: {1, 3, 6, 1, 5, 5, 7, 7, 34}
def code(), do: :binary.encode_hex(:crypto.strong_rand_bytes(8))
end