webrtc_dtls/handshake/
handshake_message_certificate_verify.rs

1#[cfg(test)]
2mod handshake_message_certificate_verify_test;
3
4use std::io::{Read, Write};
5
6use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
7
8use super::*;
9use crate::signature_hash_algorithm::*;
10
11#[derive(Clone, Debug, PartialEq, Eq)]
12pub struct HandshakeMessageCertificateVerify {
13    pub(crate) algorithm: SignatureHashAlgorithm,
14    pub(crate) signature: Vec<u8>,
15}
16
17const HANDSHAKE_MESSAGE_CERTIFICATE_VERIFY_MIN_LENGTH: usize = 4;
18
19impl HandshakeMessageCertificateVerify {
20    pub fn handshake_type(&self) -> HandshakeType {
21        HandshakeType::CertificateVerify
22    }
23
24    pub fn size(&self) -> usize {
25        1 + 1 + 2 + self.signature.len()
26    }
27
28    pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
29        writer.write_u8(self.algorithm.hash as u8)?;
30        writer.write_u8(self.algorithm.signature as u8)?;
31        writer.write_u16::<BigEndian>(self.signature.len() as u16)?;
32        writer.write_all(&self.signature)?;
33
34        Ok(writer.flush()?)
35    }
36
37    pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
38        let hash_algorithm = reader.read_u8()?.into();
39        let signature_algorithm = reader.read_u8()?.into();
40        let signature_length = reader.read_u16::<BigEndian>()? as usize;
41        let mut signature = vec![0; signature_length];
42        reader.read_exact(&mut signature)?;
43
44        Ok(HandshakeMessageCertificateVerify {
45            algorithm: SignatureHashAlgorithm {
46                hash: hash_algorithm,
47                signature: signature_algorithm,
48            },
49            signature,
50        })
51    }
52}