ytls_extensions/
signature_algorithms.rs

1//! yTLS Extension (13) Signature Algorithms
2
3use crate::TlsExtError;
4use ytls_typed::SignatureAlgorithm;
5
6/// Downstream Group Processor
7pub trait ExtSigAlgProcessor {
8    /// Indicate support for the given Signature Algorithm.
9    fn signature_algorithm(&mut self, _: SignatureAlgorithm) -> bool;
10}
11
12/// TLS Extension 10 (EC) Group handling
13pub struct TlsExtSigAlg {}
14
15impl TlsExtSigAlg {
16    /// Parse all the signature algorithms from the Client Hello extension data
17    #[inline]
18    pub fn client_signature_algorithm_cb<P: ExtSigAlgProcessor>(
19        p: &mut P,
20        sig_alg_raw: &[u8],
21    ) -> Result<(), TlsExtError> {
22        if sig_alg_raw.len() < 2 {
23            return Err(TlsExtError::InvalidLength);
24        }
25        let sig_algs_len = u16::from_be_bytes([sig_alg_raw[0], sig_alg_raw[1]]);
26
27        if sig_algs_len == 0 {
28            return Err(TlsExtError::NoData);
29        }
30
31        let remaining = &sig_alg_raw[2..];
32        let expected_len = remaining.len();
33
34        if sig_algs_len as usize != expected_len {
35            return Err(TlsExtError::InvalidLength);
36        }
37
38        let mut sig_algs_i = remaining.chunks(2);
39
40        while let Some(sig_alg) = sig_algs_i.next() {
41            let sig_alg_id = u16::from_be_bytes([sig_alg[0], sig_alg[1]]);
42            p.signature_algorithm(sig_alg_id.into());
43        }
44        Ok(())
45    }
46}