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
fn initial_keys(&self, dst_cid: &ConnectionId, side: Side) -> Keys
根据客户端的初始目标 ConnectionId 创建初始的密钥集合
源代码fn handshake_data(&self) -> Option<Box<dyn Any>>
fn handshake_data(&self) -> Option<Box<dyn Any>>
获取握手期间协商的数据(若有)
在连接发出 HandshakeDataReady 之前返回 None。
源代码fn peer_identity(&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_crypto(&self) -> Option<(Box<dyn HeaderKey>, Box<dyn PacketKey>)>
若 0-RTT 密钥可用则返回(仅客户端)
在客户端,该方法可用于判断在协议握手完成之前是否有可用的 0-RTT 密钥材料,从而开始发送数据。
若密钥材料不可用则返回 None。例如之前未曾连接过该服务器时就可能出现这种情况。
源代码fn early_data_accepted(&self) -> Option<bool>
fn early_data_accepted(&self) -> Option<bool>
对端是否已接受 0-RTT 加密数据
源代码fn is_handshaking(&self) -> bool
fn is_handshaking(&self) -> bool
在连接完全建立之前返回 true。
源代码fn read_handshake(&mut self, buf: &[u8]) -> Result<bool, Error>
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>
fn transport_parameters(&self) -> Result<Option<TransportParameters>, Error>
对端的 QUIC 传输参数
仅在收到对端的第一批数据之后才可用。
源代码fn write_handshake(&mut self, buf: &mut Vec<u8>) -> Option<Keys>
fn write_handshake(&mut self, buf: &mut Vec<u8>) -> Option<Keys>
将握手字节写入给定缓冲区,并可选择性地返回协商出的密钥
当握手进入下一阶段时,此方法会返回一组用于加密数据的新密钥。
源代码fn is_valid_retry(
&self,
orig_dst_cid: &ConnectionId,
header: &[u8],
payload: &[u8],
) -> bool
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>
fn export_keying_material( &self, output: &mut [u8], label: &[u8], context: &[u8], ) -> Result<(), ExportKeyingMaterialError>
从 Session 的密钥派生 output.len() 个字节的密钥材料并写入 output,使用 label 与 context 进行域分离。
若请求的输出长度过大,此函数将失败并返回 ExportKeyingMaterialError。