embedded_tls/handshake/
certificate_verify.rs

1use 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// Calculations for max. signature sizes:
32// ecdsaSHA256 -> 6 bytes (ASN.1 structure) + 32-33 bytes (r) + 32-33 bytes (s) = 70..72 bytes
33// ecdsaSHA384 -> 6 bytes (ASN.1 structure) + 48-49 bytes (r) + 48-49 bytes (s) = 102..104 bytes
34// Ed25519 -> 6 bytes (ASN.1 structure) + 32-33 bytes (r) + 32-33 bytes (s) = 70..72 bytes
35// RSA2048 -> 256 bytes
36// RSA3072 -> 384 bytee
37// RSA4096 -> 512 bytes
38#[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}