Files
netrunner-proxy/core/src/crypto/README.MD
T
2026-06-30 18:51:09 +07:00

2.7 KiB
Raw Blame History

Блок crypto — криптографический фундамент

Весь крипто-фундамент протокола. Снаружи (из net) видны только SessionKeys, SessionAuth и потоковый шифр ChaChaCipher — остальное детали.

Подробности — в rustdoc: cargo doc --open -p netrunner-core, модуль crypto. Здесь — карта блока и ментальная модель, чтобы быстро сориентироваться.

Файлы

Файл Что внутри
ecdh.rs Эфемерный обмен ключами X25519 (Diffie-Hellman).
hkdf.rs Расширение общего секрета в набор ключей (HKDF-SHA256).
session.rs Оркестрация: соль → ECDH → HKDF → ключи; time-based auth-теги.
chacha.rs Потоковый AEAD ChaCha20-Poly1305 с раздельными nonce по направлениям.
aead.rs Трейт AeadPacker — абстракция шифра для кодека.

Жизненный цикл ключей

 1. SessionKeys::new(is_initiator)   → эфемерный X25519 + локальная соль
 2. <обмен ClientHello/ServerHello>  → узнаём чужой pubkey и соль
 3. SessionKeys::update_keys(...)     → ECDH → HKDF → 2×(key+iv) + auth_key
 4. ChaChaCipher::set_keys(...)       → горячий путь: in-place шифр/дешифр
 5. SessionAuth (auth_key)            → TOTP-подобный тег в каждом кадре

Инварианты (НЕ ЛОМАТЬ)

  • Forward secrecy — приватный ключ X25519 эфемерный и расходуется ровно один раз (ECDH::get_shared забирает его через take()).
  • Уникальность noncenonce = base_iv XOR counter, счётчик у каждого направления свой; повтор nonce при одном ключе ломает шифр.
  • Постоянное времяSessionAuth::verify_tag всегда проходит всё окно кандидатов без раннего выхода (иначе утечёт тайминг подбора тега).

Связи

  • Ключи извлекаются из TLS-расширений модуля tlseng (KeyShare 0x0033).
  • Шифрование вызывается из кодека nrxp через трейт AeadPacker.