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 {content_types:?}",
46        payload.content_type(),
47    );
48    Error::InappropriateMessage {
49        expect_types: content_types.to_vec(),
50        got_type: payload.content_type(),
51    }
52}
53
54pub(crate) fn inappropriate_handshake_message(
55    payload: &MessagePayload<'_>,
56    content_types: &[ContentType],
57    handshake_types: &[HandshakeType],
58) -> Error {
59    match payload {
60        MessagePayload::Handshake { parsed, .. } => {
61            let got_type = parsed.0.handshake_type();
62            warn!("Received a {got_type:?} handshake message while expecting {handshake_types:?}",);
63            Error::InappropriateHandshakeMessage {
64                expect_types: handshake_types.to_vec(),
65                got_type,
66            }
67        }
68        payload => inappropriate_message(payload, content_types),
69    }
70}