You've already forked tribes-plugin-sender
forked from tribes/tribes-plugin-template
f8e2bfaada
Move Sender modules under TribeOne.TribesPlugin.Sender and replace the Aether-specific chat integration with the public chat@1 surface contract.
32 lines
775 B
Elixir
32 lines
775 B
Elixir
defmodule TribeOne.TribesPlugin.Sender.Streaming.StreamKeys do
|
|
@moduledoc """
|
|
Helpers for generating and verifying RTMP stream keys.
|
|
"""
|
|
|
|
@key_bytes 32
|
|
|
|
@spec generate_key() :: String.t()
|
|
def generate_key do
|
|
@key_bytes
|
|
|> :crypto.strong_rand_bytes()
|
|
|> Base.url_encode64(padding: false)
|
|
end
|
|
|
|
@spec hash_key(String.t()) :: String.t()
|
|
def hash_key(key) when is_binary(key) do
|
|
digest =
|
|
key
|
|
|> then(&:crypto.hash(:sha256, &1))
|
|
|> Base.encode16(case: :lower)
|
|
|
|
"sha256:" <> digest
|
|
end
|
|
|
|
@spec verify_key?(String.t(), String.t()) :: boolean()
|
|
def verify_key?(key, "sha256:" <> _digest = hash) when is_binary(key) do
|
|
Plug.Crypto.secure_compare(hash_key(key), hash)
|
|
end
|
|
|
|
def verify_key?(_key, _hash), do: false
|
|
end
|