Первый выпуск реализации протокола TLS 1.3 на Java с алгоритмами ГОСТ в соответствии с RFC 9367

Модуль crypto-gost-tls13 содержит реализацию TLS 1.3 (RFC 8446 + RFC 9367) с ГОСТ-криптографией. Данный релиз является начальной версией библиотеки и готов для внутреннего использования.

Особенностью библиотеки является реализация на чистой Java. Все криптографические операции выполняются встроенными средствами библиотеки — без внешних зависимостей.

Это в своем роде одна из первых открытых реализаций TLS 1.3 с ГОСТ на Java, поэтому interop-тестирование выполнено в минимально доступном объеме.

Ниже приведены возможности библиотеки.

  1. Протоколы:
  • 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 stapling: сервер прикладывает OCSP-ответ к сертификату.
  • Post-handshake messages: NewSessionTicket (сохранение для PSK).
  1. Криптография:
  • Key schedule: HKDF-Streebog (RFC 5869) по схеме TLS 1.3 (RFC 8446 §7.1).
  • Защита записей: MGM-AEAD (Kuznyechik) с nonce по RFC 8446 §5.3.
  • Эфемерные ключи затираются после использования.
  1. Сертификаты:
  • Парсинг 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 SocketChannel-based transport (blocking mode, interruptible).
  1. Пошаговый handshake:
  • TlsHandshakeEngine — state machine для handshake (отвязан от I/O). Используется TlsSession как оркестратор; пригоден для интеграции с JSSE (SSLEngine).
  1. ByteBuffer API:
  • TlsRecord.protect/unprotect — ByteBuffer-перегрузки для zero-copy интеграции с NIO. Загрузка ключей:
  • Pkcs12Loader — чтение PFX (PKCS#12) с PBKDF2-HMAC-SHA256 + AES-256-CBC.
  1. Завершение сессии:
  • close_notify — корректное закрытие по протоколу.
  • Затирание ключевого материала при закрытии или ошибке.
  • Обработка alert: fatal — немедленное закрытие + затирание.
  1. Безопасность реализации:
  • 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).
  1. Ограничения:
  • Только 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 не поддерживаются).
  1. Тестирование:
  • Библиотека содержит 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 метод), для обеспечения безопасности и снижения вектора атак на парсеры.
  1. Архитектурные решения:
  • TlsHandshakeEngine — state machine, отвязанная от I/O (для будущего модуля JSSE).
  • ByteBuffer-перегрузки TlsRecord.protect/unprotect для NIO/JSSE.
  • TLSTREE кэш (TlsTreeCache) — пересчёт только изменившихся уровней (RFC 9367).
  • InMemoryTlsTransport.Pair — двунаправленная пара для тестов и однопроцессного взаимодействия.

Библиотека распространяется под свободной лицензией.

Источник: linux.org.ru