webrtc_dtls/extension/
extension_supported_signature_algorithms.rs1#[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#[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}