1use crate::error::RlsResult;
2pub use payload::Payload;
3pub use alert::Alert;
4use certificate::{CertificateStatus, Certificates};
5use client_hello::ClientHello;
6use key_exchange::{ClientKeyExchange, ServerKeyExchange};
7use server_hello::{ServerHello, ServerHelloDone};
8use session_ticket::SessionTicket;
9use std::fmt::Debug;
10use crate::{CipherSuite, WriteExt};
11pub use certificate::{CertificateVerify, CertificateRequest};
12
13pub mod certificate;
14pub mod client_hello;
15pub mod server_hello;
16pub mod key_exchange;
17pub mod session_ticket;
18mod payload;
19mod alert;
20
21#[derive(Debug)]
22pub enum Message<'a> {
23 ClientHello(ClientHello<'a>),
24 ServerHello(ServerHello<'a>),
25 Certificate(Certificates<'a>),
26 ServerKeyExchange(ServerKeyExchange),
27 ServerHelloDone(ServerHelloDone),
28 ClientKeyExchange(ClientKeyExchange<'a>),
29 NewSessionTicket(SessionTicket<'a>),
30 Payload(Payload<'a>),
31 CertificateStatus(CertificateStatus),
32 CertificateRequest(CertificateRequest<'a>),
33 CertificateVerify(CertificateVerify<'a>),
34 Alert(Alert),
35 CipherSpec,
36}
37
38impl<'a> Message<'a> {
39 pub fn from_bytes(bytes: &'a mut [u8], payload: bool, suite: Option<&CipherSuite>) -> RlsResult<Message<'a>> {
40 if !payload {
41 let handshake_type = HandshakeType::from_byte(bytes[0]).unwrap();
42 match handshake_type {
43 HandshakeType::ClientHello => Ok(Message::ClientHello(ClientHello::from_bytes(handshake_type, bytes)?)),
44 HandshakeType::ServerHello => Ok(Message::ServerHello(ServerHello::from_bytes(handshake_type, bytes)?)),
45 HandshakeType::Certificate => Ok(Message::Certificate(Certificates::from_bytes(handshake_type, bytes)?)),
46 HandshakeType::ServerKeyExchange => Ok(Message::ServerKeyExchange(ServerKeyExchange::from_bytes(handshake_type, bytes)?)),
47 HandshakeType::ServerHelloDone => Ok(Message::ServerHelloDone(ServerHelloDone::from_bytes(handshake_type, bytes)?)),
48 HandshakeType::ClientKeyExchange => Ok(Message::ClientKeyExchange(ClientKeyExchange::from_bytes(handshake_type, bytes, suite)?)),
49 HandshakeType::NewSessionTicket => Ok(Message::NewSessionTicket(SessionTicket::from_bytes(handshake_type, bytes)?)),
50 HandshakeType::CertificateStatus => Ok(Message::CertificateStatus(CertificateStatus::from_bytes(handshake_type, bytes))),
51 HandshakeType::CertificateRequest => Ok(Message::CertificateRequest(CertificateRequest::from_bytes(handshake_type, bytes))),
52 HandshakeType::CertificateVerify => Ok(Message::CertificateVerify(CertificateVerify::from_bytes(handshake_type, bytes))),
53 HandshakeType::CipherSpec => Ok(Message::CipherSpec),
54 }
55 } else {
56 Ok(Message::Payload(Payload::from_slice(bytes)))
57 }
58 }
59
60 pub fn len(&self, key_size: u8) -> usize {
61 match self {
62 Message::ClientHello(v) => v.len(),
63 Message::ServerHello(v) => v.len(),
64 Message::Certificate(v) => v.len(),
65 Message::ServerKeyExchange(v) => v.len(),
66 Message::ServerHelloDone(v) => v.len(),
67 Message::ClientKeyExchange(v) => v.len(key_size),
68 Message::NewSessionTicket(v) => v.len(),
69 Message::Payload(v) => v.value.len(),
70 Message::CertificateStatus(v) => v.len(),
71 Message::CertificateRequest(v) => v.len(),
72 Message::CertificateVerify(v) => v.len(),
73 Message::Alert(_) => 0,
74 Message::CipherSpec => 0
75 }
76 }
77
78 pub fn write_to<W: WriteExt>(self, writer: &mut W, key_size: u8) {
79 match self {
80 Message::ClientHello(v) => v.write_to(writer),
81 Message::ServerHello(v) => v.write_to(writer),
82 Message::Certificate(v) => v.write_to(writer),
83 Message::ServerKeyExchange(v) => v.write_to(writer),
84 Message::ServerHelloDone(v) => v.write_to(writer),
85 Message::ClientKeyExchange(v) => v.write_to(writer, key_size),
86 Message::NewSessionTicket(v) => v.write_to(writer),
87 Message::Payload(v) => writer.write_slice(v.into_inner()),
88 Message::CertificateStatus(v) => v.write_to(writer),
89 Message::CertificateRequest(v) => v.write_to(writer),
90 Message::CertificateVerify(v) => v.write_to(writer),
91 Message::Alert(_) => {}
92 Message::CipherSpec => {}
93 }
94 }
95
96 pub fn client_mut(&mut self) -> Option<&mut ClientHello<'a>> {
97 match self {
98 Message::ClientHello(v) => Some(v),
99 _ => None
100 }
101 }
102 pub fn client(&self) -> Option<&ClientHello<'a>> {
103 match self {
104 Message::ClientHello(v) => Some(v),
105 _ => None
106 }
107 }
108
109 pub fn server_mut(&mut self) -> Option<&mut ServerHello<'a>> {
110 match self {
111 Message::ServerHello(v) => Some(v),
112 _ => None
113 }
114 }
115
116 pub fn server(&self) -> Option<&ServerHello<'a>> {
117 match self {
118 Message::ServerHello(v) => Some(v),
119 _ => None
120 }
121 }
122
123 pub fn client_key_exchange_mut(&mut self) -> Option<&mut ClientKeyExchange<'a>> {
131 match self {
132 Message::ClientKeyExchange(v) => Some(v),
133 _ => None
134 }
135 }
136
137 pub fn payload(&self) -> Option<&Payload<'_>> {
145 match self {
146 Message::Payload(v) => Some(v),
147 _ => None
148 }
149 }
150
151 pub fn payload_mut(&mut self) -> Option<&'a mut Payload<'_>> {
152 match self {
153 Message::Payload(v) => Some(v),
154 _ => None
155 }
156 }
157
158 }
165
166#[derive(Debug, Copy, Clone)]
167pub enum HandshakeType {
168 ClientHello = 0x1,
169 ServerHello = 0x2,
170 NewSessionTicket = 0x4,
171 Certificate = 0xb,
172 ServerKeyExchange = 0xc,
173 CertificateRequest = 0xd,
174 ServerHelloDone = 0xe,
175 CertificateVerify = 0xf,
176 ClientKeyExchange = 0x10,
177 CipherSpec = 0x14,
178 CertificateStatus = 0x16,
179
180}
181
182impl HandshakeType {
183 pub fn from_byte(byte: u8) -> Option<HandshakeType> {
184 match byte {
185 0x1 => Some(HandshakeType::ClientHello),
186 0x2 => Some(HandshakeType::ServerHello),
187 0x4 => Some(HandshakeType::NewSessionTicket),
188 0xb => Some(HandshakeType::Certificate),
189 0xc => Some(HandshakeType::ServerKeyExchange),
190 0xd => Some(HandshakeType::CertificateRequest),
191 0xe => Some(HandshakeType::ServerHelloDone),
192 0xf => Some(HandshakeType::CertificateVerify),
193 0x10 => Some(HandshakeType::ClientKeyExchange),
194 0x14 => Some(HandshakeType::CipherSpec),
195 0x16 => Some(HandshakeType::CertificateStatus),
196 _ => None
197 }
198 }
199
200 pub fn as_u8(&self) -> u8 {
201 *self as u8
202 }
203}