ytls_record/record/handshake/
server_certificate.rs

1//! Server Certificate Handshake record
2
3use crate::RecordError;
4use ytls_traits::ServerCertificateProcessor;
5use ytls_traits::ServerWrappedRecordProcessor;
6
7#[derive(Debug, PartialEq)]
8pub struct ServerCertificate;
9
10impl ServerCertificate {
11    /// Parse wrapped Server Certificate
12    #[inline]
13    pub fn parse_wrapped<P: ServerWrappedRecordProcessor>(
14        prc: &mut P,
15        mut raw: &[u8],
16    ) -> Result<(), RecordError> {
17        let sh = prc.server_certificate();
18
19        // annoying u24
20        let cl_bytes = raw.split_off(..3).ok_or(RecordError::Size)?;
21        let cert_len_u32 = u32::from_be_bytes([0, cl_bytes[0], cl_bytes[1], cl_bytes[2]]);
22
23        if cert_len_u32 as usize != raw.len() {
24            return Err(RecordError::Size);
25        }
26
27        loop {
28            let cl_bytes = raw.split_off(..3).ok_or(RecordError::Size)?;
29            let cert_len_u32 = u32::from_be_bytes([0, cl_bytes[0], cl_bytes[1], cl_bytes[2]]);
30            let cert_data = raw
31                .split_off(..cert_len_u32 as usize)
32                .ok_or(RecordError::Size)?;
33
34            let el_bytes = raw.split_off(..2).ok_or(RecordError::Size)?;
35            let ext_len_u16 = u16::from_be_bytes([el_bytes[0], el_bytes[1]]);
36
37            let ext_data = raw
38                .split_off(..ext_len_u16 as usize)
39                .ok_or(RecordError::Size)?;
40
41            sh.handle_server_certificate(cert_data, ext_data);
42
43            if raw.len() == 0 {
44                break;
45            }
46        }
47
48        Ok(())
49    }
50}