some ai docs

This commit is contained in:
2026-03-25 20:18:43 +07:00
parent 037edaa7cd
commit 5ed50f6283
4 changed files with 1153 additions and 70 deletions
+351
View File
@@ -0,0 +1,351 @@
# Crypto Module Documentation
## Overview
Данный модуль реализует криптографическую основу протокола:
- согласование ключей (ECDH, X25519)
- derivation ключей (HKDF-SHA256)
- симметричное шифрование (ChaCha20-Poly1305, AEAD)
- аутентификация с плавающим временным окном (HMAC)
Архитектура разделена на независимые компоненты:
- `ecdh` — обмен ключами
- `hkdf` — derivation ключей
- `session` — управление состоянием сессии
- `chacha` — AEAD шифрование
- `aead` — абстракция шифрования
---
## Security Model
Модель безопасности:
- Forward secrecy обеспечивается за счёт `EphemeralSecret`
- Каждая сессия использует уникальные:
- salt (локальный + удалённый)
- ephemeral key pair
- Ключи разделены по направлениям:
- client → server
- server → client
---
## Key Exchange (ECDH)
### Реализация
Используется:
- X25519 (через `x25519-dalek`)
- Ephemeral ключи
````rust
let secret = EphemeralSecret::random_from_rng(&mut OsRng);
let public = PublicKey::from(&secret);
### Shared Secret
```rust
shared = private.diffie_hellman(remote_public)
````
Особенности:
- приватный ключ используется **один раз** (`take()`)
- после вызова `get_shared()` он уничтожается
Это критично для:
- forward secrecy
- защиты от повторного использования
---
## Salt Mechanism
### SaltPair
Каждая сторона генерирует:
- `local_salt` (32 байта, случайный)
- получает `remote_salt`
Финальный salt:
```
initiator:
total = local || remote
responder:
total = remote || local
```
Это гарантирует:
- детерминированность
- отсутствие коллизий ролей
---
## Key Derivation (HKDF)
Используется:
- HKDF-SHA256
### Extract
```
PRK = HKDF(salt, shared_secret)
```
### Expand
Из PRK генерируются:
| Назначение | Размер |
| --------------- | ------ |
| client_aead key | 32 |
| client_iv | 12 |
| server_aead key | 32 |
| server_iv | 12 |
| auth_key | 32 |
Пример:
```rust
HKDF::expand_key::<32>(&hkdf, b"client_aead")
```
Контекст (`mark`) используется как label.
---
## SessionKeys
Центральная структура управления:
```rust
pub struct SessionKeys {
salt: SaltPair,
ecdh: ECDH,
auth_key: [u8; 32],
current_aead: Option<(...)>,
}
```
### Основные задачи:
1. Принять remote salt
2. Извлечь публичный ключ из TLS extension
3. Выполнить ECDH
4. Сгенерировать ключи
---
## TLS Integration
Ключ извлекается из `ExtensionStack`:
- extension type: `0x0033` (KeyShare)
- поддерживается X25519 (`0x001d`)
### Client / Server различия
**Server:**
- парсит ClientHello
- ищет key share внутри структуры
**Client:**
- читает фиксированное смещение
---
## AEAD Encryption (ChaCha20-Poly1305)
### Используемый алгоритм
- ChaCha20-Poly1305
- 256-bit key
- 96-bit nonce
---
## Nonce Strategy
### NonceState
```rust
nonce = base_iv XOR counter
```
Где:
- `base_iv` — получен из HKDF
- `counter` — 64-bit
Алгоритм:
```rust
for i in 0..8:
iv[i+4] ^= counter[i]
```
Особенности:
- гарантированная уникальность nonce
- отсутствие повторов при корректной работе
---
## Cipher Structure
```rust
pub struct ChaChaCipher {
encrypt_cipher,
decrypt_cipher,
encrypt_state,
decrypt_state,
}
```
Разделение:
- отдельные ключи и nonce для каждого направления
---
## Encryption Flow
```rust
encrypt_in_place(nonce, aad=nonce, data)
```
AAD:
- используется сам nonce
После:
- данные мутируются
- тег добавляется автоматически
---
## Decryption Flow
```rust
decrypt_in_place(nonce, aad=nonce, data)
```
При ошибке:
- ошибка аутентификации
- повреждённые данные
- несинхронный nonce
---
## Authentication Layer
Дополнительный механизм:
### HMAC-SHA256
```rust
tag = HMAC(auth_key, time_step)
```
Где:
```
time_step = unix_time / 60
```
### Проверка
Принимаются значения:
```
[t-2, t-1, t, t+1, t+2]
```
Назначение:
- защита от replay
- tolerance к рассинхрону времени
---
## AeadPacker Trait
Абстракция для шифрования:
```rust
trait AeadPacker {
fn encrypt(...)
fn decrypt(...)
}
```
Позволяет:
- заменить алгоритм
- тестировать разные реализации
---
## Error Handling
Ошибки возникают в случаях:
- неизвестный протокол / extension
- повреждённые данные
- неверный AEAD tag
- отсутствие shared secret
Возвращаются:
- `Result<T, String>`
- `aead::Error`
---
## Important Security Notes
1. Ephemeral ключ используется только один раз
2. Nonce никогда не должен повторяться
3. Salt обязателен с обеих сторон
4. AEAD тег обязателен (встроен)
5. Временные теги не заменяют AEAD
---
## Limitations
- Нет re-keying
- Нет защиты от state desync (nonce)
- Нет replay protection на уровне пакетов (только time-based)
- Жёстко задан HKDF context strings
---
## Summary
Модуль реализует:
- безопасный ECDH handshake
- детерминированный key derivation
- AEAD шифрование с разделением направлений
- дополнительную HMAC-аутентификацию
Подходит для:
- пользовательских протоколов
- туннелей
- транспортных шифрованных каналов