модуль crypto-gost-tls13 містить реалізацію TLS 1.3 (RFC 8446 + RFC 9367) із ГОСТ-криптографією. Цей реліз є початковою версією бібліотеки та готовий для внутрішнього використання.
Особливістю бібліотеки є реалізація на чистій Java. Усі криптографічні операції виконуються вбудованими засобами бібліотеки без зовнішніх залежностей.
Це в своєму роді одна з перших відкритих реалізацій TLS 1.3 з ГОСТ Java, тому interop-тестування виконано в мінімально доступному обсязі.
Нижче наведено можливості бібліотеки.
- Протоколи:
- Handshake: повний (client/server), скорочений (PSK), взаємний (mTLS).
- ALPN (RFC 7301) - узгодження протоколу прикладного рівня (HTTP/2, HTTP/1.1).
- SNI (RFC 6066) - вказівка імені сервера для multi-tenant розгортань.
- KeyUpdate (RFC 8446 §4.6.3) - оновлення ключів шифрування трафіку.
- Cipher suites: TLS_KUZNYECHIK_MGM_STREEBOG_256_L/S.
- ECDHE: CryptoPro-A (256-bit), CryptoPro-B (512-bit)
- Per-record TLSTREE re-keying — зміна ключа шифрування на кожний запис TLS.
- Фрагментація та складання рукостискань та записів (RFC 8446 §5.1).
- Session resumption: PSK через NewSessionTicket (PskStore in-memory, single-use).
- Степлювання OCSP: сервер прикладає OCSP-відповідь до сертифіката.
- Post-handshake messages: NewSessionTicket (збереження для PSK).
- Криптографія:
- Key schedule: HKDF-Streebog (RFC 5869) за схемою TLS 1.3 (RFC 8446 §7.1).
- Захист записів: MGM-AEAD (Kuznyechik) з nonce RFC 8446 §5.3.
- Ефемерні ключі затираються після використання.
- сертифікати:
- Парсинг X.509v3 (GOST R 34.10-2012) – вбудований DER-парсер.
- Валідація ланцюжка: підписи, DN (issuer → subject), Basic Constraints, Key Usage, Extended Key * Usage (serverAuth/clientAuth), pathLen.
- Перевірка hostname: dNSName + iPAddress (RFC 6125).
- Верифікація відповідей OCSP (RFC 6960).
4.Транспорт:
- TlsTransport - інтерфейс.
- InMemoryTlsTransport - для тестів та однопроцесних сценаріїв (in-memory черга).
- SocketTlsTransport - blocking I/O через java.net.Socket.
- ChannelTlsTransport — NIO Socket Channel-базований транспорт (blocking mode, interruptible).
- Покроковий handshake:
- TlsHandshakeEngine - state machine для handshake (відв'язаний від I/O). Використовується TlsSession як оркестратор; придатний для інтеграції із JSSE (SSLEngine).
- ByteBuffer API:
- TlsRecord.protect/unprotect — ByteBuffer-навантаження для zero-copy інтеграції з NIO. Завантаження ключів:
- Pkcs12Loader - читання PFX (PKCS # 12) з PBKDF2-HMAC-SHA256 + AES-256-CBC.
- Завершення сесії:
- close_notify - коректне закриття протоколу.
- Затирання ключового матеріалу під час закриття або помилки.
- Обробка alert: fatal - негайне закриття + затирання.
- Безпека реалізації:
- Constant-time порівняння для verify_data та PSK binders (захист від timing attacks)
- Затирання ключового матеріалу: destroy() на всіх об'єктах з ключами (TlsKeySchedule, TlsTrafficKeys, TlsRecord, HandshakeContext), при close, fatal alert, exception в handshake
- Захист від DoS: ліміти на довжину ланцюжка сертифікатів (10), post-handshake messages, розмір записів.
- MGM nonce: MSB першого байта очищається для ICN (RFC 9058 §3, RFC 9367 §3.3).
- ECDHE-приватний ключ та транскрипт handshake знищуються після завершення handshake.
- HMAC-ключовий матеріал затирається після використання (HkdfStreebog, KdfGostR3411_2012_256).
- обмеження:
- Тільки resumption PSK (0-RTT та external PSK не підтримуються).
- Тільки psk_dhe_ke (pure PSK без ECDHE не підтримується).
- HelloRetryRequest (RFC 8446 §4.1.4) не підтримується - використовується лише одна named group (GC256A за замовчуванням).
- Тільки ДЕРЖСТАНДАРТ (non-GOST cipher suites не підтримуються).
- Тестування:
- Бібліотека містить Known Answer Tests з RFC 9367 Appendix A.1 (L та S варіанти) - повний key schedule, TLSTREE, AEAD, ECDHE. І проходить повний спектр тестів KAT.
- 4 інтеграційні тести (self-interop) через реальні TCP-сокети.
- Фазинг-тести для парсерів: TlsMessageParser (8 методів), TlsDerParser (3 методи), TlsOcspVerifier (1 метод), для забезпечення безпеки та зниження вектора атак на парсери.
- Архітектурні рішення:
- TlsHandshakeEngine - state machine, відв'язана від I/O (для майбутнього модуля JSSE).
- ByteBuffer-навантаження TlsRecord.protect/unprotect для NIO/JSSE.
- TLSTREE кеш (TlsTreeCache) — перерахунок рівнів, що тільки змінилися (RFC 9367).
- InMemoryTlsTransport.Pair — двонаправлена пара для тестів та однопроцесної взаємодії.
Бібліотека поширюється під вільною ліцензією.
Джерело: linux.org.ru
