pub struct QuicConnection { /* private fields */ }Expand description
A TLS 1.3 handshake for a QUIC connection.
Implementations§
Source§impl QuicConnection
impl QuicConnection
Sourcepub fn new_server(
cfg: Arc<ServerConfig>,
transport_params: Vec<u8>,
) -> QuicConnection
pub fn new_server( cfg: Arc<ServerConfig>, transport_params: Vec<u8>, ) -> QuicConnection
A server; transport_params is our encoded transport_parameters extension body.
Examples found in repository?
examples/../tests/fuzzing/mod.rs (line 143)
122pub fn corpus() -> Corpus {
123 let ss = certgen::issue(&CertParams::server(&["localhost"]), PrivateKey::generate_ec(EcCurve::P256), None);
124 let mut roots = RootStore::empty();
125 roots.add_der(&ss.cert_der).unwrap();
126 let scfg = Arc::new(ServerConfig::new(CertifiedKey::new(vec![ss.cert_der.clone()], ss.key.clone()).unwrap()).with_alpn(&[b"h3", b"http/1.1"]));
127 let mut cc = ClientConfig::new(roots).with_alpn(&[b"h3", b"http/1.1"]);
128 cc.sessions = None;
129 let ccfg = Arc::new(cc);
130 // a TLS handshake transcript
131 let mut c = ClientConnection::new(ccfg.clone(), "localhost").unwrap();
132 let mut s = ServerConnection::new(scfg.clone());
133 let ch = c.tls_output().to_vec();
134 c.consume_tls_output(ch.len());
135 s.read_tls(&ch);
136 s.process_new_packets().unwrap();
137 let flight = s.tls_output().to_vec();
138 let mut ch_plus = ch.clone();
139 ch_plus.extend_from_slice(&[20, 3, 3, 0, 1, 1, 23, 3, 3, 0, 20]);
140 ch_plus.extend(std::iter::repeat_n(0xaa, 20));
141 // a QUIC handshake: the ClientHello message and the server's Handshake-level flight
142 let mut qc = QuicConnection::new_client(ccfg.clone(), "localhost", vec![1, 2, 3]).unwrap();
143 let mut qs = QuicConnection::new_server(scfg.clone(), vec![4, 5, 6]);
144 let mut ch_msg = Vec::new();
145 qc.write_handshake(&mut ch_msg);
146 qs.read_handshake(Level::Initial, &ch_msg).unwrap();
147 let mut sh = Vec::new();
148 qs.write_handshake(&mut sh);
149 let mut hs = Vec::new();
150 qs.write_handshake(&mut hs);
151 Corpus {
152 scfg,
153 ccfg,
154 to_server: vec![ch, ch_plus],
155 to_client: vec![flight],
156 ch_msg,
157 server_hs_flight: hs,
158 key_der: ss.key_der.clone(),
159 cert_der: ss.cert_der,
160 }
161}
162
163/// Feeds `data` in random-sized pieces and processes after each; checks that errors stick.
164fn feed(rng: &mut Rng, conn: &mut simoom_tls::Connection, data: &[u8]) {
165 let mut off = 0;
166 while off < data.len() {
167 let k = 1 + rng.below(data.len() - off);
168 let taken = conn.read_tls(&data[off..off + k]);
169 off += taken;
170 let r = conn.process_new_packets();
171 if let Err(e) = r {
172 assert_eq!(conn.process_new_packets().unwrap_err(), e, "errors must stick");
173 assert!(conn.tls_output().len() < 64 * 1024, "output stays bounded");
174 assert!(conn.write_plaintext(b"x").is_err(), "a failed connection refuses writes");
175 return;
176 }
177 if taken == 0 {
178 // buffer full: the application reads plaintext
179 let n = conn.plaintext().len();
180 if n == 0 {
181 return;
182 }
183 conn.consume_plaintext(n);
184 }
185 }
186}
187
188pub fn server_records(rng: &mut Rng, c: &Corpus, iters: usize) {
189 for _ in 0..iters {
190 let seed = &c.to_server[rng.below(c.to_server.len())];
191 let data = mutate(rng, seed, &c.to_client);
192 let mut s = ServerConnection::new(c.scfg.clone());
193 feed(rng, &mut s, &data);
194 }
195}
196
197pub fn client_records(rng: &mut Rng, c: &Corpus, iters: usize) {
198 for _ in 0..iters {
199 let data = mutate(rng, &c.to_client[0], &c.to_server);
200 let mut cl = ClientConnection::new(c.ccfg.clone(), "localhost").unwrap();
201 let n = cl.tls_output().len();
202 cl.consume_tls_output(n);
203 feed(rng, &mut cl, &data);
204 }
205}
206
207/// ClientHello parsing (and everything the server does with it) without the record layer.
208pub fn quic_server_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
209 for _ in 0..iters {
210 let m = mutate(rng, &c.ch_msg, &[]);
211 let mut s = QuicConnection::new_server(c.scfg.clone(), vec![9]);
212 if s.read_handshake(Level::Initial, &m).is_err() {
213 assert!(s.tls_alert().is_some());
214 }
215 let mut out = Vec::new();
216 while s.write_handshake(&mut out).is_some() {}
217 }
218}
219
220/// EncryptedExtensions, Certificate (X.509), CertificateVerify and Finished parsing on the
221/// client: a real ServerHello, then a mutated Handshake-level flight.
222pub fn quic_client_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
223 for _ in 0..iters {
224 let mut qc = QuicConnection::new_client(c.ccfg.clone(), "localhost", vec![1]).unwrap();
225 let mut qs = QuicConnection::new_server(c.scfg.clone(), vec![2]);
226 let mut ch = Vec::new();
227 qc.write_handshake(&mut ch);
228 qs.read_handshake(Level::Initial, &ch).unwrap();
229 let mut sh = Vec::new();
230 qs.write_handshake(&mut sh);
231 let mut hs = Vec::new();
232 qs.write_handshake(&mut hs);
233 qc.read_handshake(Level::Initial, &sh).unwrap();
234 let mut ignore = Vec::new();
235 qc.write_handshake(&mut ignore);
236 let m = mutate(rng, &hs, &[c.cert_der.clone()]);
237 let _ = qc.read_handshake(Level::Handshake, &m);
238 }
239}Sourcepub fn new_client(
cfg: Arc<ClientConfig>,
server_name: &str,
transport_params: Vec<u8>,
) -> Result<QuicConnection>
pub fn new_client( cfg: Arc<ClientConfig>, server_name: &str, transport_params: Vec<u8>, ) -> Result<QuicConnection>
A client; the ClientHello is ready for the first write_handshake. The configuration
must have ALPN protocols.
Examples found in repository?
examples/../tests/fuzzing/mod.rs (line 142)
122pub fn corpus() -> Corpus {
123 let ss = certgen::issue(&CertParams::server(&["localhost"]), PrivateKey::generate_ec(EcCurve::P256), None);
124 let mut roots = RootStore::empty();
125 roots.add_der(&ss.cert_der).unwrap();
126 let scfg = Arc::new(ServerConfig::new(CertifiedKey::new(vec![ss.cert_der.clone()], ss.key.clone()).unwrap()).with_alpn(&[b"h3", b"http/1.1"]));
127 let mut cc = ClientConfig::new(roots).with_alpn(&[b"h3", b"http/1.1"]);
128 cc.sessions = None;
129 let ccfg = Arc::new(cc);
130 // a TLS handshake transcript
131 let mut c = ClientConnection::new(ccfg.clone(), "localhost").unwrap();
132 let mut s = ServerConnection::new(scfg.clone());
133 let ch = c.tls_output().to_vec();
134 c.consume_tls_output(ch.len());
135 s.read_tls(&ch);
136 s.process_new_packets().unwrap();
137 let flight = s.tls_output().to_vec();
138 let mut ch_plus = ch.clone();
139 ch_plus.extend_from_slice(&[20, 3, 3, 0, 1, 1, 23, 3, 3, 0, 20]);
140 ch_plus.extend(std::iter::repeat_n(0xaa, 20));
141 // a QUIC handshake: the ClientHello message and the server's Handshake-level flight
142 let mut qc = QuicConnection::new_client(ccfg.clone(), "localhost", vec![1, 2, 3]).unwrap();
143 let mut qs = QuicConnection::new_server(scfg.clone(), vec![4, 5, 6]);
144 let mut ch_msg = Vec::new();
145 qc.write_handshake(&mut ch_msg);
146 qs.read_handshake(Level::Initial, &ch_msg).unwrap();
147 let mut sh = Vec::new();
148 qs.write_handshake(&mut sh);
149 let mut hs = Vec::new();
150 qs.write_handshake(&mut hs);
151 Corpus {
152 scfg,
153 ccfg,
154 to_server: vec![ch, ch_plus],
155 to_client: vec![flight],
156 ch_msg,
157 server_hs_flight: hs,
158 key_der: ss.key_der.clone(),
159 cert_der: ss.cert_der,
160 }
161}
162
163/// Feeds `data` in random-sized pieces and processes after each; checks that errors stick.
164fn feed(rng: &mut Rng, conn: &mut simoom_tls::Connection, data: &[u8]) {
165 let mut off = 0;
166 while off < data.len() {
167 let k = 1 + rng.below(data.len() - off);
168 let taken = conn.read_tls(&data[off..off + k]);
169 off += taken;
170 let r = conn.process_new_packets();
171 if let Err(e) = r {
172 assert_eq!(conn.process_new_packets().unwrap_err(), e, "errors must stick");
173 assert!(conn.tls_output().len() < 64 * 1024, "output stays bounded");
174 assert!(conn.write_plaintext(b"x").is_err(), "a failed connection refuses writes");
175 return;
176 }
177 if taken == 0 {
178 // buffer full: the application reads plaintext
179 let n = conn.plaintext().len();
180 if n == 0 {
181 return;
182 }
183 conn.consume_plaintext(n);
184 }
185 }
186}
187
188pub fn server_records(rng: &mut Rng, c: &Corpus, iters: usize) {
189 for _ in 0..iters {
190 let seed = &c.to_server[rng.below(c.to_server.len())];
191 let data = mutate(rng, seed, &c.to_client);
192 let mut s = ServerConnection::new(c.scfg.clone());
193 feed(rng, &mut s, &data);
194 }
195}
196
197pub fn client_records(rng: &mut Rng, c: &Corpus, iters: usize) {
198 for _ in 0..iters {
199 let data = mutate(rng, &c.to_client[0], &c.to_server);
200 let mut cl = ClientConnection::new(c.ccfg.clone(), "localhost").unwrap();
201 let n = cl.tls_output().len();
202 cl.consume_tls_output(n);
203 feed(rng, &mut cl, &data);
204 }
205}
206
207/// ClientHello parsing (and everything the server does with it) without the record layer.
208pub fn quic_server_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
209 for _ in 0..iters {
210 let m = mutate(rng, &c.ch_msg, &[]);
211 let mut s = QuicConnection::new_server(c.scfg.clone(), vec![9]);
212 if s.read_handshake(Level::Initial, &m).is_err() {
213 assert!(s.tls_alert().is_some());
214 }
215 let mut out = Vec::new();
216 while s.write_handshake(&mut out).is_some() {}
217 }
218}
219
220/// EncryptedExtensions, Certificate (X.509), CertificateVerify and Finished parsing on the
221/// client: a real ServerHello, then a mutated Handshake-level flight.
222pub fn quic_client_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
223 for _ in 0..iters {
224 let mut qc = QuicConnection::new_client(c.ccfg.clone(), "localhost", vec![1]).unwrap();
225 let mut qs = QuicConnection::new_server(c.scfg.clone(), vec![2]);
226 let mut ch = Vec::new();
227 qc.write_handshake(&mut ch);
228 qs.read_handshake(Level::Initial, &ch).unwrap();
229 let mut sh = Vec::new();
230 qs.write_handshake(&mut sh);
231 let mut hs = Vec::new();
232 qs.write_handshake(&mut hs);
233 qc.read_handshake(Level::Initial, &sh).unwrap();
234 let mut ignore = Vec::new();
235 qc.write_handshake(&mut ignore);
236 let m = mutate(rng, &hs, &[c.cert_der.clone()]);
237 let _ = qc.read_handshake(Level::Handshake, &m);
238 }
239}Sourcepub fn set_version(&mut self, version: u32)
pub fn set_version(&mut self, version: u32)
Selects the QUIC version whose key labels are used (default VERSION_1); set it
before the first key change.
Sourcepub fn read_handshake(&mut self, level: Level, data: &[u8]) -> Result<()>
pub fn read_handshake(&mut self, level: Level, data: &[u8]) -> Result<()>
Feeds CRYPTO frame data received at level, in order.
Examples found in repository?
examples/../tests/fuzzing/mod.rs (line 146)
122pub fn corpus() -> Corpus {
123 let ss = certgen::issue(&CertParams::server(&["localhost"]), PrivateKey::generate_ec(EcCurve::P256), None);
124 let mut roots = RootStore::empty();
125 roots.add_der(&ss.cert_der).unwrap();
126 let scfg = Arc::new(ServerConfig::new(CertifiedKey::new(vec![ss.cert_der.clone()], ss.key.clone()).unwrap()).with_alpn(&[b"h3", b"http/1.1"]));
127 let mut cc = ClientConfig::new(roots).with_alpn(&[b"h3", b"http/1.1"]);
128 cc.sessions = None;
129 let ccfg = Arc::new(cc);
130 // a TLS handshake transcript
131 let mut c = ClientConnection::new(ccfg.clone(), "localhost").unwrap();
132 let mut s = ServerConnection::new(scfg.clone());
133 let ch = c.tls_output().to_vec();
134 c.consume_tls_output(ch.len());
135 s.read_tls(&ch);
136 s.process_new_packets().unwrap();
137 let flight = s.tls_output().to_vec();
138 let mut ch_plus = ch.clone();
139 ch_plus.extend_from_slice(&[20, 3, 3, 0, 1, 1, 23, 3, 3, 0, 20]);
140 ch_plus.extend(std::iter::repeat_n(0xaa, 20));
141 // a QUIC handshake: the ClientHello message and the server's Handshake-level flight
142 let mut qc = QuicConnection::new_client(ccfg.clone(), "localhost", vec![1, 2, 3]).unwrap();
143 let mut qs = QuicConnection::new_server(scfg.clone(), vec![4, 5, 6]);
144 let mut ch_msg = Vec::new();
145 qc.write_handshake(&mut ch_msg);
146 qs.read_handshake(Level::Initial, &ch_msg).unwrap();
147 let mut sh = Vec::new();
148 qs.write_handshake(&mut sh);
149 let mut hs = Vec::new();
150 qs.write_handshake(&mut hs);
151 Corpus {
152 scfg,
153 ccfg,
154 to_server: vec![ch, ch_plus],
155 to_client: vec![flight],
156 ch_msg,
157 server_hs_flight: hs,
158 key_der: ss.key_der.clone(),
159 cert_der: ss.cert_der,
160 }
161}
162
163/// Feeds `data` in random-sized pieces and processes after each; checks that errors stick.
164fn feed(rng: &mut Rng, conn: &mut simoom_tls::Connection, data: &[u8]) {
165 let mut off = 0;
166 while off < data.len() {
167 let k = 1 + rng.below(data.len() - off);
168 let taken = conn.read_tls(&data[off..off + k]);
169 off += taken;
170 let r = conn.process_new_packets();
171 if let Err(e) = r {
172 assert_eq!(conn.process_new_packets().unwrap_err(), e, "errors must stick");
173 assert!(conn.tls_output().len() < 64 * 1024, "output stays bounded");
174 assert!(conn.write_plaintext(b"x").is_err(), "a failed connection refuses writes");
175 return;
176 }
177 if taken == 0 {
178 // buffer full: the application reads plaintext
179 let n = conn.plaintext().len();
180 if n == 0 {
181 return;
182 }
183 conn.consume_plaintext(n);
184 }
185 }
186}
187
188pub fn server_records(rng: &mut Rng, c: &Corpus, iters: usize) {
189 for _ in 0..iters {
190 let seed = &c.to_server[rng.below(c.to_server.len())];
191 let data = mutate(rng, seed, &c.to_client);
192 let mut s = ServerConnection::new(c.scfg.clone());
193 feed(rng, &mut s, &data);
194 }
195}
196
197pub fn client_records(rng: &mut Rng, c: &Corpus, iters: usize) {
198 for _ in 0..iters {
199 let data = mutate(rng, &c.to_client[0], &c.to_server);
200 let mut cl = ClientConnection::new(c.ccfg.clone(), "localhost").unwrap();
201 let n = cl.tls_output().len();
202 cl.consume_tls_output(n);
203 feed(rng, &mut cl, &data);
204 }
205}
206
207/// ClientHello parsing (and everything the server does with it) without the record layer.
208pub fn quic_server_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
209 for _ in 0..iters {
210 let m = mutate(rng, &c.ch_msg, &[]);
211 let mut s = QuicConnection::new_server(c.scfg.clone(), vec![9]);
212 if s.read_handshake(Level::Initial, &m).is_err() {
213 assert!(s.tls_alert().is_some());
214 }
215 let mut out = Vec::new();
216 while s.write_handshake(&mut out).is_some() {}
217 }
218}
219
220/// EncryptedExtensions, Certificate (X.509), CertificateVerify and Finished parsing on the
221/// client: a real ServerHello, then a mutated Handshake-level flight.
222pub fn quic_client_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
223 for _ in 0..iters {
224 let mut qc = QuicConnection::new_client(c.ccfg.clone(), "localhost", vec![1]).unwrap();
225 let mut qs = QuicConnection::new_server(c.scfg.clone(), vec![2]);
226 let mut ch = Vec::new();
227 qc.write_handshake(&mut ch);
228 qs.read_handshake(Level::Initial, &ch).unwrap();
229 let mut sh = Vec::new();
230 qs.write_handshake(&mut sh);
231 let mut hs = Vec::new();
232 qs.write_handshake(&mut hs);
233 qc.read_handshake(Level::Initial, &sh).unwrap();
234 let mut ignore = Vec::new();
235 qc.write_handshake(&mut ignore);
236 let m = mutate(rng, &hs, &[c.cert_der.clone()]);
237 let _ = qc.read_handshake(Level::Handshake, &m);
238 }
239}Sourcepub fn write_level(&self) -> Level
pub fn write_level(&self) -> Level
The level of the bytes the next write_handshake appends.
Sourcepub fn write_handshake(&mut self, out: &mut Vec<u8>) -> Option<KeyChange>
pub fn write_handshake(&mut self, out: &mut Vec<u8>) -> Option<KeyChange>
Appends handshake bytes to send at write_level; returns a key
change when one is due, after which the write level has advanced.
Examples found in repository?
examples/../tests/fuzzing/mod.rs (line 145)
122pub fn corpus() -> Corpus {
123 let ss = certgen::issue(&CertParams::server(&["localhost"]), PrivateKey::generate_ec(EcCurve::P256), None);
124 let mut roots = RootStore::empty();
125 roots.add_der(&ss.cert_der).unwrap();
126 let scfg = Arc::new(ServerConfig::new(CertifiedKey::new(vec![ss.cert_der.clone()], ss.key.clone()).unwrap()).with_alpn(&[b"h3", b"http/1.1"]));
127 let mut cc = ClientConfig::new(roots).with_alpn(&[b"h3", b"http/1.1"]);
128 cc.sessions = None;
129 let ccfg = Arc::new(cc);
130 // a TLS handshake transcript
131 let mut c = ClientConnection::new(ccfg.clone(), "localhost").unwrap();
132 let mut s = ServerConnection::new(scfg.clone());
133 let ch = c.tls_output().to_vec();
134 c.consume_tls_output(ch.len());
135 s.read_tls(&ch);
136 s.process_new_packets().unwrap();
137 let flight = s.tls_output().to_vec();
138 let mut ch_plus = ch.clone();
139 ch_plus.extend_from_slice(&[20, 3, 3, 0, 1, 1, 23, 3, 3, 0, 20]);
140 ch_plus.extend(std::iter::repeat_n(0xaa, 20));
141 // a QUIC handshake: the ClientHello message and the server's Handshake-level flight
142 let mut qc = QuicConnection::new_client(ccfg.clone(), "localhost", vec![1, 2, 3]).unwrap();
143 let mut qs = QuicConnection::new_server(scfg.clone(), vec![4, 5, 6]);
144 let mut ch_msg = Vec::new();
145 qc.write_handshake(&mut ch_msg);
146 qs.read_handshake(Level::Initial, &ch_msg).unwrap();
147 let mut sh = Vec::new();
148 qs.write_handshake(&mut sh);
149 let mut hs = Vec::new();
150 qs.write_handshake(&mut hs);
151 Corpus {
152 scfg,
153 ccfg,
154 to_server: vec![ch, ch_plus],
155 to_client: vec![flight],
156 ch_msg,
157 server_hs_flight: hs,
158 key_der: ss.key_der.clone(),
159 cert_der: ss.cert_der,
160 }
161}
162
163/// Feeds `data` in random-sized pieces and processes after each; checks that errors stick.
164fn feed(rng: &mut Rng, conn: &mut simoom_tls::Connection, data: &[u8]) {
165 let mut off = 0;
166 while off < data.len() {
167 let k = 1 + rng.below(data.len() - off);
168 let taken = conn.read_tls(&data[off..off + k]);
169 off += taken;
170 let r = conn.process_new_packets();
171 if let Err(e) = r {
172 assert_eq!(conn.process_new_packets().unwrap_err(), e, "errors must stick");
173 assert!(conn.tls_output().len() < 64 * 1024, "output stays bounded");
174 assert!(conn.write_plaintext(b"x").is_err(), "a failed connection refuses writes");
175 return;
176 }
177 if taken == 0 {
178 // buffer full: the application reads plaintext
179 let n = conn.plaintext().len();
180 if n == 0 {
181 return;
182 }
183 conn.consume_plaintext(n);
184 }
185 }
186}
187
188pub fn server_records(rng: &mut Rng, c: &Corpus, iters: usize) {
189 for _ in 0..iters {
190 let seed = &c.to_server[rng.below(c.to_server.len())];
191 let data = mutate(rng, seed, &c.to_client);
192 let mut s = ServerConnection::new(c.scfg.clone());
193 feed(rng, &mut s, &data);
194 }
195}
196
197pub fn client_records(rng: &mut Rng, c: &Corpus, iters: usize) {
198 for _ in 0..iters {
199 let data = mutate(rng, &c.to_client[0], &c.to_server);
200 let mut cl = ClientConnection::new(c.ccfg.clone(), "localhost").unwrap();
201 let n = cl.tls_output().len();
202 cl.consume_tls_output(n);
203 feed(rng, &mut cl, &data);
204 }
205}
206
207/// ClientHello parsing (and everything the server does with it) without the record layer.
208pub fn quic_server_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
209 for _ in 0..iters {
210 let m = mutate(rng, &c.ch_msg, &[]);
211 let mut s = QuicConnection::new_server(c.scfg.clone(), vec![9]);
212 if s.read_handshake(Level::Initial, &m).is_err() {
213 assert!(s.tls_alert().is_some());
214 }
215 let mut out = Vec::new();
216 while s.write_handshake(&mut out).is_some() {}
217 }
218}
219
220/// EncryptedExtensions, Certificate (X.509), CertificateVerify and Finished parsing on the
221/// client: a real ServerHello, then a mutated Handshake-level flight.
222pub fn quic_client_messages(rng: &mut Rng, c: &Corpus, iters: usize) {
223 for _ in 0..iters {
224 let mut qc = QuicConnection::new_client(c.ccfg.clone(), "localhost", vec![1]).unwrap();
225 let mut qs = QuicConnection::new_server(c.scfg.clone(), vec![2]);
226 let mut ch = Vec::new();
227 qc.write_handshake(&mut ch);
228 qs.read_handshake(Level::Initial, &ch).unwrap();
229 let mut sh = Vec::new();
230 qs.write_handshake(&mut sh);
231 let mut hs = Vec::new();
232 qs.write_handshake(&mut hs);
233 qc.read_handshake(Level::Initial, &sh).unwrap();
234 let mut ignore = Vec::new();
235 qc.write_handshake(&mut ignore);
236 let m = mutate(rng, &hs, &[c.cert_der.clone()]);
237 let _ = qc.read_handshake(Level::Handshake, &m);
238 }
239}pub fn is_handshaking(&self) -> bool
Sourcepub fn peer_transport_params(&self) -> Option<&[u8]>
pub fn peer_transport_params(&self) -> Option<&[u8]>
The peer’s transport_parameters extension body.
pub fn alpn_protocol(&self) -> Option<&[u8]>
pub fn negotiated_cipher_suite(&self) -> Option<CipherSuite>
pub fn server_name(&self) -> Option<&str>
pub fn peer_certificates(&self) -> &[Vec<u8>]
pub fn is_resumed(&self) -> bool
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for QuicConnection
impl !UnwindSafe for QuicConnection
impl Forget for QuicConnection
impl Freeze for QuicConnection
impl Move for QuicConnection
impl Send for QuicConnection
impl Sync for QuicConnection
impl Unpin for QuicConnection
impl UnsafeUnpin for QuicConnection
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more