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#[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#[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#[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#[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
162pub(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}