跳到主要内容

Session

搜索

trait Session 

源代码
pub trait Session:
    Send
    + Sync
    + 'static {
    // Required methods
    fn initial_keys(&self, dst_cid: &ConnectionId, side: Side) -> Keys;
    fn handshake_data(&self) -> Option<Box<dyn Any>>;
    fn peer_identity(&self) -> Option<Box<dyn Any>>;
    fn early_crypto(&self) -> Option<(Box<dyn HeaderKey>, Box<dyn PacketKey>)>;
    fn early_data_accepted(&self) -> Option<bool>;
    fn is_handshaking(&self) -> bool;
    fn read_handshake(&mut self, buf: &[u8]) -> Result<bool, Error>;
    fn transport_parameters(&self) -> Result<Option<TransportParameters>, Error>;
    fn write_handshake(&mut self, buf: &mut Vec<u8>) -> Option<Keys>;
    fn next_1rtt_keys(&mut self) -> Option<KeyPair<Box<dyn PacketKey>>>;
    fn is_valid_retry(
        &self,
        orig_dst_cid: &ConnectionId,
        header: &[u8],
        payload: &[u8],
    ) -> bool;
    fn export_keying_material(
        &self,
        output: &mut [u8],
        label: &[u8],
        context: &[u8],
    ) -> Result<(), ExportKeyingMaterialError>;
}
展开描述

一个加密会话(通常是 TLS)

必需方法§

源代码

fn initial_keys(&self, dst_cid: &ConnectionId, side: Side) -> Keys

根据客户端的初始目标 ConnectionId 创建初始的密钥集合

源代码

fn handshake_data(&self) -> Option<Box<dyn Any>>

获取握手期间协商的数据(若有)

在连接发出 HandshakeDataReady 之前返回 None

源代码

fn peer_identity(&self) -> Option<Box<dyn Any>>

获取对端的身份(若有)

源代码

fn early_crypto(&self) -> Option<(Box<dyn HeaderKey>, Box<dyn PacketKey>)>

若 0-RTT 密钥可用则返回(仅客户端)

在客户端,该方法可用于判断在协议握手完成之前是否有可用的 0-RTT 密钥材料,从而开始发送数据。

若密钥材料不可用则返回 None。例如之前未曾连接过该服务器时就可能出现这种情况。

源代码

fn early_data_accepted(&self) -> Option<bool>

对端是否已接受 0-RTT 加密数据

源代码

fn is_handshaking(&self) -> bool

在连接完全建立之前返回 true

源代码

fn read_handshake(&mut self, buf: &[u8]) -> Result<bool, Error>

读取握手数据的字节

应当使用 CRYPTO 帧的内容调用本方法。若返回 Ok,调用方应调用 write_handshake() 检查加密协议是否有内容要发给对端。该方法仅在首次握手数据就绪时返回 true,后续调用将始终返回 false。

成功时,当且仅当 self.handshake_data() 已被填充时返回 true

源代码

fn transport_parameters(&self) -> Result<Option<TransportParameters>, Error>

对端的 QUIC 传输参数

仅在收到对端的第一批数据之后才可用。

源代码

fn write_handshake(&mut self, buf: &mut Vec<u8>) -> Option<Keys>

将握手字节写入给定缓冲区,并可选择性地返回协商出的密钥

当握手进入下一阶段时,此方法会返回一组用于加密数据的新密钥。

源代码

fn next_1rtt_keys(&mut self) -> Option<KeyPair<Box<dyn PacketKey>>>

为下一次密钥更新计算密钥

源代码

fn is_valid_retry( &self, orig_dst_cid: &ConnectionId, header: &[u8], payload: &[u8], ) -> bool

校验 retry 包的完整性

源代码

fn export_keying_material( &self, output: &mut [u8], label: &[u8], context: &[u8], ) -> Result<(), ExportKeyingMaterialError>

Session 的密钥派生 output.len() 个字节的密钥材料并写入 output,使用 labelcontext 进行域分离。

若请求的输出长度过大,此函数将失败并返回 ExportKeyingMaterialError

实现者§