Current section
Files
Jump to
Current section
Files
lib/client/router.ex
defmodule Pico.Client.Router do
@moduledoc """
Provides a DSL for message routing
"""
defmacro message(opname, data, do: block) do
quote generated: true do
def message(unquote(opname), unquote(data), var!(conn), var!(handler_state)) do
unquote(block)
end
end
end
defmacro __using__(_) do
quote do
import Pico.Client.Router
alias Pico.Client.SharedState
def message(opname, _data, _conn, _handler_state) do
IO.puts "Received unknown message #{opname}. Terminating connection"
Process.exit(self(), :normal)
end
defoverridable [message: 4]
def message("HANDSHAKE", data, socket) do
%{
public_value: peer_public_value,
generator: generator,
prime: prime,
verifier: peer_verifier
} = data
server =
:srp6a
|> Strap.protocol(prime, generator)
|> Strap.server(peer_verifier)
Pico.message(socket, "HANDSHAKE_AUTH", %{public_value: Strap.public_value(server)})
{:ok, shared_master_key} = Strap.session_key(server, peer_public_value)
shared_master_key
end
end
end
end