1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::fmt;
4use core::ops::Range;
5use std::sync::MutexGuard;
6
7use super::receive::{Discard, JoinOutput};
8use crate::client::ClientSide;
9use crate::common_state::UnborrowedPayload;
10use crate::conn::kernel::KernelConnection;
11use crate::conn::{
12 ConnectionCommon, MessageIter, MessageIterMode, ReceivePath, SendOutput, SendPath,
13 TlsInputBuffer,
14};
15use crate::crypto::cipher::{OutboundPlain, RecordEncrypter};
16use crate::enums::ProtocolVersion;
17use crate::error::{AlertDescription, ApiMisuse};
18use crate::lock::Mutex;
19use crate::msgs::{AlertLevel, Delocator, Message};
20use crate::sync::Arc;
21use crate::tls13::key_schedule::KeyScheduleTrafficSend;
22use crate::{ConnectionOutputs, Error, ExtractedSecrets, SideData};
23
24#[expect(clippy::exhaustive_structs)]
29#[derive(Debug)]
30pub struct SplitConnection<Side: SideData> {
31 pub send: SendTraffic,
33 pub receive: ReceiveTraffic<Side>,
35 pub outputs: ConnectionOutputs,
37}
38
39impl<Side: SideData> SplitConnection<Side> {
40 pub fn dangerous_into_kernel_connection(
61 self,
62 ) -> Result<(ExtractedSecrets, KernelConnection<Side>), Error> {
63 let Self {
64 send,
65 receive,
66 outputs,
67 } = self;
68
69 drop(send);
71
72 let ReceiveTraffic {
73 state, recv, send, ..
74 } = receive;
75
76 let mut send = send.lock().unwrap();
77
78 if send.pending_send_data() {
81 return Err(ApiMisuse::KernelConnectionWithPendingSendData.into());
82 }
83
84 ConnectionCommon::<Side>::from_parts_into_kernel_connection(
85 &mut send.send,
86 recv,
87 outputs,
88 state,
89 )
90 }
91}
92
93impl<Side: SideData> TryFrom<ConnectionCommon<Side>> for SplitConnection<Side> {
94 type Error = Error;
95
96 fn try_from(conn: ConnectionCommon<Side>) -> Result<Self, Error> {
97 let send = Arc::new(Mutex::new(SendInner {
98 send: conn.common.send,
99 aside_buffer: Vec::new(),
100 }));
101 let state = conn.state?;
102
103 Ok(Self {
104 send: SendTraffic(send.clone()),
105 receive: ReceiveTraffic {
106 state,
107 recv: conn.common.recv,
108 send,
109 pending_flush_sender: false,
110 },
111 outputs: conn.common.outputs,
112 })
113 }
114}
115
116pub struct SendTraffic(pub(super) Arc<Mutex<SendInner>>);
120
121impl SendTraffic {
122 pub fn write(&mut self, application_data: OutboundPlain<'_>, tls: &mut Vec<u8>) {
130 let mut inner = self.0.lock().unwrap();
131 inner.pump(tls);
132 inner
133 .send
134 .send_appdata_encrypt(application_data, tls);
135 }
136
137 pub fn close(self, tls: &mut Vec<u8>) {
144 let mut inner = self.0.lock().unwrap();
145 inner.pump(tls);
146 inner.send.send_close_notify(tls);
147 drop(inner);
148 }
149
150 pub fn refresh_traffic_keys(&mut self, tls: &mut Vec<u8>) -> Result<(), Error> {
175 let mut inner = self.0.lock().unwrap();
176 inner.pump(tls);
177 inner.send.refresh_traffic_keys(tls)
178 }
179}
180
181impl fmt::Debug for SendTraffic {
182 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
183 f.debug_tuple("SendTraffic")
184 .finish_non_exhaustive()
185 }
186}
187
188pub(super) struct SendInner {
189 send: SendPath,
190 aside_buffer: Vec<u8>,
191}
192
193impl SendInner {
194 fn pump(&mut self, tls: &mut Vec<u8>) {
195 tls.extend_from_slice(&self.aside_buffer);
196 self.aside_buffer.clear();
197 }
198
199 fn pending_send_data(&self) -> bool {
200 !self.aside_buffer.is_empty() || self.send.has_queued_key_update()
201 }
202
203 fn send_alert(&mut self, level: AlertLevel, desc: AlertDescription) {
204 self.send
205 .send_alert(level, desc, &mut self.aside_buffer);
206 }
207
208 fn send_msg(&mut self, m: Message<'_>, must_encrypt: bool) {
209 self.send
210 .send_msg(m, must_encrypt, &mut self.aside_buffer);
211 }
212}
213
214pub struct ReceiveTraffic<Side: SideData> {
218 pub(crate) state: Side::State,
219 pub(crate) recv: ReceivePath,
220 pub(super) send: Arc<Mutex<SendInner>>,
221 pub(crate) pending_flush_sender: bool,
222}
223
224impl<Side: SideData> ReceiveTraffic<Side> {
225 pub fn read<'a>(
238 self,
239 input: &'a mut impl TlsInputBuffer,
240 ) -> Result<ReceiveTrafficState<'a, Side>, Error> {
241 let Self {
242 state,
243 mut recv,
244 send,
245 mut pending_flush_sender,
246 } = self;
247
248 let mut tls_unused = Vec::new();
249 let mut send_adapter = SendAdapter::Unlocked(&send);
250 let mut state = Ok(state);
251 let output = JoinOutput {
252 outputs: &mut Discard,
253 quic: None,
254 send: &mut send_adapter,
255 side: &mut Discard,
256 };
257
258 let mut iter = MessageIter::<Side, _>::receive(
259 input,
260 &mut tls_unused,
261 &mut state,
262 &mut recv,
263 output,
264 MessageIterMode::All,
265 );
266 let received_plain = match iter.next(false) {
267 Some(Ok(payload)) => Some(payload),
268 Some(Err(error)) => return Err(error),
269 None => None,
270 };
271 debug_assert!(tls_unused.is_empty());
272
273 let state = state.unwrap();
275
276 if let Some(unborrowed) = received_plain {
277 let pending_discard = recv.deframer.take_discard();
278 let UnborrowedPayload::Unborrowed(range) = unborrowed else {
279 return Err(Error::Unreachable("decrypted data should be borrowed"));
280 };
281
282 if let SendAdapter::Locked { send_required, .. } = send_adapter {
283 pending_flush_sender |= send_required;
284 }
285
286 drop(send_adapter);
287 return Ok(ReceiveTrafficState::Available(ReceivedApplicationData {
288 range,
289 input,
290 pending_discard,
291 rt: Self {
292 state,
293 recv,
294 send,
295 pending_flush_sender,
296 },
297 }));
298 }
299
300 input.discard(recv.deframer.take_discard());
301
302 if let SendAdapter::Locked { send_required, .. } = send_adapter {
305 pending_flush_sender |= send_required;
306 }
307
308 drop(send_adapter);
309
310 let mut rt = Self {
311 state,
312 recv,
313 send,
314 pending_flush_sender,
315 };
316
317 if core::mem::take(&mut rt.pending_flush_sender) {
318 return Ok(ReceiveTrafficState::FlushSender(FlushSender { rt }));
319 }
320
321 Ok(match rt.recv.has_received_close_notify {
322 true => ReceiveTrafficState::CloseNotify,
323 false => ReceiveTrafficState::ReadMore(rt),
324 })
325 }
326}
327
328impl ReceiveTraffic<ClientSide> {
329 pub fn tls13_tickets_received(&self) -> u32 {
331 self.recv.tls13_tickets_received
332 }
333}
334
335impl<Side: SideData> fmt::Debug for ReceiveTraffic<Side> {
336 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
337 f.debug_struct("ReceiveTraffic")
338 .finish_non_exhaustive()
339 }
340}
341
342#[expect(clippy::exhaustive_enums)]
383pub enum ReceiveTrafficState<'a, Side: SideData> {
384 ReadMore(ReceiveTraffic<Side>),
388
389 FlushSender(FlushSender<Side>),
391
392 Available(ReceivedApplicationData<'a, Side>),
394
395 CloseNotify,
399}
400
401impl<Side: SideData> fmt::Debug for ReceiveTrafficState<'_, Side> {
402 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
403 match self {
404 Self::ReadMore(_) => f
405 .debug_tuple("ReadMore")
406 .finish_non_exhaustive(),
407 Self::FlushSender(_) => f
408 .debug_tuple("FlushSender")
409 .finish_non_exhaustive(),
410 Self::Available(_) => f
411 .debug_tuple("Available")
412 .finish_non_exhaustive(),
413 Self::CloseNotify => write!(f, "CloseNotify"),
414 }
415 }
416}
417
418pub struct ReceivedApplicationData<'a, Side: SideData> {
420 input: &'a mut dyn TlsInputBuffer,
422
423 range: Range<usize>,
425
426 pending_discard: usize,
432
433 rt: ReceiveTraffic<Side>,
434}
435
436impl<Side: SideData> ReceivedApplicationData<'_, Side> {
437 pub fn data(&mut self) -> &[u8] {
439 Delocator::new(self.input.slice_mut()).slice_from_range(&self.range)
440 }
441
442 pub fn into_next(mut self) -> ReceiveTrafficState<'static, Side> {
449 self.input.discard(self.pending_discard);
450
451 if core::mem::take(&mut self.rt.pending_flush_sender) {
452 return ReceiveTrafficState::FlushSender(FlushSender { rt: self.rt });
453 }
454
455 match self.rt.recv.has_received_close_notify {
456 true => ReceiveTrafficState::CloseNotify,
457 false => ReceiveTrafficState::ReadMore(self.rt),
458 }
459 }
460}
461
462pub struct FlushSender<Side: SideData> {
468 rt: ReceiveTraffic<Side>,
469}
470
471impl<Side: SideData> FlushSender<Side> {
472 pub fn into_next(self) -> ReceiveTrafficState<'static, Side> {
474 match self.rt.recv.has_received_close_notify {
475 true => ReceiveTrafficState::CloseNotify,
476 false => ReceiveTrafficState::ReadMore(self.rt),
477 }
478 }
479}
480
481pub(super) enum SendAdapter<'a> {
492 Unlocked(&'a Mutex<SendInner>),
493 Locked {
494 guard: MutexGuard<'a, SendInner>,
495 send_required: bool,
496 },
497}
498
499impl<'a> SendAdapter<'a> {
500 fn as_locked<'b>(&'b mut self, may_send: bool) -> &'b mut MutexGuard<'a, SendInner> {
501 if let Self::Unlocked(m) = self {
502 *self = Self::Locked {
503 guard: m.lock().unwrap(),
504 send_required: false,
505 };
506 }
507 let Self::Locked {
508 guard,
509 send_required,
510 } = self
511 else {
512 unreachable!();
513 };
514 *send_required |= may_send;
515 guard
516 }
517}
518
519impl SendOutput for SendAdapter<'_> {
520 fn negotiated_version(&mut self, version: ProtocolVersion) {
521 self.as_locked(false)
522 .send
523 .negotiated_version(version);
524 }
525
526 fn queue_requested_key_update(&mut self) {
527 self.as_locked(true)
530 .send
531 .queue_requested_key_update();
532 }
533
534 fn note_key_update_response(&mut self) {
535 self.as_locked(false)
536 .send
537 .note_key_update_response();
538 }
539
540 fn set_encrypter(&mut self, cipher: Box<dyn RecordEncrypter>, max_records: u64) {
541 self.as_locked(false)
542 .send
543 .set_encrypter(cipher, max_records);
544 }
545
546 fn update_key_schedule(&mut self, schedule: Box<KeyScheduleTrafficSend>) {
547 self.as_locked(false)
548 .send
549 .update_key_schedule(schedule);
550 }
551
552 fn send_alert(
553 &mut self,
554 level: AlertLevel,
555 desc: AlertDescription,
556 _wrong_thread_tls: &mut Vec<u8>,
557 ) {
558 self.as_locked(true)
559 .send_alert(level, desc);
560 }
561
562 fn start_traffic(&mut self) {
563 self.as_locked(false)
564 .send
565 .start_traffic();
566 }
567
568 fn send_msg(&mut self, m: Message<'_>, must_encrypt: bool, _wrong_thread_tls: &mut Vec<u8>) {
569 self.as_locked(true)
570 .send_msg(m, must_encrypt)
571 }
572}
573
574#[cfg(test)]
575mod tests {
576 use super::*;
577 use crate::crypto::test_provider::Tls13Cipher;
578
579 #[test]
580 fn send_adapter_flag() {
581 let mut tls = Vec::new();
582 assert!(!send_flag_for(
583 |adapter| adapter.negotiated_version(ProtocolVersion::TLSv1_3)
584 ));
585 assert!(send_flag_for(|adapter| adapter.queue_requested_key_update()));
586 assert!(!send_flag_for(|adapter| adapter.note_key_update_response()));
587 assert!(!send_flag_for(
588 |adapter| adapter.set_encrypter(Box::new(Tls13Cipher), 1234)
589 ));
590 assert!(send_flag_for(|adapter| adapter.send_alert(
592 AlertLevel::Fatal,
593 AlertDescription::CertificateUnknown,
594 &mut tls,
595 )));
596 assert!(!send_flag_for(|adapter| adapter.start_traffic()));
597 assert!(send_flag_for(|adapter| adapter.send_msg(
598 Message::build_key_update_notify(),
599 false,
600 &mut tls,
601 )));
602 }
603
604 #[test]
605 fn pending_send_data() {
606 let mut send = SendPath::default();
607 send.set_encrypter(Box::new(Tls13Cipher), 1234);
608
609 let mut inner = SendInner {
610 send,
611 aside_buffer: Vec::new(),
612 };
613 assert!(!inner.pending_send_data());
614
615 inner.send_alert(AlertLevel::Fatal, AlertDescription::DecodeError);
617 assert!(inner.pending_send_data());
618
619 let mut tls = Vec::new();
620 inner.pump(&mut tls);
621 assert!(!tls.is_empty());
622 assert!(!inner.pending_send_data());
623
624 inner.send.queue_requested_key_update();
626 assert!(inner.pending_send_data());
627
628 tls.clear();
629 inner
630 .send
631 .send_appdata_encrypt(b"x".as_slice().into(), &mut tls);
632 assert!(!inner.pending_send_data());
633 }
634
635 fn send_flag_for(f: impl FnOnce(&mut SendAdapter<'_>)) -> bool {
636 let mut send = SendPath::default();
637 send.set_encrypter(Box::new(Tls13Cipher), 1234);
638
639 let send = Mutex::new(SendInner {
640 send,
641 aside_buffer: Vec::new(),
642 });
643
644 let mut adapter = SendAdapter::Unlocked(&send);
645 f(&mut adapter);
646 let SendAdapter::Locked { send_required, .. } = adapter else {
647 panic!("expected to find SendAdapter::Locked");
648 };
649 send_required
650 }
651}