rustls/msgs/
base.rs

1use crate::key;
2use crate::msgs::codec;
3use crate::msgs::codec::{Codec, Reader};
4/// An externally length'd payload
5#[derive(Debug, Clone, PartialEq)]
6pub struct Payload(pub Vec<u8>);
7
8impl Codec for Payload {
9    fn encode(&self, bytes: &mut Vec<u8>) {
10        bytes.extend_from_slice(&self.0);
11    }
12
13    fn read(r: &mut Reader) -> Option<Payload> {
14        Some(Payload(r.rest().to_vec()))
15    }
16}
17
18impl Payload {
19    pub fn new(bytes: Vec<u8>) -> Payload {
20        Payload(bytes)
21    }
22
23    pub fn empty() -> Payload {
24        Payload::new(Vec::new())
25    }
26}
27
28impl Codec for key::Certificate {
29    fn encode(&self, bytes: &mut Vec<u8>) {
30        codec::u24(self.0.len() as u32).encode(bytes);
31        bytes.extend_from_slice(&self.0);
32    }
33
34    fn read(r: &mut Reader) -> Option<key::Certificate> {
35        let len = codec::u24::read(r)?.0 as usize;
36        let mut sub = r.sub(len)?;
37        let body = sub.rest().to_vec();
38        Some(key::Certificate(body))
39    }
40}
41
42/// An arbitrary, unknown-content, u24-length-prefixed payload
43#[derive(Debug, Clone, PartialEq)]
44pub struct PayloadU24(pub Vec<u8>);
45
46impl PayloadU24 {
47    pub fn new(bytes: Vec<u8>) -> PayloadU24 {
48        PayloadU24(bytes)
49    }
50}
51
52impl Codec for PayloadU24 {
53    fn encode(&self, bytes: &mut Vec<u8>) {
54        codec::u24(self.0.len() as u32).encode(bytes);
55        bytes.extend_from_slice(&self.0);
56    }
57
58    fn read(r: &mut Reader) -> Option<PayloadU24> {
59        let len = codec::u24::read(r)?.0 as usize;
60        let mut sub = r.sub(len)?;
61        let body = sub.rest().to_vec();
62        Some(PayloadU24(body))
63    }
64}
65
66/// An arbitrary, unknown-content, u16-length-prefixed payload
67#[derive(Debug, Clone, PartialEq)]
68pub struct PayloadU16(pub Vec<u8>);
69
70impl PayloadU16 {
71    pub fn new(bytes: Vec<u8>) -> PayloadU16 {
72        PayloadU16(bytes)
73    }
74
75    pub fn empty() -> PayloadU16 {
76        PayloadU16::new(Vec::new())
77    }
78
79    pub fn encode_slice(slice: &[u8], bytes: &mut Vec<u8>) {
80        (slice.len() as u16).encode(bytes);
81        bytes.extend_from_slice(slice);
82    }
83}
84
85impl Codec for PayloadU16 {
86    fn encode(&self, bytes: &mut Vec<u8>) {
87        Self::encode_slice(&self.0, bytes);
88    }
89
90    fn read(r: &mut Reader) -> Option<PayloadU16> {
91        let len = u16::read(r)? as usize;
92        let mut sub = r.sub(len)?;
93        let body = sub.rest().to_vec();
94        Some(PayloadU16(body))
95    }
96}
97
98/// An arbitrary, unknown-content, u8-length-prefixed payload
99#[derive(Debug, Clone, PartialEq)]
100pub struct PayloadU8(pub Vec<u8>);
101
102impl PayloadU8 {
103    pub fn new(bytes: Vec<u8>) -> PayloadU8 {
104        PayloadU8(bytes)
105    }
106
107    pub fn empty() -> PayloadU8 {
108        PayloadU8(Vec::new())
109    }
110
111    pub fn into_inner(self) -> Vec<u8> {
112        self.0
113    }
114}
115
116impl Codec for PayloadU8 {
117    fn encode(&self, bytes: &mut Vec<u8>) {
118        (self.0.len() as u8).encode(bytes);
119        bytes.extend_from_slice(&self.0);
120    }
121
122    fn read(r: &mut Reader) -> Option<PayloadU8> {
123        let len = u8::read(r)? as usize;
124        let mut sub = r.sub(len)?;
125        let body = sub.rest().to_vec();
126        Some(PayloadU8(body))
127    }
128}