embedded_tls/handshake/
certificate_verify.rs1use crate::TlsError;
2use crate::extensions::extension_data::signature_algorithms::SignatureScheme;
3use crate::parse_buffer::ParseBuffer;
4
5use super::CryptoBuffer;
6
7#[derive(Debug)]
8#[cfg_attr(feature = "defmt", derive(defmt::Format))]
9pub struct CertificateVerifyRef<'a> {
10 pub signature_scheme: SignatureScheme,
11 pub signature: &'a [u8],
12}
13
14impl<'a> CertificateVerifyRef<'a> {
15 pub fn parse(buf: &mut ParseBuffer<'a>) -> Result<CertificateVerifyRef<'a>, TlsError> {
16 let signature_scheme =
17 SignatureScheme::parse(buf).map_err(|_| TlsError::InvalidSignatureScheme)?;
18
19 let len = buf.read_u16().map_err(|_| TlsError::InvalidSignature)?;
20 let signature = buf
21 .slice(len as usize)
22 .map_err(|_| TlsError::InvalidSignature)?;
23
24 Ok(Self {
25 signature_scheme,
26 signature: signature.as_slice(),
27 })
28 }
29}
30
31#[cfg(feature = "rsa")]
39const SIGNATURE_SIZE: usize = 512;
40#[cfg(not(feature = "rsa"))]
41const SIGNATURE_SIZE: usize = 104;
42
43#[derive(Debug)]
44#[cfg_attr(feature = "defmt", derive(defmt::Format))]
45pub struct CertificateVerify {
46 pub(crate) signature_scheme: SignatureScheme,
47 pub(crate) signature: heapless::Vec<u8, SIGNATURE_SIZE>,
48}
49
50impl CertificateVerify {
51 pub(crate) fn encode(&self, buf: &mut CryptoBuffer<'_>) -> Result<(), TlsError> {
52 buf.push_u16(self.signature_scheme.as_u16())?;
53 buf.with_u16_length(|buf| buf.extend_from_slice(self.signature.as_slice()))?;
54 Ok(())
55 }
56}