Cipher Extensions
Trên trang này
Namespace: Nalix.SDK.Transport.Extensions
Assembly: Nalix.SDK
Nalix.SDK.Transport.Extensions cung cấp hai extension quản lý mật mã sau khi bắt tay trên ITransportSession:
CipherExtensions.UpdateCipherAsync: Thương lượng chuyển đổiCipherSuiteTypeđối xứng ngay trong phiên (ControlType.CIPHER_UPDATE$\rightarrow$CIPHER_UPDATE_ACK) mà không cần chạy lại handshake X25519.RekeyExtensions.RekeyAsync: XoaySessionState.Secret32 byte bằngHandshakeX25519.DeriveRekeySecret(ControlType.SESSION_REKEY$\rightarrow$SESSION_REKEY_ACK) và đặt lại bộ đếm sequence.
Ánh xạ mã nguồn
src/Nalix.SDK/Transport/Extensions/CipherExtensions.cssrc/Nalix.SDK/Transport/Extensions/RekeyExtensions.cssrc/Nalix.Abstractions/Security/CipherSuiteType.cssrc/Nalix.Codec/ProtocolFrames/Control.cssrc/Nalix.Abstractions/Networking/Protocols/ControlType.cs
Chữ ký công khai
namespace Nalix.SDK.Transport.Extensions;
public static class CipherExtensions
{
public static ValueTask UpdateCipherAsync(
this ITransportSession session,
CipherSuiteType cipherSuite,
int timeoutMs = 5000,
CancellationToken ct = default);
}
public static class RekeyExtensions
{
public static ValueTask RekeyAsync(
this ITransportSession session,
CancellationToken ct = default);
}
1. Chuyển bộ mật mã trực tiếp (UpdateCipherAsync)
sequenceDiagram
participant C as Client (ITransportSession)
participant S as Server (SystemControlHandlers)
Note over C: Save previousCipher = Options.Algorithm
C->>S: Control(CIPHER_UPDATE, SequenceId = seq, Reason = (ProtocolReason)cipherSuite)
Note over C: Options.Algorithm = cipherSuite
S-->>C: Control(CIPHER_UPDATE_ACK, SequenceId = seq)- Điều kiện trước: Ném
ArgumentNullExceptionnếusessionlànull. - Thương lượng & hoàn tác: Gửi một gói
ControlvớiType = ControlType.CIPHER_UPDATE,SequenceId = seqvàReason = (ProtocolReason)cipherSuite, sau đó chuyển ngaysession.Options.Algorithm = cipherSuiteđểCIPHER_UPDATE_ACKđã mã hóa có thể được giải mã bằng cipher mới, rồi chờControl(ControlType.CIPHER_UPDATE_ACK, SequenceId == seq)trong tối đatimeoutMs(hoàn tácsession.Options.Algorithm = previousCiphernếu server không xác nhận).
2. Xoay khóa giữa phiên (RekeyAsync)
sequenceDiagram
participant C as Client (ITransportSession)
participant S as Server (SystemControlHandlers)
Note over C: newKey = HandshakeX25519.DeriveRekeySecret(State.Secret)
C->>S: Control(SESSION_REKEY, SequenceId = seqId, Flags = SYSTEM) (encrypted with old key)
Note over C: State.Secret = newKey + ResetSequenceCounters()
S-->>C: Control(SESSION_REKEY_ACK, SequenceId = seqId) (encrypted with new key)- Dẫn xuất khóa: Cả client và server đều dẫn xuất
newKeyquaHandshakeX25519.DeriveRekeySecret(currentSecret). - Đặt lại bộ đếm sequence & hoàn tác: Ngay sau khi gửi
SESSION_REKEY, cập nhậtsession.State.Secret = newKeyvà gọisession.ResetSequenceCounters(), rồi chờControl(ControlType.SESSION_REKEY_ACK, SequenceId == seqId)(hoàn tácsession.State.Secret = previousKeykhi hết thời gian chờ hoặc gặp lỗi).
Ví dụ sử dụng
using Nalix.Abstractions.Security;
using Nalix.SDK.Transport.Extensions;
// 1. Chuyển từ Chacha20Poly1305 mặc định sang Salsa20Poly1305
await session.UpdateCipherAsync(CipherSuiteType.Salsa20Poly1305, timeoutMs: 5_000);
// 2. Xoay khóa phiên 32 byte
await session.RekeyAsync();