Lockspire. Storage. KeyStore behaviour
(lockspire v1.6.1)
Copy Markdown
Domain-level persistence contract for signing keys.
Summary
Callbacks
Pages signing-key ids in ascending order, returning {id, kid} pairs after after_id.
Locks one signing-key row and lets decide choose what happens to its stored private material.
Types
@type store_error() :: term()
Callbacks
@callback activate_signing_key(integer(), DateTime.t()) :: {:ok, %{ activated_key: Lockspire.Domain.SigningKey.t(), retiring_key: Lockspire.Domain.SigningKey.t() | nil }} | {:error, store_error()}
@callback fetch_active_signing_key(keyword()) :: {:ok, Lockspire.Domain.SigningKey.t() | nil} | {:error, store_error()}
@callback fetch_signing_key_by_id(integer()) :: {:ok, Lockspire.Domain.SigningKey.t() | nil} | {:error, store_error()}
@callback list_active_keys() :: {:ok, [Lockspire.Domain.SigningKey.t()]} | {:error, store_error()}
@callback list_decryption_keys() :: {:ok, [Lockspire.Domain.SigningKey.t()]} | {:error, store_error()}
@callback list_publishable_keys(keyword()) :: {:ok, [Lockspire.Domain.SigningKey.t()]} | {:error, store_error()}
@callback list_signing_key_refs(after_id :: integer(), limit :: pos_integer()) :: {:ok, [{integer(), String.t()}]} | {:error, store_error()}
Pages signing-key ids in ascending order, returning {id, kid} pairs after after_id.
@callback list_signing_keys(keyword()) :: {:ok, [Lockspire.Domain.SigningKey.t()]} | {:error, store_error()}
@callback publish_key(Lockspire.Domain.SigningKey.t()) :: {:ok, Lockspire.Domain.SigningKey.t()} | {:error, store_error()}
@callback publish_signing_key(integer(), DateTime.t()) :: {:ok, Lockspire.Domain.SigningKey.t()} | {:error, store_error()}
@callback reencrypt_signing_key( integer(), (Lockspire.Domain.SigningKey.t() -> term()), keyword() ) :: {:ok, term()} | {:error, store_error()}
Locks one signing-key row and lets decide choose what happens to its stored private material.
decide receives the locked key and returns one of {:replace, binary, audit_event, info},
{:keep, info} or {:fail, reason, info}. The store never inspects the stored material itself.
A replacement is written only if the row still holds the bytes that were read, and the audit
record is appended in the same transaction.
Outcomes are {:replaced, info}, {:kept, info}, {:failed, reason, info}, :conflict
(the row changed underneath the decision) and :not_found.
@callback retire_signing_key(integer(), DateTime.t()) :: {:ok, Lockspire.Domain.SigningKey.t()} | {:error, store_error()}