defmodule Cryppo.EncryptionKey do @moduledoc """ A struct to wrap an encryption key An `EncryptionKey` struct may be marked as belonging to a certain encryption strategy using field `encryption_strategy_module` containing the module of the encryption strategy. Depending on the encryption strategy the key can be a binary or a tuple. Keys must be guarded and protected, that is why the `Inspect` protocol has been overridden for this struct to disable pretty-printing. Should you need to access the key, access it via field `key`. """ @typedoc "A binary key" @type binary_key() :: binary() @typedoc """ Encryption key An encryption key may me a tuple or a binary depending on the encryption strategy """ @type internal_key() :: binary_key() | tuple @typedoc """ Struct EncryptionKey A `Cryppo.EncryptionKey` struct contains * `key`: the key itself * `encryption_strategy_module`: module of the encryption strategy to which the key belongs """ @type t :: %__MODULE__{ encryption_strategy_module: Cryppo.encryption_strategy_module(), key: internal_key() } @enforce_keys [:key] defstruct [:encryption_strategy_module, :key] @doc """ Initialize a struct with an encryption key and the module of an encryption strategy """ @spec new(internal_key(), Cryppo.encryption_strategy_module()) :: t() def new(key, mod), do: %__MODULE__{key: key, encryption_strategy_module: mod} @doc """ Initialize a struct with an encryption key """ @spec new(internal_key()) :: t() def new(key), do: %__MODULE__{key: key} defimpl Inspect do @spec inspect(Inspect.t(), Inspect.Opts.t()) :: Inspect.Algebra.t() def inspect(_data, _opts), do: "%Cryppo.EncryptionKey{ HIDDEN }" end end