ytls_extensions/
signature_algorithms.rs1use crate::TlsExtError;
4use ytls_typed::SignatureAlgorithm;
5
6pub trait ExtSigAlgProcessor {
8 fn signature_algorithm(&mut self, _: SignatureAlgorithm) -> bool;
10}
11
12pub struct TlsExtSigAlg {}
14
15impl TlsExtSigAlg {
16 #[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}