rustls/msgs/
base.rs

1use std::fmt;
2
3use crate::error::InvalidMessage;
4use crate::key;
5use crate::msgs::codec;
6use crate::msgs::codec::{Codec, Reader};
7
8/// An externally length'd payload
9#[derive(Clone, Eq, PartialEq)]
10pub struct Payload(pub Vec<u8>);
11
12impl Codec for Payload {
13    fn encode(&self, bytes: &mut Vec<u8>) {
14        bytes.extend_from_slice(&self.0);
15    }
16
17    fn read(r: &mut Reader) -> Result<Self, InvalidMessage> {
18        Ok(Self::read(r))
19    }
20}
21
22impl Payload {
23    pub fn new(bytes: impl Into<Vec<u8>>) -> Self {
24        Self(bytes.into())
25    }
26
27    pub fn empty() -> Self {
28        Self::new(Vec::new())
29    }
30
31    pub fn read(r: &mut Reader) -> Self {
32        Self(r.rest().to_vec())
33    }
34}
35
36impl Codec for key::Certificate {
37    fn encode(&self, bytes: &mut Vec<u8>) {
38        codec::u24(self.0.len() as u32).encode(bytes);
39        bytes.extend_from_slice(&self.0);
40    }
41
42    fn read(r: &mut Reader) -> Result<Self, InvalidMessage> {
43        let len = codec::u24::read(r)?.0 as usize;
44        let mut sub = r.sub(len)?;
45        let body = sub.rest().to_vec();
46        Ok(Self(body))
47    }
48}
49
50impl fmt::Debug for Payload {
51    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52        hex(f, &self.0)
53    }
54}
55
56/// An arbitrary, unknown-content, u24-length-prefixed payload
57#[derive(Clone, Eq, PartialEq)]
58pub struct PayloadU24(pub Vec<u8>);
59
60impl PayloadU24 {
61    pub fn new(bytes: Vec<u8>) -> Self {
62        Self(bytes)
63    }
64}
65
66impl Codec for PayloadU24 {
67    fn encode(&self, bytes: &mut Vec<u8>) {
68        codec::u24(self.0.len() as u32).encode(bytes);
69        bytes.extend_from_slice(&self.0);
70    }
71
72    fn read(r: &mut Reader) -> Result<Self, InvalidMessage> {
73        let len = codec::u24::read(r)?.0 as usize;
74        let mut sub = r.sub(len)?;
75        let body = sub.rest().to_vec();
76        Ok(Self(body))
77    }
78}
79
80impl fmt::Debug for PayloadU24 {
81    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82        hex(f, &self.0)
83    }
84}
85
86/// An arbitrary, unknown-content, u16-length-prefixed payload
87#[derive(Clone, Eq, PartialEq)]
88pub struct PayloadU16(pub Vec<u8>);
89
90impl PayloadU16 {
91    pub fn new(bytes: Vec<u8>) -> Self {
92        Self(bytes)
93    }
94
95    pub fn empty() -> Self {
96        Self::new(Vec::new())
97    }
98
99    pub fn encode_slice(slice: &[u8], bytes: &mut Vec<u8>) {
100        (slice.len() as u16).encode(bytes);
101        bytes.extend_from_slice(slice);
102    }
103}
104
105impl Codec for PayloadU16 {
106    fn encode(&self, bytes: &mut Vec<u8>) {
107        Self::encode_slice(&self.0, bytes);
108    }
109
110    fn read(r: &mut Reader) -> Result<Self, InvalidMessage> {
111        let len = u16::read(r)? as usize;
112        let mut sub = r.sub(len)?;
113        let body = sub.rest().to_vec();
114        Ok(Self(body))
115    }
116}
117
118impl fmt::Debug for PayloadU16 {
119    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
120        hex(f, &self.0)
121    }
122}
123
124/// An arbitrary, unknown-content, u8-length-prefixed payload
125#[derive(Clone, Eq, PartialEq)]
126pub struct PayloadU8(pub Vec<u8>);
127
128impl PayloadU8 {
129    pub fn new(bytes: Vec<u8>) -> Self {
130        Self(bytes)
131    }
132
133    pub fn empty() -> Self {
134        Self(Vec::new())
135    }
136
137    pub fn into_inner(self) -> Vec<u8> {
138        self.0
139    }
140}
141
142impl Codec for PayloadU8 {
143    fn encode(&self, bytes: &mut Vec<u8>) {
144        (self.0.len() as u8).encode(bytes);
145        bytes.extend_from_slice(&self.0);
146    }
147
148    fn read(r: &mut Reader) -> Result<Self, InvalidMessage> {
149        let len = u8::read(r)? as usize;
150        let mut sub = r.sub(len)?;
151        let body = sub.rest().to_vec();
152        Ok(Self(body))
153    }
154}
155
156impl fmt::Debug for PayloadU8 {
157    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
158        hex(f, &self.0)
159    }
160}
161
162// Format an iterator of u8 into a hex string
163pub(super) fn hex<'a>(
164    f: &mut fmt::Formatter<'_>,
165    payload: impl IntoIterator<Item = &'a u8>,
166) -> fmt::Result {
167    for b in payload {
168        write!(f, "{:02x}", b)?;
169    }
170    Ok(())
171}