rustls/
check.rs

1use crate::enums::{ContentType, HandshakeType};
2use crate::error::Error;
3use crate::log::warn;
4use crate::msgs::message::MessagePayload;
5
6/// For a Message $m, and a HandshakePayload enum member $payload_type,
7/// return Ok(payload) if $m is both a handshake message and one that
8/// has the given $payload_type.  If not, return Err(rustls::Error) quoting
9/// $handshake_type as the expected handshake type.
10macro_rules! require_handshake_msg(
11  ( $m:expr, $handshake_type:path, $payload_type:path ) => (
12    match &$m.payload {
13        MessagePayload::Handshake { parsed: $crate::msgs::handshake::HandshakeMessagePayload(
14            $payload_type(hm),
15        ), .. } => Ok(hm),
16        payload => Err($crate::check::inappropriate_handshake_message(
17            payload,
18            &[$crate::ContentType::Handshake],
19            &[$handshake_type]))
20    }
21  )
22);
23
24/// Like require_handshake_msg, but moves the payload out of $m.
25macro_rules! require_handshake_msg_move(
26  ( $m:expr, $handshake_type:path, $payload_type:path ) => (
27    match $m.payload {
28        MessagePayload::Handshake { parsed: $crate::msgs::handshake::HandshakeMessagePayload(
29            $payload_type(hm),
30        ), .. } => Ok(hm),
31        payload =>
32            Err($crate::check::inappropriate_handshake_message(
33                &payload,
34                &[$crate::ContentType::Handshake],
35                &[$handshake_type]))
36    }
37  )
38);
39
40pub(crate) fn inappropriate_message(
41    payload: &MessagePayload<'_>,
42    content_types: &[ContentType],
43) -> Error {
44    warn!(
45        "Received a {:?} message while expecting {:?}",
46        payload.content_type(),
47        content_types
48    );
49    Error::InappropriateMessage {
50        expect_types: content_types.to_vec(),
51        got_type: payload.content_type(),
52    }
53}
54
55pub(crate) fn inappropriate_handshake_message(
56    payload: &MessagePayload<'_>,
57    content_types: &[ContentType],
58    handshake_types: &[HandshakeType],
59) -> Error {
60    match payload {
61        MessagePayload::Handshake { parsed, .. } => {
62            let got_type = parsed.0.handshake_type();
63            warn!(
64                "Received a {:?} handshake message while expecting {:?}",
65                got_type, handshake_types
66            );
67            Error::InappropriateHandshakeMessage {
68                expect_types: handshake_types.to_vec(),
69                got_type,
70            }
71        }
72        payload => inappropriate_message(payload, content_types),
73    }
74}