s2n_quic_core/crypto/
payload.rs1use crate::packet::number::PacketNumberLen;
5use s2n_codec::{CheckedRange, DecoderBuffer, DecoderBufferMut, DecoderError};
6
7#[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
13pub struct ProtectedPayload<'a> {
14 pub(crate) header_len: usize,
15 pub(crate) buffer: DecoderBufferMut<'a>,
16}
17
18impl core::fmt::Debug for ProtectedPayload<'_> {
19 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
20 let print_buffer_content = f.alternate();
26
27 let mut debug_struct = f.debug_struct("ProtectedPayload");
28 let mut debug_struct = debug_struct.field("header_len", &self.header_len);
29
30 if !print_buffer_content {
31 debug_struct = debug_struct.field("buffer_len", &(self.buffer.len() - self.header_len))
32 } else {
33 debug_struct = debug_struct.field("buffer", &self.buffer)
34 }
35 debug_struct.finish()
36 }
37}
38
39impl<'a> ProtectedPayload<'a> {
40 pub fn new(header_len: usize, buffer: &'a mut [u8]) -> Self {
42 debug_assert!(buffer.len() >= header_len, "header_len is too large");
43
44 Self {
45 header_len,
46 buffer: DecoderBufferMut::new(buffer),
47 }
48 }
49
50 pub fn get_checked_range(&self, range: &CheckedRange) -> DecoderBuffer<'_> {
52 self.buffer.get_checked_range(range)
53 }
54
55 pub(crate) fn header_protection_sample(
56 &self,
57 sample_len: usize,
58 ) -> Result<&[u8], DecoderError> {
59 header_protection_sample(self.buffer.peek(), self.header_len, sample_len)
60 }
61
62 pub fn len(&self) -> usize {
64 self.buffer.len()
65 }
66
67 pub fn is_empty(&self) -> bool {
69 self.buffer.is_empty()
70 }
71}
72
73#[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
75pub struct EncryptedPayload<'a> {
76 pub(crate) header_len: usize,
77 pub(crate) packet_number_len: PacketNumberLen,
78 pub(crate) buffer: DecoderBufferMut<'a>,
79}
80
81impl core::fmt::Debug for EncryptedPayload<'_> {
82 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
83 let print_buffer_content = f.alternate();
89
90 let mut debug_struct = f.debug_struct("EncryptedPayload");
91 let mut debug_struct = debug_struct
92 .field("header_len", &self.header_len)
93 .field("packet_number_len", &self.packet_number_len);
94
95 if !print_buffer_content {
96 debug_struct = debug_struct.field("buffer_len", &(self.buffer.len() - self.header_len))
97 } else {
98 debug_struct = debug_struct.field("buffer", &self.buffer)
99 }
100 debug_struct.finish()
101 }
102}
103
104impl<'a> EncryptedPayload<'a> {
105 pub(crate) fn new(
106 header_len: usize,
107 packet_number_len: PacketNumberLen,
108 buffer: &'a mut [u8],
109 ) -> Self {
110 debug_assert!(
111 buffer.len() >= header_len + packet_number_len.bytesize(),
112 "header_len is too large"
113 );
114
115 Self {
116 header_len,
117 packet_number_len,
118 buffer: DecoderBufferMut::new(buffer),
119 }
120 }
121
122 pub fn get_tag(&self) -> u8 {
124 self.buffer.as_less_safe_slice()[0]
125 }
126
127 pub fn get_checked_range(&self, range: &CheckedRange) -> DecoderBuffer<'_> {
129 self.buffer.get_checked_range(range)
130 }
131
132 pub(crate) fn split_mut(self) -> (&'a mut [u8], &'a mut [u8]) {
133 let (header, payload) = self
134 .buffer
135 .decode_slice(self.header_len + self.packet_number_len.bytesize())
136 .expect("header_len already checked");
137 (
138 header.into_less_safe_slice(),
139 payload.into_less_safe_slice(),
140 )
141 }
142
143 pub(crate) fn header_protection_sample(
144 &self,
145 sample_len: usize,
146 ) -> Result<&[u8], DecoderError> {
147 header_protection_sample(self.buffer.peek(), self.header_len, sample_len)
148 }
149}
150
151fn header_protection_sample(
152 buffer: DecoderBuffer<'_>,
153 header_len: usize,
154 sample_len: usize,
155) -> Result<&[u8], DecoderError> {
156 let buffer = buffer.skip(header_len)?;
157
158 let buffer = buffer.skip(PacketNumberLen::MAX_LEN)?;
162
163 let (sample, _) = buffer.decode_slice(sample_len)?;
167
168 Ok(sample.into_less_safe_slice())
169}