@spec decapsulate(binary(), binary()) :: {:ok, sharekey :: binary()} | :error
@spec derive_keypair(binary()) :: {:ok, pubkey :: binary(), privkey :: binary()} | {:error, atom()}
@spec encapsulate(binary()) :: {:ok, ciphertext :: binary(), sharedkey :: binary()} | :error
@spec generate_keypair() :: {:ok, pubkey :: binary(), privkey :: binary()} | {:error, atom()}