Packages
elixium_core
0.5.3
0.6.3
0.6.2
0.6.1
0.6.0
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
The core package for the Elixium blockchain, containing all the modules needed to run the chain
Current section
Files
Jump to
Current section
Files
lib/p2p/authentication.ex
defmodule Elixium.P2P.Authentication do
alias Elixium.P2P.GhostProtocol.Message
@moduledoc """
SRP authentication handshakes and generation of credentials
"""
# If this node has never communicated with a given peer, it will first
# need to identify itself.
@spec outbound_auth(reference) :: bitstring
def outbound_auth(peer) do
{prime, generator} = Strap.prime_group(1024)
identifier = :crypto.strong_rand_bytes(32)
password = :crypto.strong_rand_bytes(32)
salt = :crypto.strong_rand_bytes(32)
client =
:srp6a
|> Strap.protocol(prime, generator)
|> Strap.client(identifier, password, salt)
"HANDSHAKE"
|> Message.build(%{
prime: prime,
generator: generator,
verifier: Strap.verifier(client),
public_value: Strap.public_value(client)
})
|> Message.send(peer)
%{public_value: peer_public_value} = Message.read(peer)
{:ok, shared_master_key} = Strap.session_key(client, peer_public_value)
shared_master_key
end
@spec inbound_auth(map, reference) :: bitstring
def inbound_auth(message, socket) do
%{
public_value: peer_public_value,
generator: generator,
prime: prime,
verifier: peer_verifier
} = message
server =
:srp6a
|> Strap.protocol(prime, generator)
|> Strap.server(peer_verifier)
"HANDSHAKE_AUTH"
|> Message.build(%{public_value: Strap.public_value(server)})
|> Message.send(socket)
{:ok, shared_master_key} = Strap.session_key(server, peer_public_value)
shared_master_key
end
end