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