aboutsummaryrefslogtreecommitdiff
path: root/shard/test/conn_test.exs
blob: ae43d9ddae1b48fde9fb8eddde32026b6dda0fa3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
defmodule ShardTest.Conn do
  use ExUnit.Case
  doctest Shard.Application

  require Salty.Box.Curve25519xchacha20poly1305, as: Box
  require Salty.Sign.Ed25519, as: Sign

  test "crypto connection" do
    {srv_pkey, srv_skey} = Shard.Identity.get_keypair
    {:ok, sess_pkey, sess_skey} = Box.keypair
    {:ok, challenge} = Salty.Random.buf 32
    {:ok, socket} = :gen_tcp.connect {127,0,0,1}, 4045, [:binary, packet: 2, active: false]

    hello = {srv_pkey, sess_pkey, challenge, 0}
    :gen_tcp.send(socket, :erlang.term_to_binary hello)  
    {:ok, pkt} = :gen_tcp.recv(socket, 0)
    {cli_pkey, cli_sess_pkey, cli_challenge, _his_port} = :erlang.binary_to_term(pkt, [:safe])

    {:ok, cli_challenge_sign} = Sign.sign_detached(cli_challenge, srv_skey)
    sendmsg(socket, cli_challenge_sign, cli_sess_pkey, sess_skey)

    challenge_sign = recvmsg(socket, cli_sess_pkey, sess_skey)
    :ok = Sign.verify_detached(challenge_sign, challenge, cli_pkey)

    pkt = :erlang.binary_to_term(recvmsg(socket, cli_sess_pkey, sess_skey), [:safe])
    IO.puts (inspect pkt)
  end

  defp sendmsg(sock, msg, pk, sk) do
    {:ok, n} = Salty.Random.buf Box.noncebytes
    {:ok, msg} = Box.easy(msg, n, pk, sk)
    :gen_tcp.send(sock, n <> msg)
  end

  defp recvmsg(sock, pk, sk) do
    {:ok, pkt} = :gen_tcp.recv(sock, 0)
    n = binary_part(pkt, 0, Box.noncebytes)
    enc = binary_part(pkt, Box.noncebytes, (byte_size pkt) - Box.noncebytes)
    {:ok, msg} = Box.open_easy(enc, n, pk, sk)
    msg
  end


  test "set nickname" do
    Shard.Identity.set_nickname "test bot"
  end

  test "connect to other instance" do
    Shard.Manager.add_peer({127, 0, 0, 1}, 4045)
    receive do after 100 -> nil end
  end

  @tag :skip
  test "connect to chat rooms" do
    {:ok, pid1} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SApp.Chat, "test"})
    {:ok, pid2} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SApp.Chat, "other_test"})
    GenServer.cast(pid1, {:chat_send, "test msg 1"})
    GenServer.cast(pid2, {:chat_send, "test msg 2"})

    {:error, :redundant} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SApp.Chat, "test"})
  end

end