Files
utun2/lib/sha256_doc.md
T

33 lines
2.2 KiB
Markdown

# 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) — размер выходного дайджеста в байтах.