embedded_tls/handshake/
certificate_request.rs1use 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 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}