chronoscope/lib/chronoscope/nts.ex

40 lines
1.1 KiB
Elixir

defmodule Chronoscope.NTS do
require Logger
alias Chronoscope.NTS.KeyEstablishment
@timeout_in_milliseconds 3000
def key_establishment(host, port) do
tls_options = :tls_certificate_check.options(host) ++ [alpn_advertised_protocols: ["ntske/1"]]
case :ssl.connect(host, port, tls_options, @timeout_in_milliseconds) do
{:ok, socket} -> perform_key_establishment(socket)
{:error, {:tls_alert, {:handshake_failure, error}}} -> {:error, to_string(error)}
{:error, :timeout} -> {:error, :timeout}
{:error, error} -> {:error, inspect(error)}
error -> {:error, inspect(error)}
end
end
defp perform_key_establishment(socket) do
:ok = :ssl.send(socket, KeyEstablishment.request())
receive do
{:ssl, _socket, response} ->
:ssl.close(socket)
KeyEstablishment.parse_response(response)
msg ->
:ssl.close(socket)
Logger.error("received unexpected message: #{inspect(msg)}")
{:error, :no_response}
after
@timeout_in_milliseconds ->
:ssl.close(socket)
Logger.error("timed out waiting for response")
{:error, :timeout}
end
end
end