floof/lib/floof/message.ex
Alain Zscheile c48367ff09 send public key with every message
this is more efficient and solves key distribution concerns
2022-11-26 23:41:56 +01:00

34 lines
1 KiB
Elixir

defmodule Floof.Message do
@moduledoc """
Utility methods to deal with generating and emitting of messages
"""
def emit(xf) do
{:XferBlob, _, _, _, xfinner} = xf
mhash = :crypto.hash(:blake2b, xfinner)
GenServer.cast(Floof.Distributor, {:xfer, {self(), mhash, xf}})
mhash
end
def sign(xf, secret_key) do
{:XferBlob, ttl, markers, _, xfinner} = xf
public_key = :enacl.crypto_sign_ed25519_sk_to_pk(secret_key)
signature = :enacl.sign_detached(xfinner, secret_key)
signature2 = {:Signature, {1, 3, 6, 1, 4, 1, 11591, 15, 1}, public_key, signature}
{:XferBlob, ttl, markers, signature2, xfinner}
end
def pack_inner(topic, attrs, severity, data) do
# make sure that attrs is ordered to ensure proper repr
attrs = :ordsets.to_list(:ordsets.from_list(attrs))
{:ok, data} = :FloofProtocol.encode(:XferInner, {:XferInner, topic, attrs, severity, data})
data
end
def build_outer(ttl, markers, secret_key, xfinner) do
{:XferBlob, ttl, markers, nil, xfinner} |> sign(secret_key)
end
end