# `XMediaLib.Srtp.Srtp_Crypto_Ctx`
[🔗](https://github.com/Lazarus404/xmedialib/blob/main/lib/srtp.ex#L75)

Per-SSRC SRTP cryptographic state (RFC 3711).

## What problem this solves

Holds per-SSRC SRTP session keys and replay counters so encrypt/decrypt
calls can advance ROC and SRTCP index safely across packets.

Holds derived session keys, replay/state indices, and algorithm choices.
Updated in place by `encrypt/2` and `decrypt/2`.

## RFCs

* [RFC 3711](https://www.rfc-editor.org/rfc/rfc3711)

# `t`

```elixir
@type t() :: %XMediaLib.Srtp.Srtp_Crypto_Ctx{
  aalg: atom(),
  ealg: atom(),
  f8_cipher: term(),
  k_a: binary(),
  k_a_rtcp: binary(),
  k_e: binary(),
  k_e_rtcp: binary(),
  k_s: binary(),
  k_s_rtcp: binary(),
  key_deriv_rate: non_neg_integer(),
  roc: non_neg_integer(),
  rtcp_idx: non_neg_integer(),
  s_l: non_neg_integer(),
  ssrc: non_neg_integer() | nil,
  tag_length: non_neg_integer()
}
```

## Fields

* `:ssrc` - synchronization source this context protects
* `:roc` - rollover counter for RTP index (high 32 bits of packet index)
* `:s_l` - highest received RTP sequence number seen
* `:rtcp_idx` - SRTCP packet index for RTCP encryption
* `:key_deriv_rate` - master key update rate (0 disables periodic re-key)
* `:ealg` - encryption `:null`, `:aes_cm`, or unsupported `:aes_f8` / TWICE
* `:aalg` - authentication `:null`, `:hmac_sha1`, or `:skein_hmac`
* `:k_a`, `:k_e`, `:k_s` - RTP auth, encryption, and salt session keys
* `:k_a_rtcp`, `:k_e_rtcp`, `:k_s_rtcp` - SRTCP session keys (labels 0x03-0x05)
* `:tag_length` - authentication tag size in octets (10 for WebRTC)

---

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