c48367ff09
this is more efficient and solves key distribution concerns
34 lines
1 KiB
Elixir
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
|