rtc_dtls/handshake/
handshake_message_hello_verify_request.rs1#[cfg(test)]
2mod handshake_message_hello_verify_request_test;
3
4use super::*;
5use crate::record_layer::record_layer_header::*;
6
7use byteorder::{ReadBytesExt, WriteBytesExt};
8use std::io::{Read, Write};
9
10#[derive(Clone, Debug, PartialEq, Eq)]
31pub struct HandshakeMessageHelloVerifyRequest {
32 pub(crate) version: ProtocolVersion,
33 pub(crate) cookie: Vec<u8>,
34}
35
36impl HandshakeMessageHelloVerifyRequest {
37 pub fn handshake_type(&self) -> HandshakeType {
39 HandshakeType::HelloVerifyRequest
40 }
41
42 pub fn size(&self) -> usize {
44 1 + 1 + 1 + self.cookie.len()
45 }
46
47 pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
53 if self.cookie.len() > 255 {
54 return Err(Error::ErrCookieTooLong);
55 }
56
57 writer.write_u8(self.version.major)?;
58 writer.write_u8(self.version.minor)?;
59 writer.write_u8(self.cookie.len() as u8)?;
60 writer.write_all(&self.cookie)?;
61
62 Ok(writer.flush()?)
63 }
64
65 pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
71 let major = reader.read_u8()?;
72 let minor = reader.read_u8()?;
73 let cookie_length = reader.read_u8()?;
74 let mut cookie = vec![];
75 reader.read_to_end(&mut cookie)?;
76
77 if cookie.len() < cookie_length as usize {
78 return Err(Error::ErrBufferTooSmall);
79 }
80
81 Ok(HandshakeMessageHelloVerifyRequest {
82 version: ProtocolVersion { major, minor },
83 cookie,
84 })
85 }
86}