025b4a826f
this avoid dozens of issues regarding time warps, and also solves the issue of infinitely cycling packets when the system is under saturation, as now packets expire after passing the set amount of hops |
||
---|---|---|
asn1 | ||
lib | ||
mock_keydb | ||
test | ||
.formatter.exs | ||
.gitignore | ||
mix.exs | ||
mix.lock | ||
README.md | ||
shell.nix |
Floof
A simple forwarding + flooding daemon with signature verification
Installation
This package has enacl
as a dependency,
and thus requires libsodium
to be installed in the system/environment.
See also the shell.nix
for a suitable environment.
If available in Hex, the package can be installed
by adding floof
to your list of dependencies in mix.exs
:
def deps do
[
{:floof, "~> 0.1.0"}
]
end
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/floof.
Configuration
The config should be written to config/runtime.exs
.
Adjust the ip addresses below as appropriate.
upstream
import Config
if config_env() == :prod do
config :floof, listen_opts: [ip: {192,168,0,1}]
config :floof, pubkey_config: %{:keydb => ".keydb"}
end
downstream
import Config
if config_env() == :prod do
config :floof, listen_port: nil
config :floof, pubkey_config: %{:keydb => ".keydb"}
config :floof,
upstreams: [
{{192, 168, 0, 1}, 2540,
<<"randomly-generated-session-key">>}
]
end
Manually emitting a message
Build a release using mix release
.
Then run/start the server using _build/prod/rel/floof/bin/floof start
.
Log into a running floof process (e.g. using _build/prod/rel/floof/bin/floof remote
)
# generate and save a keypair
kp = :enacl.sign_keypair()
:ok = File.write("test01.ed25519k", kp.secret)
source = [
{:RelativeDistinguishedName, {0, 9, 2342, 19200300, 100, 1, 25}, "de"},
{:RelativeDistinguishedName, {0, 9, 2342, 19200300, 100, 1, 25}, "ytrizja"},
{:RelativeDistinguishedName, {0, 9, 2342, 19200300, 100, 1, 9}, "myhost"}
]
{:ok, pkname} = :FloofProtocol.encode(:RDNSequence, source)
# ".keydb" needs to be configured using `config/runtime.exs`
:ok = File.write(".keydb/" <> Base.url_encode64(pkname), kp.public)
# copy the keydb entry to the other participating nodes
# send a message
{:ok, secret} = File.read("test01.ed25519k")
msg_topic = [{:RelativeDistinguishedName, {2, 5, 4, 41}, "test topic"}]
msg_inner = Floof.Message.pack_inner(msg_topic, [], :info, <<0, 0>>)
msg_outer = Floof.Message.build_outer(source, 255, [], secret, msg_inner)
Floof.Message.emit(msg_outer)