Skip to main content

QuicConnection

Struct QuicConnection 

Source
pub struct QuicConnection { /* private fields */ }
Expand description

A TLS 1.3 handshake for a QUIC connection.

Implementations§

Source§

impl QuicConnection

Source

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}
Source

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}
Source

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.

Source

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}
Source

pub fn write_level(&self) -> Level

The level of the bytes the next write_handshake appends.

Source

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}
Source

pub fn is_handshaking(&self) -> bool

Source

pub fn peer_transport_params(&self) -> Option<&[u8]>

The peer’s transport_parameters extension body.

Source

pub fn alpn_protocol(&self) -> Option<&[u8]>

Source

pub fn negotiated_cipher_suite(&self) -> Option<CipherSuite>

Source

pub fn server_name(&self) -> Option<&str>

Source

pub fn peer_certificates(&self) -> &[Vec<u8>]

Source

pub fn is_resumed(&self) -> bool

Source

pub fn tls_alert(&self) -> Option<u64>

The QUIC CRYPTO_ERROR code (0x100 + TLS alert) after a handshake failure.

Examples found in repository?
examples/../tests/fuzzing/mod.rs (line 213)
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}

Trait Implementations§

Source§

impl Debug for QuicConnection

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.