模 crypto-gost-tls13 包含實現 TLS 1.3(RFC 8446 + RFC 9367) 採用 GOST 加密標準。此版本為庫的初始版本,可供內部使用。
該函式庫的一個獨特之處在於其純 Java 實作。所有加密操作均使用庫的內建工具完成,無需任何外部依賴。
這是第一批使用 Java 實現的基於 GOST 的 TLS 1.3 開源版本之一,因此互通性測試已盡可能減少。
以下是該程式庫的功能。
- 協定:
- 握手方式:完全握手(客戶端/伺服器)、短握手(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 除外)。
- 密碼學:
- 關鍵計劃:HKDF-Streebog(RFC 5869)通過 TLS 1.3(RFC 8446 §7.1)。
- 記錄保護:MGM-AEAD(Kuznyechik),根據 RFC 8446 §5.3 規定使用 nonce。
- 臨時密鑰使用後會被清除。
- 證書:
- 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 的傳輸(阻塞模式,可中斷)。
- 握手步驟詳解:
- TlsHandshakeEngine 是一個用於握手的狀態機(與 I/O 解耦)。它使用 TlsSession 作為協調器,並且適合與 JSSE(SSLEngine)整合。
- ByteBuffer API:
- TlsRecord.protect/unprotect — 用於與 NIO 零拷貝整合的 ByteBuffer 重載。正在載入密鑰:
- Pkcs12Loader — 使用 PBKDF2-HMAC-SHA256 + AES-256-CBC 讀取 PFX (PKCS#12)。
- 會議結束:
- close_notify - 根據協定正確關閉。
- 關閉或出錯時擦拭關鍵材料。
- 處理警報:致命 - 立即關閉 + 刪除。
- 實施安全性:
- 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)。
- 限制:
- 僅支援恢復 PSK(不支援 0-RTT 和外部 PSK)。
- 僅支援 psk_dhe_ke(不支援純 PSK,不支援 ECDHE)。
- HelloRetryRequest(RFC 8446 §4.1.4)不受支援 - 僅使用一個命名組(預設為 GC256A)。
- 僅支援 GOST(不支援非 GOST 密碼套件)。
- 測試:
- 該庫包含 RFC 9367 附錄 A.1 中的已知答案測試(L 和 S 變體)——完整的金鑰調度、TLSTREE、AEAD 和 ECDHE。它還能通過所有 KAT 測試。
- 透過真實的 TCP 套接字進行 4 次整合測試(自互通性)。
- 對解析器進行模糊測試:TlsMessageParser(8 個方法)、TlsDerParser(3 個方法)、TlsOcspVerifier(1 個方法),以確保安全性並減少對解析器的攻擊向量。
- 建築解決方案:
- TlsHandshakeEngine - 與 I/O 解耦的狀態機(用於未來的 JSSE 模組)。
- ByteBuffer 重載了 TlsRecord.protect/unprotect 以用於 NIO/JSSE。
- TLSTREE 快取(TlsTreeCache)- 僅重新計算已更改的等級(RFC 9367)。
- InMemoryTlsTransport.Pair 是一個用於測試和單進程通訊的雙向對。
該庫以自由許可協議發布。
來源: linux.org.ru
