webrtc_dtls/extension/
extension_supported_signature_algorithms.rs

1#[cfg(test)]
2mod extension_supported_signature_algorithms_test;
3
4use super::*;
5use crate::signature_hash_algorithm::*;
6
7const EXTENSION_SUPPORTED_SIGNATURE_ALGORITHMS_HEADER_SIZE: usize = 6;
8
9/// ## Specifications
10///
11/// * [RFC 5246 §7.4.1.4.1]
12///
13/// [RFC 5246 §7.4.1.4.1]: https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
14#[derive(Clone, Debug, PartialEq, Eq)]
15pub struct ExtensionSupportedSignatureAlgorithms {
16    pub(crate) signature_hash_algorithms: Vec<SignatureHashAlgorithm>,
17}
18
19impl ExtensionSupportedSignatureAlgorithms {
20    pub fn extension_value(&self) -> ExtensionValue {
21        ExtensionValue::SupportedSignatureAlgorithms
22    }
23
24    pub fn size(&self) -> usize {
25        2 + 2 + self.signature_hash_algorithms.len() * 2
26    }
27
28    pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
29        writer.write_u16::<BigEndian>(2 + 2 * self.signature_hash_algorithms.len() as u16)?;
30        writer.write_u16::<BigEndian>(2 * self.signature_hash_algorithms.len() as u16)?;
31        for v in &self.signature_hash_algorithms {
32            writer.write_u8(v.hash as u8)?;
33            writer.write_u8(v.signature as u8)?;
34        }
35
36        Ok(writer.flush()?)
37    }
38
39    pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
40        let _ = reader.read_u16::<BigEndian>()?;
41
42        let algorithm_count = reader.read_u16::<BigEndian>()? as usize / 2;
43        let mut signature_hash_algorithms = vec![];
44        for _ in 0..algorithm_count {
45            let hash = reader.read_u8()?.into();
46            let signature = reader.read_u8()?.into();
47            signature_hash_algorithms.push(SignatureHashAlgorithm { hash, signature });
48        }
49
50        Ok(ExtensionSupportedSignatureAlgorithms {
51            signature_hash_algorithms,
52        })
53    }
54}