ytls_record/record/handshake/
server_certificate.rs1use crate::RecordError;
4use ytls_traits::ServerCertificateProcessor;
5use ytls_traits::ServerWrappedRecordProcessor;
6
7#[derive(Debug, PartialEq)]
8pub struct ServerCertificate;
9
10impl ServerCertificate {
11 #[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 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}