1pub mod handshake_cache;
16pub mod handshake_header;
18pub mod handshake_message_certificate;
20pub mod handshake_message_certificate_request;
22pub mod handshake_message_certificate_verify;
24pub mod handshake_message_client_hello;
26pub mod handshake_message_client_key_exchange;
28pub mod handshake_message_finished;
30pub mod handshake_message_hello_verify_request;
32pub mod handshake_message_server_hello;
34pub mod handshake_message_server_hello_done;
36pub mod handshake_message_server_key_exchange;
38pub mod handshake_random;
40
41#[cfg(test)]
42mod handshake_test;
43
44use std::fmt;
45use std::io::{Read, Write};
46
47use super::content::*;
48use shared::error::*;
49
50use handshake_header::*;
51use handshake_message_certificate::*;
52use handshake_message_certificate_request::*;
53use handshake_message_certificate_verify::*;
54use handshake_message_client_hello::*;
55use handshake_message_client_key_exchange::*;
56use handshake_message_finished::*;
57use handshake_message_hello_verify_request::*;
58use handshake_message_server_hello::*;
59use handshake_message_server_hello_done::*;
60use handshake_message_server_key_exchange::*;
61
62#[derive(Default, Copy, Clone, Debug, PartialEq, Eq, Hash)]
68pub enum HandshakeType {
69 HelloRequest = 0,
71 ClientHello = 1,
73 ServerHello = 2,
75 HelloVerifyRequest = 3,
77 Certificate = 11,
79 ServerKeyExchange = 12,
81 CertificateRequest = 13,
83 ServerHelloDone = 14,
85 CertificateVerify = 15,
87 ClientKeyExchange = 16,
89 Finished = 20,
91 #[default]
92 Invalid,
94}
95
96impl fmt::Display for HandshakeType {
97 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98 match *self {
99 HandshakeType::HelloRequest => write!(f, "HelloRequest"),
100 HandshakeType::ClientHello => write!(f, "ClientHello"),
101 HandshakeType::ServerHello => write!(f, "ServerHello"),
102 HandshakeType::HelloVerifyRequest => write!(f, "HelloVerifyRequest"),
103 HandshakeType::Certificate => write!(f, "Certificate"),
104 HandshakeType::ServerKeyExchange => write!(f, "ServerKeyExchange"),
105 HandshakeType::CertificateRequest => write!(f, "CertificateRequest"),
106 HandshakeType::ServerHelloDone => write!(f, "ServerHelloDone"),
107 HandshakeType::CertificateVerify => write!(f, "CertificateVerify"),
108 HandshakeType::ClientKeyExchange => write!(f, "ClientKeyExchange"),
109 HandshakeType::Finished => write!(f, "Finished"),
110 HandshakeType::Invalid => write!(f, "Invalid"),
111 }
112 }
113}
114
115impl From<u8> for HandshakeType {
116 fn from(val: u8) -> Self {
117 match val {
118 0 => HandshakeType::HelloRequest,
119 1 => HandshakeType::ClientHello,
120 2 => HandshakeType::ServerHello,
121 3 => HandshakeType::HelloVerifyRequest,
122 11 => HandshakeType::Certificate,
123 12 => HandshakeType::ServerKeyExchange,
124 13 => HandshakeType::CertificateRequest,
125 14 => HandshakeType::ServerHelloDone,
126 15 => HandshakeType::CertificateVerify,
127 16 => HandshakeType::ClientKeyExchange,
128 20 => HandshakeType::Finished,
129 _ => HandshakeType::Invalid,
130 }
131 }
132}
133
134#[derive(PartialEq, Debug, Clone)]
135pub enum HandshakeMessage {
137 ClientHello(HandshakeMessageClientHello),
140 ServerHello(HandshakeMessageServerHello),
142 HelloVerifyRequest(HandshakeMessageHelloVerifyRequest),
144 Certificate(HandshakeMessageCertificate),
146 ServerKeyExchange(HandshakeMessageServerKeyExchange),
148 CertificateRequest(HandshakeMessageCertificateRequest),
150 ServerHelloDone(HandshakeMessageServerHelloDone),
152 CertificateVerify(HandshakeMessageCertificateVerify),
154 ClientKeyExchange(HandshakeMessageClientKeyExchange),
156 Finished(HandshakeMessageFinished),
158}
159
160impl HandshakeMessage {
161 pub fn handshake_type(&self) -> HandshakeType {
163 match self {
164 HandshakeMessage::ClientHello(msg) => msg.handshake_type(),
165 HandshakeMessage::ServerHello(msg) => msg.handshake_type(),
166 HandshakeMessage::HelloVerifyRequest(msg) => msg.handshake_type(),
167 HandshakeMessage::Certificate(msg) => msg.handshake_type(),
168 HandshakeMessage::ServerKeyExchange(msg) => msg.handshake_type(),
169 HandshakeMessage::CertificateRequest(msg) => msg.handshake_type(),
170 HandshakeMessage::ServerHelloDone(msg) => msg.handshake_type(),
171 HandshakeMessage::CertificateVerify(msg) => msg.handshake_type(),
172 HandshakeMessage::ClientKeyExchange(msg) => msg.handshake_type(),
173 HandshakeMessage::Finished(msg) => msg.handshake_type(),
174 }
175 }
176
177 pub fn size(&self) -> usize {
179 match self {
180 HandshakeMessage::ClientHello(msg) => msg.size(),
181 HandshakeMessage::ServerHello(msg) => msg.size(),
182 HandshakeMessage::HelloVerifyRequest(msg) => msg.size(),
183 HandshakeMessage::Certificate(msg) => msg.size(),
184 HandshakeMessage::ServerKeyExchange(msg) => msg.size(),
185 HandshakeMessage::CertificateRequest(msg) => msg.size(),
186 HandshakeMessage::ServerHelloDone(msg) => msg.size(),
187 HandshakeMessage::CertificateVerify(msg) => msg.size(),
188 HandshakeMessage::ClientKeyExchange(msg) => msg.size(),
189 HandshakeMessage::Finished(msg) => msg.size(),
190 }
191 }
192
193 pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
199 match self {
200 HandshakeMessage::ClientHello(msg) => msg.marshal(writer)?,
201 HandshakeMessage::ServerHello(msg) => msg.marshal(writer)?,
202 HandshakeMessage::HelloVerifyRequest(msg) => msg.marshal(writer)?,
203 HandshakeMessage::Certificate(msg) => msg.marshal(writer)?,
204 HandshakeMessage::ServerKeyExchange(msg) => msg.marshal(writer)?,
205 HandshakeMessage::CertificateRequest(msg) => msg.marshal(writer)?,
206 HandshakeMessage::ServerHelloDone(msg) => msg.marshal(writer)?,
207 HandshakeMessage::CertificateVerify(msg) => msg.marshal(writer)?,
208 HandshakeMessage::ClientKeyExchange(msg) => msg.marshal(writer)?,
209 HandshakeMessage::Finished(msg) => msg.marshal(writer)?,
210 }
211
212 Ok(())
213 }
214}
215
216#[derive(PartialEq, Debug, Clone)]
223pub struct Handshake {
225 pub(crate) handshake_header: HandshakeHeader,
226 pub(crate) handshake_message: HandshakeMessage,
227}
228
229impl Handshake {
230 pub fn new(handshake_message: HandshakeMessage) -> Self {
232 Handshake {
233 handshake_header: HandshakeHeader {
234 handshake_type: handshake_message.handshake_type(),
235 length: handshake_message.size() as u32,
236 message_sequence: 0,
237 fragment_offset: 0,
238 fragment_length: handshake_message.size() as u32,
239 },
240 handshake_message,
241 }
242 }
243
244 pub fn content_type(&self) -> ContentType {
246 ContentType::Handshake
247 }
248
249 pub fn size(&self) -> usize {
251 self.handshake_header.size() + self.handshake_message.size()
252 }
253
254 pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
260 self.handshake_header.marshal(writer)?;
261 self.handshake_message.marshal(writer)?;
262 Ok(())
263 }
264
265 pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
271 let handshake_header = HandshakeHeader::unmarshal(reader)?;
272
273 let handshake_message = match handshake_header.handshake_type {
274 HandshakeType::ClientHello => {
275 HandshakeMessage::ClientHello(HandshakeMessageClientHello::unmarshal(reader)?)
276 }
277 HandshakeType::ServerHello => {
278 HandshakeMessage::ServerHello(HandshakeMessageServerHello::unmarshal(reader)?)
279 }
280 HandshakeType::HelloVerifyRequest => HandshakeMessage::HelloVerifyRequest(
281 HandshakeMessageHelloVerifyRequest::unmarshal(reader)?,
282 ),
283 HandshakeType::Certificate => {
284 HandshakeMessage::Certificate(HandshakeMessageCertificate::unmarshal(reader)?)
285 }
286 HandshakeType::ServerKeyExchange => HandshakeMessage::ServerKeyExchange(
287 HandshakeMessageServerKeyExchange::unmarshal(reader)?,
288 ),
289 HandshakeType::CertificateRequest => HandshakeMessage::CertificateRequest(
290 HandshakeMessageCertificateRequest::unmarshal(reader)?,
291 ),
292 HandshakeType::ServerHelloDone => HandshakeMessage::ServerHelloDone(
293 HandshakeMessageServerHelloDone::unmarshal(reader)?,
294 ),
295 HandshakeType::CertificateVerify => HandshakeMessage::CertificateVerify(
296 HandshakeMessageCertificateVerify::unmarshal(reader)?,
297 ),
298 HandshakeType::ClientKeyExchange => HandshakeMessage::ClientKeyExchange(
299 HandshakeMessageClientKeyExchange::unmarshal(reader)?,
300 ),
301 HandshakeType::Finished => {
302 HandshakeMessage::Finished(HandshakeMessageFinished::unmarshal(reader)?)
303 }
304 _ => return Err(Error::ErrNotImplemented),
305 };
306
307 Ok(Handshake {
308 handshake_header,
309 handshake_message,
310 })
311 }
312}