# libsrtp

Библиотека для реализации протокола SRTP (Secure Real-time Transport Protocol) и SRTCP (Secure Real-time Transport Control Protocol). Она предоставляет функции для шифрования, аутентификации и защиты целостности медиапотоков в реальном времени, используемых в VoIP, видеоконференциях и других приложениях потоковой передачи мультимедиа. Библиотека реализует стандарты RFC 3711 (SRTP) и RFC 6188 (шифрование для RTP).

## Особенности

- полная реализация протоколов SRTP и SRTCP;
- поддержка различных алгоритмов шифрования (AES-128, AES-256) и аутентификации (HMAC-SHA1);
- защита от replay-атак и управление криптографическим контекстом;
- совместимость с протоколами RTP/RTCP и поддержка различных профилей.

## Основные компоненты

libsrtp состоит из нескольких модулей, обеспечивающих криптографическую защиту RTP/RTCP-трафика и управление сессиями безопасности. (подробнее с документацией можно ознакомиться [здесь](https://github.com/cisco/libsrtp)).

### Управление криптографическими сессиями

Библиотека использует понятие криптографического контекста (session) для управления ключами и параметрами безопасности для SRTP-потока. Каждый контекст содержит ключи шифрования, параметры аутентификации и счетчики пакетов.

Основные функции управления сессиями:

- `srtp_init()` — инициализация библиотеки;
- `srtp_create()` — создание SRTP-сессии с заданными параметрами;
- `srtp_add_stream()` — добавление потока к существующей сессии;
- `srtp_remove_stream()` — удаление потока из сессии;
- `srtp_dealloc()` — освобождение ресурсов сессии;
- `srtp_shutdown()` — деинициализация библиотеки.

### Шифрование и дешифрование пакетов

libsrtp предоставляет функции для защиты (шифрование и аутентификация) и проверки (дешифрование и проверка целостности) RTP/RTCP-пакетов. Библиотека обрабатывает заголовки и полезную нагрузку пакетов в соответствии со стандартами SRTP.

Основные функции обработки пакетов:

- `srtp_protect()` — защита RTP-пакета (шифрование и добавление аутентификационного тега);
- `srtp_unprotect()` — проверка и дешифрование RTP-пакета;
- `srtp_protect_rtcp()` — защита RTCP-пакета;
- `srtp_unprotect_rtcp()` — проверка и дешифрование RTCP-пакета;
- Автоматическое обновление ключей на основе счетчиков пакетов.

### Алгоритмы шифрования и аутентификации

Библиотека поддерживает различные криптографические алгоритмы, определённые в профилях SRTP. Эти алгоритмы могут быть выбраны в зависимости от требований безопасности и производительности.

Поддерживаемые алгоритмы:

- **Шифрование**: AES-128 (CTR и ICM режимы), AES-256, NULL-шифрование (без шифрования);
- **Аутентификация**: HMAC-SHA1 (80-битный и 32-битный теги), NULL-аутентификация;
- **Профили SRTP**: AES128_CM_HMAC_SHA1_80 (по умолчанию), AES128_CM_HMAC_SHA1_32, AES256_CM_HMAC_SHA1_80, AES256_CM_HMAC_SHA1_32.

### Управление ключами и безопасность

libsrtp включает механизмы для управления ключами, включая генерацию, распределение и обновление ключей. Библиотека поддерживает мастер-ключи и производные ключи для шифрования и аутентификации.

Функции управления ключами:

- `srtp_update()` — обновление ключей сессии (например, при достижении лимита пакетов);
- `srtp_set_user_data()` и `srtp_get_user_data()` — хранение пользовательских данных в сессии;
- Поддержка внешнего управления ключами через API;
- Генерация salt и ключей деривации на основе мастер-ключей.

### Защита от replay-атак и контроль целостности

Библиотека реализует механизмы защиты от повторной передачи пакетов (replay-атаки) и обеспечивает контроль целостности данных через аутентификационные теги.

Механизмы безопасности:

- **Защита от replay**: проверка уникальности индекса пакета с использованием sliding window;
- **Аутентификация**: вычисление HMAC для заголовка и данных пакета;
- **Проверка целостности**: сравнение аутентификационных тегов на принимающей стороне;
- **Управление лимитами**: автоматическое прекращение использования ключей после определённого количества пакетов.

### Работа с RTP-заголовками и расширениями

libsrtp корректно обрабатывает стандартные и расширенные заголовки RTP, сохраняя неизменными поля, необходимые для маршрутизации, и защищая только те части пакета, которые требуются по стандарту.

Особенности обработки заголовков:

- Защита только полезной нагрузки (payload) и некоторых расширений;
- Сохранение неизменными полей SSRC, timestamp, sequence number;
- Поддержка расширений RTP-заголовков (не зашифровываются, но могут быть аутентифицированы);
- Обработка маркера (marker bit) и типа полезной нагрузки (payload type).

### Интеграция с VoIP и видеосистемами

libsrtp легко интегрируется с популярными VoIP- и видеосерверами, клиентами и библиотеками обработки мультимедиа, такими как Asterisk, WebRTC, SIP-стеков.

Точки интеграции:

- **WebRTC**: используется как часть стека безопасности для SRTP в WebRTC-соединениях;
- **Asterisk/FreeSWITCH**: защита медиапотоков в телефонии;
- **SIP-клиенты**: интеграция с библиотеками типа PJSIP, Sofia-SIP;
- **Собственные медиа-серверы**: для защиты потоков в системах видеонаблюдения и конференц-связи.
