這是用 Java 編寫的 TLS 1.3 協定實現的第一個版本,採用了符合 RFC 9367 標準的 GOST 演算法。

crypto-gost-tls13 包含實現 TLS 1.3(RFC 8446 + RFC 9367) 採用 GOST 加密標準。此版本為庫的初始版本,可供內部使用。

該函式庫的一個獨特之處在於其純 Java 實作。所有加密操作均使用庫的內建工具完成,無需任何外部依賴。

這是第一批使用 Java 實現的基於 GOST 的 TLS 1.3 開源版本之一,因此互通性測試已盡可能減少。

以下是該程式庫的功能。

  1. 協定:
  • 握手方式:完全握手(客戶端/伺服器)、短握手(PSK)、雙向握手(mTLS)。
  • ALPN(RFC 7301)- 應用層協定協商(HTTP/2、HTTP/1.1)。
  • SNI(RFC 6066)- 多租用戶部署的伺服器名稱指示。
  • KeyUpdate(RFC 8446 §4.6.3)-更新流量加密金鑰。
  • 密碼套件:TLS_KUZNYECHIK_MGM_STREEBOG_256_L/S。
  • ECDHE:CryptoPro-A(256 位元)、CryptoPro-B(512 位元)
  • 依記錄重新金鑰化 TLSTREE — 變更每個 TLS 記錄的加密金鑰。
  • 握手和記錄的碎片化和重組(RFC 8446 §5.1)。
  • 會話恢復:透過 NewSessionTicket 使用 PSK(記憶體中的 PskStore,一次性使用)。
  • OCSP 裝訂:伺服器將 OCSP 回應附加到憑證。
  • 握手後訊息:NewSessionTicket(PSK 除外)。
  1. 密碼學:
  • 關鍵計劃:HKDF-Streebog(RFC 5869)通過 TLS 1.3(RFC 8446 §7.1)。
  • 記錄保護:MGM-AEAD(Kuznyechik),根據 RFC 8446 §5.3 規定使用 nonce。
  • 臨時密鑰使用後會被清除。
  1. 證書:
  • X.509v3 解析(GOST R 34.10-2012)— 內建 DER 解析器。
  • 驗證鏈:簽章、DN(頒發者→主體)、基本約束、金鑰用途、擴充金鑰用途(伺服器驗證/用戶端驗證)、路徑長度。
  • 主機名稱檢查:dNSName + iPAddress(RFC 6125)。
  • OCSP回應的驗證(RFC 6960)。

4.交通:

  • TlsTransport - 介面。
  • InMemoryTlsTransport - 用於測試和單進程場景(記憶體佇列)。
  • SocketTlsTransport — 透過 java.net.Socket 阻塞 I/O。
  • ChannelTlsTransport - 基於 NIO SocketChannel 的傳輸(阻塞模式,可中斷)。
  1. 握手步驟詳解:
  • TlsHandshakeEngine 是一個用於握手的狀態機(與 I/O 解耦)。它使用 TlsSession 作為協調器,並且適合與 JSSE(SSLEngine)整合。
  1. ByteBuffer API:
  • TlsRecord.protect/unprotect — 用於與 NIO 零拷貝整合的 ByteBuffer 重載。正在載入密鑰:
  • Pkcs12Loader — 使用 PBKDF2-HMAC-SHA256 + AES-256-CBC 讀取 PFX (PKCS#12)。
  1. 會議結束:
  • close_notify - 根據協定正確關閉。
  • 關閉或出錯時擦拭關鍵材料。
  • 處理警報:致命 - 立即關閉 + 刪除。
  1. 實施安全性:
  • verify_data 和 PSK 綁定器的恆定時間比較(防止計時攻擊)
  • 清除金鑰材質:對所有包含鍵(TlsKeySchedule、TlsTrafficKeys、TlsRecord、HandshakeContext)的物件執行 destroy(),關閉時發出致命警報,握手過程中出現異常
  • DoS 防護:限制憑證鍊長度(10)、握手後訊息、記錄大小。
  • MGM nonce:第一個位元組的最高有效位元 (MSB) 被清除,用於 ICN(RFC 9058 §3,RFC 9367 §3.3)。
  • 握手完成後,ECDHE 私鑰和握手記錄將被銷毀。
  • HMAC 金鑰材料在使用後會被擦除(HkdfStreebog,KdfGostR3411_2012_256)。
  1. 限制:
  • 僅支援恢復 PSK(不支援 0-RTT 和外部 PSK)。
  • 僅支援 psk_dhe_ke(不支援純 PSK,不支援 ECDHE)。
  • HelloRetryRequest(RFC 8446 §4.1.4)不受支援 - 僅使用一個命名組(預設為 GC256A)。
  • 僅支援 GOST(不支援非 GOST 密碼套件)。
  1. 測試:
  • 該庫包含 RFC 9367 附錄 A.1 中的已知答案測試(L 和 S 變體)——完整的金鑰調度、TLSTREE、AEAD 和 ECDHE。它還能通過所有 KAT 測試。
  • 透過真實的 TCP 套接字進行 4 次整合測試(自互通性)。
  • 對解析器進行模糊測試:TlsMessageParser(8 個方法)、TlsDerParser(3 個方法)、TlsOcspVerifier(1 個方法),以確保安全性並減少對解析器的攻擊向量。
  1. 建築解決方案:
  • TlsHandshakeEngine - 與 I/O 解耦的狀態機(用於未來的 JSSE 模組)。
  • ByteBuffer 重載了 TlsRecord.protect/unprotect 以用於 NIO/JSSE。
  • TLSTREE 快取(TlsTreeCache)- 僅重新計算已更改的等級(RFC 9367)。
  • InMemoryTlsTransport.Pair 是一個用於測試和單進程通訊的雙向對。

該庫以自由許可協議發布。

來源: linux.org.ru