floof/lib/floof/message.ex

34 lines
1.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
{:ok, {:XferInner, _, attrs, _, _}} = :FloofProtocol.decode(:XferInner, xfinner)
mhash = :crypto.hash(:blake2b, xfinner)
GenServer.cast(Floof.Distributor, {:xfer, {self(), mhash, xf, attrs}})
mhash
end
def sign(xf, secret_key) do
{:XferBlob, source, ttl, markers, _, xfinner} = xf
signature = :enacl.sign_detached(xfinner, secret_key)
signature2 = {:Signature, {1, 3, 6, 1, 4, 1, 11591, 15, 1}, signature}
{:XferBlob, source, 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(source, ttl, markers, secret_key, xfinner) do
{:XferBlob, source, ttl, markers, nil, xfinner} |> sign(secret_key)
end
end