40 lines
1.1 KiB
Elixir
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
|