1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::fmt;
4use core::ops::Range;
5use std::sync::MutexGuard;
6
7use super::kernel::KernelConnection;
8use super::receive::JoinOutput;
9use super::{
10 Connection, ConnectionOutputs, DataKind, Encrypter, MessageIter, MessageIterMode, ReceivePath,
11 SendOutput, SendPath, SideData, Tcp, TlsInputBuffer,
12};
13use crate::client::ClientSide;
14use crate::common_state::{ConnectionOutput, Event, OutputEvent, UnborrowedPayload};
15use crate::conn::private::SideOutput;
16use crate::crypto::cipher::OutboundPlain;
17use crate::enums::ProtocolVersion;
18use crate::error::{AlertDescription, ApiMisuse, Error};
19use crate::lock::Mutex;
20use crate::msgs::{AlertLevel, Delocator, Message};
21use crate::suites::ExtractedSecrets;
22use crate::sync::Arc;
23use crate::tls13::key_schedule::KeyScheduleTrafficSend;
24
25#[expect(clippy::exhaustive_structs)]
30#[derive(Debug)]
31pub struct SplitConnection<Side: SideData> {
32 pub send: SendTraffic,
34 pub receive: ReceiveTraffic<Side>,
36 pub outputs: ConnectionOutputs,
38 pub side_outputs: Side,
44}
45
46impl<Side: SideData> SplitConnection<Side> {
47 pub fn dangerous_into_kernel_connection(
68 self,
69 ) -> Result<(ExtractedSecrets, KernelConnection<Side>), Error> {
70 let Self {
71 send,
72 receive,
73 outputs,
74 side_outputs: _,
75 } = self;
76
77 drop(send);
79
80 let ReceiveTraffic {
81 state, recv, send, ..
82 } = receive;
83
84 let send = Arc::into_inner(send)
85 .unwrap()
86 .into_inner()
87 .unwrap();
88
89 if send.pending_send_data() {
92 return Err(ApiMisuse::KernelConnectionWithPendingSendData.into());
93 }
94
95 Connection::<Side, Tcp>::from_parts_into_kernel_connection(send.send, recv, outputs, state)
96 }
97}
98
99impl<Side: SideData> TryFrom<Connection<Side, Tcp>> for SplitConnection<Side> {
100 type Error = Error;
101
102 fn try_from(conn: Connection<Side, Tcp>) -> Result<Self, Error> {
103 if conn.is_handshaking() {
105 return Err(ApiMisuse::SplitDuringHandshake.into());
106 }
107
108 let send = Arc::new(Mutex::new(SendInner {
109 send: conn.common.send,
110 aside_buffer: Vec::new(),
111 }));
112 let state = conn.state?;
113
114 Ok(Self {
115 send: SendTraffic(send.clone()),
116 receive: ReceiveTraffic {
117 state,
118 recv: conn.common.recv,
119 send,
120 pending_flush_sender: false,
121 },
122 outputs: conn.common.outputs,
123 side_outputs: conn.side,
124 })
125 }
126}
127
128pub struct SendTraffic(pub(super) Arc<Mutex<SendInner>>);
132
133impl SendTraffic {
134 pub fn write(
145 &mut self,
146 application_data: OutboundPlain<'_>,
147 tls: &mut Vec<u8>,
148 ) -> Result<(), Error> {
149 let mut inner = self.0.lock().unwrap();
150 inner.pump(tls);
151 inner
152 .send
153 .send_appdata_encrypt(DataKind::Traffic(application_data), tls)
154 .map(|_| ())
155 }
156
157 pub fn close(self, tls: &mut Vec<u8>) -> Result<(), Error> {
164 let mut inner = self.0.lock().unwrap();
165 inner.pump(tls);
166 inner.send.send_close_notify(tls)
167 }
168
169 pub fn refresh_traffic_keys(&mut self, tls: &mut Vec<u8>) -> Result<(), Error> {
194 let mut inner = self.0.lock().unwrap();
195 inner.pump(tls);
196 inner.send.refresh_traffic_keys(tls)
197 }
198}
199
200impl fmt::Debug for SendTraffic {
201 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
202 f.debug_tuple("SendTraffic")
203 .finish_non_exhaustive()
204 }
205}
206
207pub(super) struct SendInner {
208 send: SendPath,
209 aside_buffer: Vec<u8>,
210}
211
212impl SendInner {
213 fn pump(&mut self, tls: &mut Vec<u8>) {
214 tls.extend_from_slice(&self.aside_buffer);
215 self.aside_buffer.clear();
216 }
217
218 fn pending_send_data(&self) -> bool {
219 !self.aside_buffer.is_empty() || self.send.has_queued_key_update()
220 }
221
222 fn send_alert(&mut self, level: AlertLevel, desc: AlertDescription) -> Result<(), Error> {
223 self.send
224 .send_alert(level, desc, &mut self.aside_buffer)
225 }
226
227 fn send_msg(&mut self, m: Message<'_>, must_encrypt: bool) -> Result<(), Error> {
228 self.send
229 .send_msg(m, must_encrypt, &mut self.aside_buffer)
230 }
231}
232
233pub struct ReceiveTraffic<Side: SideData> {
237 pub(crate) state: Side::State,
238 pub(crate) recv: ReceivePath,
239 pub(super) send: Arc<Mutex<SendInner>>,
240 pub(crate) pending_flush_sender: bool,
241}
242
243impl<Side: SideData> ReceiveTraffic<Side> {
244 pub fn read<'a>(
257 self,
258 input: &'a mut impl TlsInputBuffer,
259 ) -> Result<ReceiveTrafficState<'a, Side>, Error> {
260 let Self {
261 state,
262 mut recv,
263 send,
264 mut pending_flush_sender,
265 } = self;
266
267 let mut tls_unused = Vec::new();
268 let mut send_adapter = SendAdapter::Unlocked(&send);
269 let mut state = Ok(state);
270 let output = JoinOutput {
271 outputs: &mut Discard,
272 quic: None,
273 send: &mut send_adapter,
274 side: &mut Discard,
275 };
276
277 let mut iter = MessageIter::<Side, _>::receive(
278 input,
279 &mut tls_unused,
280 &mut state,
281 &mut recv,
282 output,
283 MessageIterMode::All,
284 );
285 let received_plain = match iter.next(false) {
286 Some(Ok(payload)) => Some(payload),
287 Some(Err(error)) => return Err(error),
288 None => None,
289 };
290 debug_assert!(tls_unused.is_empty());
291
292 let state = state.unwrap();
294
295 if let Some(unborrowed) = received_plain {
296 let pending_discard = recv.deframer.take_discard();
297 let UnborrowedPayload::Unborrowed(range) = unborrowed else {
298 return Err(Error::Unreachable("decrypted data should be borrowed"));
299 };
300
301 if let SendAdapter::Locked { send_required, .. } = send_adapter {
302 pending_flush_sender |= send_required;
303 }
304
305 drop(send_adapter);
306 return Ok(ReceiveTrafficState::Available(ReceivedApplicationData {
307 range,
308 input,
309 pending_discard,
310 rt: Self {
311 state,
312 recv,
313 send,
314 pending_flush_sender,
315 },
316 }));
317 }
318
319 input.discard(recv.deframer.take_discard());
320
321 if let SendAdapter::Locked { send_required, .. } = send_adapter {
324 pending_flush_sender |= send_required;
325 }
326
327 drop(send_adapter);
328
329 let mut rt = Self {
330 state,
331 recv,
332 send,
333 pending_flush_sender,
334 };
335
336 if core::mem::take(&mut rt.pending_flush_sender) {
337 return Ok(ReceiveTrafficState::FlushSender(FlushSender { rt }));
338 }
339
340 Ok(match rt.recv.has_received_close_notify {
341 true => ReceiveTrafficState::CloseNotify,
342 false => ReceiveTrafficState::ReadMore(rt),
343 })
344 }
345}
346
347impl ReceiveTraffic<ClientSide> {
348 pub fn tls13_tickets_received(&self) -> u32 {
350 self.recv.tls13_tickets_received
351 }
352}
353
354impl<Side: SideData> fmt::Debug for ReceiveTraffic<Side> {
355 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
356 f.debug_struct("ReceiveTraffic")
357 .finish_non_exhaustive()
358 }
359}
360
361#[expect(clippy::exhaustive_enums)]
402pub enum ReceiveTrafficState<'a, Side: SideData> {
403 ReadMore(ReceiveTraffic<Side>),
407
408 FlushSender(FlushSender<Side>),
410
411 Available(ReceivedApplicationData<'a, Side>),
413
414 CloseNotify,
418}
419
420impl<Side: SideData> fmt::Debug for ReceiveTrafficState<'_, Side> {
421 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
422 match self {
423 Self::ReadMore(_) => f
424 .debug_tuple("ReadMore")
425 .finish_non_exhaustive(),
426 Self::FlushSender(_) => f
427 .debug_tuple("FlushSender")
428 .finish_non_exhaustive(),
429 Self::Available(_) => f
430 .debug_tuple("Available")
431 .finish_non_exhaustive(),
432 Self::CloseNotify => write!(f, "CloseNotify"),
433 }
434 }
435}
436
437pub struct ReceivedApplicationData<'a, Side: SideData> {
439 input: &'a mut dyn TlsInputBuffer,
441
442 range: Range<usize>,
444
445 pending_discard: usize,
451
452 rt: ReceiveTraffic<Side>,
453}
454
455impl<Side: SideData> ReceivedApplicationData<'_, Side> {
456 pub fn data(&mut self) -> &[u8] {
458 Delocator::new(self.input.slice_mut()).slice_from_range(&self.range)
459 }
460
461 pub fn into_next(mut self) -> ReceiveTrafficState<'static, Side> {
468 self.input.discard(self.pending_discard);
469
470 if core::mem::take(&mut self.rt.pending_flush_sender) {
471 return ReceiveTrafficState::FlushSender(FlushSender { rt: self.rt });
472 }
473
474 match self.rt.recv.has_received_close_notify {
475 true => ReceiveTrafficState::CloseNotify,
476 false => ReceiveTrafficState::ReadMore(self.rt),
477 }
478 }
479}
480
481pub struct FlushSender<Side: SideData> {
487 rt: ReceiveTraffic<Side>,
488}
489
490impl<Side: SideData> FlushSender<Side> {
491 pub fn into_next(self) -> ReceiveTrafficState<'static, Side> {
493 match self.rt.recv.has_received_close_notify {
494 true => ReceiveTrafficState::CloseNotify,
495 false => ReceiveTrafficState::ReadMore(self.rt),
496 }
497 }
498}
499
500pub(super) enum SendAdapter<'a> {
511 Unlocked(&'a Mutex<SendInner>),
512 Locked {
513 guard: MutexGuard<'a, SendInner>,
514 send_required: bool,
515 },
516}
517
518impl<'a> SendAdapter<'a> {
519 fn as_locked<'b>(&'b mut self, may_send: bool) -> &'b mut MutexGuard<'a, SendInner> {
520 if let Self::Unlocked(m) = self {
521 *self = Self::Locked {
522 guard: m.lock().unwrap(),
523 send_required: false,
524 };
525 }
526 let Self::Locked {
527 guard,
528 send_required,
529 } = self
530 else {
531 unreachable!();
532 };
533 *send_required |= may_send;
534 guard
535 }
536}
537
538impl SendOutput for SendAdapter<'_> {
539 fn negotiated_version(&mut self, version: ProtocolVersion) {
540 self.as_locked(false)
541 .send
542 .negotiated_version(version);
543 }
544
545 fn queue_requested_key_update(&mut self) -> Result<(), Error> {
546 self.as_locked(true)
549 .send
550 .queue_requested_key_update()
551 }
552
553 fn note_key_update_response(&mut self) {
554 self.as_locked(false)
555 .send
556 .note_key_update_response();
557 }
558
559 fn set_encrypter(&mut self, encrypter: Encrypter) {
560 self.as_locked(false)
561 .send
562 .set_encrypter(encrypter);
563 }
564
565 fn update_key_schedule(&mut self, schedule: Box<KeyScheduleTrafficSend>) {
566 self.as_locked(false)
567 .send
568 .update_key_schedule(schedule);
569 }
570
571 fn send_alert(
572 &mut self,
573 level: AlertLevel,
574 desc: AlertDescription,
575 _wrong_thread_tls: &mut Vec<u8>,
576 ) -> Result<(), Error> {
577 self.as_locked(true)
578 .send_alert(level, desc)
579 }
580
581 fn start_traffic(&mut self) {
582 self.as_locked(false)
583 .send
584 .start_traffic();
585 }
586
587 fn send_msg(
588 &mut self,
589 m: Message<'_>,
590 must_encrypt: bool,
591 _wrong_thread_tls: &mut Vec<u8>,
592 ) -> Result<(), Error> {
593 self.as_locked(true)
594 .send_msg(m, must_encrypt)
595 }
596}
597
598struct Discard;
599
600impl ConnectionOutput for Discard {
601 fn handle(&mut self, _ev: OutputEvent<'_>) {}
602}
603
604impl SideOutput for Discard {
605 fn emit(&mut self, _ev: Event) {}
606}
607
608#[cfg(test)]
609mod tests {
610 use super::*;
611 use crate::crypto::test_provider::Tls13Cipher;
612
613 #[test]
614 fn send_adapter_flag() {
615 let mut tls = Vec::new();
616 assert!(!send_flag_for(
617 |adapter| adapter.negotiated_version(ProtocolVersion::TLSv1_3)
618 ));
619 assert!(send_flag_for(|adapter| adapter
620 .queue_requested_key_update()
621 .unwrap()));
622 assert!(!send_flag_for(|adapter| adapter.note_key_update_response()));
623 assert!(!send_flag_for(|adapter| adapter.set_encrypter(Encrypter {
624 encrypter: Box::new(Tls13Cipher),
625 limit: 1234,
626 })));
627 assert!(send_flag_for(|adapter| adapter
629 .send_alert(
630 AlertLevel::Fatal,
631 AlertDescription::CertificateUnknown,
632 &mut tls,
633 )
634 .unwrap()));
635 assert!(!send_flag_for(|adapter| adapter.start_traffic()));
636 assert!(send_flag_for(|adapter| adapter
637 .send_msg(Message::build_key_update_notify(), false, &mut tls,)
638 .unwrap()));
639 }
640
641 #[test]
642 fn pending_send_data() {
643 let mut send = SendPath::default();
644 send.set_encrypter(Encrypter {
645 encrypter: Box::new(Tls13Cipher),
646 limit: 1234,
647 });
648 send.may_send_application_data = true;
649
650 let mut inner = SendInner {
651 send,
652 aside_buffer: Vec::new(),
653 };
654 assert!(!inner.pending_send_data());
655
656 inner
658 .send_alert(AlertLevel::Fatal, AlertDescription::DecodeError)
659 .unwrap();
660 assert!(inner.pending_send_data());
661
662 let mut tls = Vec::new();
663 inner.pump(&mut tls);
664 assert!(!tls.is_empty());
665 assert!(!inner.pending_send_data());
666
667 assert_eq!(
669 inner
670 .send
671 .queue_requested_key_update()
672 .unwrap_err(),
673 Error::EncryptError
674 );
675 assert!(!inner.pending_send_data());
676
677 tls.clear();
678 assert_eq!(
679 inner
680 .send
681 .send_appdata_encrypt(DataKind::Traffic(b"x".as_slice().into()), &mut tls)
682 .unwrap_err(),
683 Error::ApiMisuse(ApiMisuse::WriteAfterSendPathClosed)
684 );
685 assert!(tls.is_empty());
686 assert!(!inner.pending_send_data());
687 }
688
689 fn send_flag_for(f: impl FnOnce(&mut SendAdapter<'_>)) -> bool {
690 let mut send = SendPath::default();
691 send.set_encrypter(Encrypter {
692 encrypter: Box::new(Tls13Cipher),
693 limit: 1234,
694 });
695
696 let send = Mutex::new(SendInner {
697 send,
698 aside_buffer: Vec::new(),
699 });
700
701 let mut adapter = SendAdapter::Unlocked(&send);
702 f(&mut adapter);
703 let SendAdapter::Locked { send_required, .. } = adapter else {
704 panic!("expected to find SendAdapter::Locked");
705 };
706 send_required
707 }
708}