# crc32 ## 1. Назначение Модуль вычисления контрольной суммы **CRC-32 (IEEE 802.3)** с полиномом `0xEDB88320`. Используется в подсистемах `secure_channel` и `stcp` для контроля целостности данных при передаче — перед шифрованием к данным добавляется CRC32, при расшифровке CRC32 пересчитывается и сверяется. ## 2. Как пользоваться **Одноразовое вычисление (внутренне инициализирует таблицу при первом вызове):** ```c // Исходное значение 0xFFFFFFFF, результат XOR-ится с ~0 uint32_t crc = crc32_calc(data, data_len); ``` **Инкрементальное вычисление (например, при получении данных фрагментами):** ```c uint32_t crc = 0xFFFFFFFF; while (chunk) { crc = crc32_update(crc, chunk_data, chunk_len); } crc ^= 0xFFFFFFFF; // финальный XOR ``` **С произвольным начальным значением (без финального XOR):** ```c uint32_t crc = crc32_calc_ex(data, len, initial_crc); ``` ## 3. API | Функция | Описание | |---------|----------| | `crc32_init()` | Принудительная инициализация lookup-таблицы (256 × uint32_t). Автоматически вызывается при первом использовании, ручной вызов не обязателен. | | `crc32_calc(data, len)` | CRC32 «в один проход». Авто-инит, начальное значение `0xFFFFFFFF`, финальный `~crc`. При `data == NULL` или `len == 0` возвращает `0xFFFFFFFF`. | | `crc32_ex(data, len, initial_crc)` | CRC32 с заданным начальным значением, **без** финального XOR. Подходит для инкрементального использования и цепочек вызовов. | | `crc32_update(crc, data, len)` | Синоним `crc32_ex(data, len, crc)` — инкрементальное обновление. |