embedded_tls/handshake/
certificate_request.rs

1use crate::extensions::messages::CertificateRequestExtension;
2use crate::parse_buffer::ParseBuffer;
3use crate::TlsError;
4use heapless::Vec;
5
6#[derive(Debug)]
7#[cfg_attr(feature = "defmt", derive(defmt::Format))]
8pub struct CertificateRequestRef<'a> {
9    pub(crate) request_context: &'a [u8],
10}
11
12impl<'a> CertificateRequestRef<'a> {
13    pub fn parse(buf: &mut ParseBuffer<'a>) -> Result<CertificateRequestRef<'a>, TlsError> {
14        let request_context_len = buf
15            .read_u8()
16            .map_err(|_| TlsError::InvalidCertificateRequest)?;
17        let request_context = buf
18            .slice(request_context_len as usize)
19            .map_err(|_| TlsError::InvalidCertificateRequest)?;
20
21        // Validate extensions
22        CertificateRequestExtension::parse_vector::<6>(buf)?;
23
24        Ok(Self {
25            request_context: request_context.as_slice(),
26        })
27    }
28}
29
30#[derive(Debug)]
31#[cfg_attr(feature = "defmt", derive(defmt::Format))]
32pub struct CertificateRequest {
33    pub(crate) request_context: Vec<u8, 256>,
34}
35
36impl<'a> TryFrom<CertificateRequestRef<'a>> for CertificateRequest {
37    type Error = TlsError;
38    fn try_from(cert: CertificateRequestRef<'a>) -> Result<Self, Self::Error> {
39        let mut request_context = Vec::new();
40        request_context
41            .extend_from_slice(cert.request_context)
42            .map_err(|_| {
43                error!("CertificateRequest: InsufficientSpace");
44                TlsError::InsufficientSpace
45            })?;
46        Ok(Self { request_context })
47    }
48}