aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2018-09-01 16:01:48 +0200
committerAlex Auvolat <alex@adnab.me>2018-09-01 16:01:48 +0200
commit1a0ef154a421af60f6d57dfe861dacb844a7d142 (patch)
treeac4ce4ef99991c9826d69114489acaaeb7638e51 /lib
parentdd078cfecbe07f1e4d4e002467707ed53aeff180 (diff)
downloadshard-1a0ef154a421af60f6d57dfe861dacb844a7d142.tar.gz
shard-1a0ef154a421af60f6d57dfe861dacb844a7d142.zip
Add peer id suffix to make sub networks
Diffstat (limited to 'lib')
-rw-r--r--lib/identity.ex16
-rw-r--r--lib/net/tcpconn.ex4
2 files changed, 19 insertions, 1 deletions
diff --git a/lib/identity.ex b/lib/identity.ex
index 229d6c7..f1899df 100644
--- a/lib/identity.ex
+++ b/lib/identity.ex
@@ -1,13 +1,15 @@
defmodule Shard.Identity do
use Agent
require Salty.Sign.Ed25519, as: Sign
+ require Logger
def start_link(_) do
Agent.start_link(__MODULE__, :init, [], name: __MODULE__)
end
def init() do
- {:ok, pk, sk} = Sign.keypair
+ Logger.info "Generating keypair..."
+ {pk, sk} = gen_keypair(Application.get_env(:shard, :peer_id_suffix))
nick_suffix = pk
|> binary_part(0, 3)
|> Base.encode16
@@ -18,6 +20,18 @@ defmodule Shard.Identity do
}
end
+ defp gen_keypair(suffix, n \\ 0) do
+ {:ok, pk, sk} = Sign.keypair
+ if rem(n, 10000) == 0 do
+ Logger.info "#{n}... expected #{:math.pow(256, byte_size(suffix))}"
+ end
+ if :binary.longest_common_suffix([pk, suffix]) == byte_size(suffix) do
+ {pk, sk}
+ else
+ gen_keypair(suffix, n+1)
+ end
+ end
+
def get_keypair() do
Agent.get(__MODULE__, &(&1.keypair))
end
diff --git a/lib/net/tcpconn.ex b/lib/net/tcpconn.ex
index 6fc4b1a..44669bb 100644
--- a/lib/net/tcpconn.ex
+++ b/lib/net/tcpconn.ex
@@ -39,6 +39,10 @@ defmodule SNet.TCPConn do
challenge_sign = decode_pkt(pkt, cli_sess_pkey, sess_skey)
:ok = Sign.verify_detached(challenge_sign, challenge, cli_pkey)
+ expected_suffix = Application.get_env(:shard, :peer_id_suffix)
+ len = byte_size(expected_suffix)
+ ^len = :binary.longest_common_suffix([cli_pkey, expected_suffix])
+
# Connected
:inet.setopts(socket, [active: true])