webrtc_dtls/handshake/
handshake_message_certificate_verify.rs1#[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}