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]); 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 head(&self) -> &[u8] { &self.head }
64}
65