# SHA-256 (sha256.h) ## 1. Назначение Чистая C-реализация SHA-256 по FIPS 180-2, без внешних зависимостей. Используется как fallback при отключенной OpenSSL (`USE_OPENSSL` не определён) — в `secure_channel.c` для деривации session key, stream nonce, хеширования pubkey для обфускации и в `db_sync.c` для контрольных сумм БД. ## 2. Как пользоваться Трёхфазный API: init → update (можно много раз) → final. ```c SC_SHA256_CTX ctx; uint8_t hash[SC_SHA256_BLOCK_SIZE]; // 32 байта sc_sha256_init(&ctx); sc_sha256_update(&ctx, data1, len1); sc_sha256_update(&ctx, data2, len2); // можно добавлять данные порциями sc_sha256_final(&ctx, hash); // hash — 32 байта, после этого ctx непригоден ``` После `sc_sha256_final` контекст нельзя переиспользовать без повторного `sc_sha256_init`. ## 3. API ### Структура - **`SC_SHA256_CTX`** — контекст хеширования: буфер 64 байта, счётчик данных, счётчик бит, 8 слов состояния. ### Функции - **`sc_sha256_init(ctx)`** — инициализирует контекст начальными значениями IV (первые 32 бита дробных частей квадратных корней первых 8 простых чисел). - **`sc_sha256_update(ctx, data, len)`** — добавляет данные в хеш; обрабатывает блоки по 64 байта через `sc_sha256_transform` (внутренняя, раунды SHA-256). - **`sc_sha256_final(ctx, hash)`** — завершает хеширование: дополняет данные до кратных 512 бит (padding с 0x80 и длиной сообщения), выполняет трансформацию, выдаёт 32-байтовый дайджест в big-endian порядке. ### Константа - **`SC_SHA256_BLOCK_SIZE`** (32) — размер выходного дайджеста в байтах.