# `ExWapp.Signal.SenderKey`
[🔗](https://github.com/elchemista/ex_wapp/blob/v0.1.5/lib/ex_wapp/signal/sender_key.ex#L1)

Group sender-key support for WhatsApp `skmsg` payloads.

Handles:
- processing sender key distribution messages from decrypted WA message payloads
- decrypting sender-key group messages (`enc type="skmsg"`)

# `sender_key_message_keys`

```elixir
@type sender_key_message_keys() :: %{iv: binary(), cipher_key: binary()}
```

# `sender_key_state`

```elixir
@type sender_key_state() :: %{
  id: non_neg_integer(),
  iteration: non_neg_integer(),
  chain_key: binary(),
  signing_key: binary(),
  signing_private: binary() | nil,
  message_keys: %{optional(non_neg_integer()) =&gt; sender_key_message_keys()}
}
```

# `create_outbound_distribution_message`

```elixir
@spec create_outbound_distribution_message(ExWapp.Store.t(), term(), term()) ::
  {:ok, binary()} | {:error, term()}
```

Creates (or reuses) the local outbound sender-key state and returns a WA message
payload containing `senderKeyDistributionMessage` (field 2).

# `decrypt_group_message`

```elixir
@spec decrypt_group_message(ExWapp.Store.t(), term(), term(), binary()) ::
  {:ok, binary()} | {:error, term()}
```

Decrypts a group sender-key message (`skmsg`) for a specific group and sender.

# `encrypt_outbound_group_message`

```elixir
@spec encrypt_outbound_group_message(ExWapp.Store.t(), term(), term(), binary()) ::
  {:ok, binary()} | {:error, term()}
```

Encrypts plaintext for outbound group send as a sender-key message (`skmsg`).

# `process_distributions_from_plaintext`

```elixir
@spec process_distributions_from_plaintext(
  ExWapp.Store.t() | nil,
  term(),
  term(),
  binary()
) ::
  {:ok, non_neg_integer()} | {:error, term()}
```

Parses and persists any sender key distribution payloads found inside a decrypted
WhatsApp message protobuf.

Returns `{:ok, processed_count}`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
