Packages
grizzly
0.6.2
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/grizzly/client/dtls.ex
defmodule Grizzly.Client.DTLS do
@type dtls_socket_message ::
{:ssl, :ssl.sslsocket(), [char()] | binary} | {:ssl_closed, :ssl.sslsocket()}
@moduledoc """
A DTLS client to be used with Grizzly.
"""
@behaviour Grizzly.Client
alias Grizzly.{Client, Packet}
@spec close(:ssl.sslsocket()) :: :ok
def close(socket) do
:ok = :ssl.close(socket)
end
@spec connect(:inet.socket_address(), :inet.port_number()) :: {:ok, :ssl.sslsocket()}
def connect(server_ip, server_port) do
opts =
server_ip
|> get_ip_version()
|> opts()
:ssl.connect(server_ip, server_port, opts, 10_000)
end
@spec send(Client.socket(), binary, keyword) :: :ok
def send(socket, binary, _opts) do
:ssl.send(socket, binary)
end
@spec parse_response(dtls_socket_message()) ::
{:ok, :heart_beat | Packet.t()} | {:error, :socket_closed}
def parse_response({:ssl, {:sslsocket, {:gen_udp, _, :dtls_connection}, _}, packet}) do
packet =
packet
|> :binary.list_to_bin()
|> Packet.decode()
|> Packet.log()
case Packet.heart_beat_response(packet) do
true -> {:ok, :heart_beat}
false -> {:ok, packet}
end
end
def parse_response({:ssl_closed, {:sslsocket, {:gen_udp, _, :dtls_connection}, _}}) do
{:error, :socket_closed}
end
@spec send_heart_beat(Client.socket(), keyword) :: :ok
def send_heart_beat(socket, _opts) do
:ssl.send(socket, Packet.heart_beat())
end
defp opts(ip_version) do
[
{:ssl_imp, :new},
{:active, true},
{:verify, :verify_none},
{:versions, [:dtlsv1]},
{:protocol, :dtls},
{:ciphers, [{:psk, :aes_128_cbc, :sha}]},
{:psk_identity, 'Client_identity'},
{:user_lookup_fun,
{&user_lookup/3,
<<0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, 0x78,
0x90, 0xAA>>}},
{:cb_info, {:gen_udp, :udp, :udp_close, :udp_error}},
ip_version
]
end
def user_lookup(:psk, _username, userstate) do
{:ok, userstate}
end
defp get_ip_version({_, _, _, _}), do: :inet
defp get_ip_version({_, _, _, _, _, _, _, _}), do: :inet6
end