pub struct Context<C: TlsSession> { /* private fields */ }
Expand description
The context for managing a kTLS connection.
Implementations§
Source§impl<C: TlsSession> Context<C>
impl<C: TlsSession> Context<C>
Sourcepub fn new(session: C, buffer: Option<Buffer>) -> Self
pub fn new(session: C, buffer: Option<Buffer>) -> Self
Creates a new kTLS context with the given TLS session and optional buffer (can be TLS early data received from peer during handshake, or pre-allocated buffer).
Sourcepub const fn buffer_mut(&mut self) -> &mut Buffer
pub const fn buffer_mut(&mut self) -> &mut Buffer
Returns a mutable reference to the buffer.
Sourcepub fn refresh_traffic_keys<S: AsFd>(&mut self, socket: &S) -> Result<()>
pub fn refresh_traffic_keys<S: AsFd>(&mut self, socket: &S) -> Result<()>
Sends a TLS 1.3 key_update
message to refresh a connection’s keys.
This call refreshes our encryption keys. Once the peer receives the message, it refreshes its encryption and decryption keys and sends a response. Once we receive that response, we refresh our decryption keys to match. At the end of this process, keys in both directions have been refreshed.
§Notes
Note that TLS implementations may enforce limits on the number of
key_update
messages allowed on a given connection to prevent
denial of service. Therefore, this should be called sparingly.
Since the kernel will never implicitly and automatically trigger key updates according to the selected cipher suite’s cryptographic constraints, the application is responsible for calling this method as needed to maintain security.
§Known Issues
Under the condition that both parties are kTLS offloaded and the server program uses the Tokio asynchronous runtime, if the server initiates a Key Update and then immediately performs a read I/O operation, it will cause the program to hang (the read I/O operation returns EAGAIN but the task waker does not seem to be registered correctly). This issue needs further investigation.
Only Linux kernel 6.16 or later fully supports runtime key updates.
§Errors
- Updating the TX secret fails.
- Sending the
KeyUpdate
message fails. - Setting the TX secret on the socket fails.
Sourcepub fn handle_io_error<S: AsFd>(&mut self, socket: &S, err: Error) -> Result<()>
pub fn handle_io_error<S: AsFd>(&mut self, socket: &S, err: Error) -> Result<()>
Handles io::Error
s from I/O operations on kTLS-configured sockets.
§Overview
When a socket is configured with kTLS, it can be used like a normal
socket for data transmission - the kernel transparently handles
encryption and decryption. However, TLS control messages (e.g., TLS
alerts) from peers cannot be processed automatically by the kernel,
which returns EIO
to notify userspace.
This method helps handle such errors appropriately:
EIO
: Attempts to process any received TLS control messages. ReturnsOk(())
on success, allowing the caller to retry the operation.Interrupted
: Indicates the operation was interrupted by a signal. ReturnsOk(())
, allowing the caller to retry the operation.WouldBlock
: Indicates the operation would block (e.g., non-blocking socket). ReturnsOk(())
, allowing the caller to retry the operation.BrokenPipe
: Marks the stream as closed.- Other errors: Aborts the connection with an
internal_error
alert and returns the original error.
§Notes
Incorrect usage of this method MAY lead to unexpected behavior.
§Errors
Returns the original io::Error
if it cannot be recovered from.