Skip to main content

reqtls/buffer/
decode.rs

1use crate::error::RlsResult;
2use crate::extend::Aead;
3
4pub struct PayloadDecodeBuffer<'a> {
5    origin: &'a [u8],
6    decoded: &'a mut [u8],
7}
8
9
10pub struct RecordDecodeBuffer<'a> {
11    aead: &'a Aead,
12    head: &'a [u8],
13    payload: PayloadDecodeBuffer<'a>,
14}
15
16impl<'a> RecordDecodeBuffer<'a> {
17    pub fn from_buffer(origin: &'a [u8], decoded: &'a mut [u8], aead: &'a Aead) -> RlsResult<Self> {
18        let (head, origin) = origin.split_at(5);
19        Ok(RecordDecodeBuffer {
20            aead,
21            head,
22            payload: PayloadDecodeBuffer { origin, decoded },
23        })
24    }
25
26    pub fn aad(&self, seq: u64) -> RlsResult<[u8; 13]> {
27        let mut res = [0; 13];
28        res[0..8].copy_from_slice(seq.to_be_bytes().as_ref());
29        res[8] = self.head[0];
30        res[9..11].copy_from_slice(&self.head[1..3]); // TLS1.2
31        let payload_len = self.payload.origin.len() as u16 - self.aead.explicit_len() as u16 - 16;
32        res[11..13].copy_from_slice(&payload_len.to_be_bytes());
33        Ok(res)
34    }
35
36    pub fn encrypted_payload(&self) -> &[u8] {
37        match self.aead {
38            Aead::AES_128_GCM | Aead::AES_256_GCM => &self.payload.origin[8..],
39            Aead::ChaCha20_POLY1305 => self.payload.origin,
40            Aead::AES_128_CBC_SHA | Aead::AES_256_CBC_SHA => &self.payload.origin[16..],
41            _ => self.payload.origin
42        }
43    }
44
45    pub fn explicit_iv(&self) -> &[u8] {
46        match self.aead {
47            Aead::AES_128_GCM | Aead::AES_256_GCM => &self.payload.origin[..8],
48            Aead::AES_128_CBC_SHA | Aead::AES_256_CBC_SHA => &self.payload.origin[..16],
49            _ => &self.payload.origin[..0]
50        }
51    }
52
53    pub fn aead(&self) -> &Aead { &self.aead }
54
55    pub fn decrypted_buffer(&mut self) -> &mut [u8] {
56        self.payload.decoded
57    }
58
59    // pub fn origin_payload(&self) -> &[u8] {
60    //     self.payload.origin
61    // }
62
63    pub fn head(&self) -> &[u8] { &self.head }
64}
65