1 use std::fmt::Debug;
2 
3 /// Read from a byte slice.
4 pub struct Reader<'a> {
5     buf: &'a [u8],
6     offs: usize,
7 }
8 
9 impl<'a> Reader<'a> {
init(bytes: &[u8]) -> Reader10     pub fn init(bytes: &[u8]) -> Reader {
11         Reader {
12             buf: bytes,
13             offs: 0,
14         }
15     }
16 
rest(&mut self) -> &[u8]17     pub fn rest(&mut self) -> &[u8] {
18         let ret = &self.buf[self.offs..];
19         self.offs = self.buf.len();
20         ret
21     }
22 
take(&mut self, len: usize) -> Option<&[u8]>23     pub fn take(&mut self, len: usize) -> Option<&[u8]> {
24         if self.left() < len {
25             return None;
26         }
27 
28         let current = self.offs;
29         self.offs += len;
30         Some(&self.buf[current..current + len])
31     }
32 
any_left(&self) -> bool33     pub fn any_left(&self) -> bool {
34         self.offs < self.buf.len()
35     }
36 
left(&self) -> usize37     pub fn left(&self) -> usize {
38         self.buf.len() - self.offs
39     }
40 
used(&self) -> usize41     pub fn used(&self) -> usize {
42         self.offs
43     }
44 
sub(&mut self, len: usize) -> Option<Reader>45     pub fn sub(&mut self, len: usize) -> Option<Reader> {
46         self.take(len).map(Reader::init)
47     }
48 }
49 
50 /// Things we can encode and read from a Reader.
51 pub trait Codec: Debug + Sized {
52     /// Encode yourself by appending onto `bytes`.
encode(&self, bytes: &mut Vec<u8>)53     fn encode(&self, bytes: &mut Vec<u8>);
54 
55     /// Decode yourself by fiddling with the `Reader`.
56     /// Return Some if it worked, None if not.
read(_: &mut Reader) -> Option<Self>57     fn read(_: &mut Reader) -> Option<Self>;
58 
59     /// Convenience function to get the results of `encode()`.
get_encoding(&self) -> Vec<u8>60     fn get_encoding(&self) -> Vec<u8> {
61         let mut ret = Vec::new();
62         self.encode(&mut ret);
63         ret
64     }
65 
66     /// Read one of these from the front of `bytes` and
67     /// return it.
read_bytes(bytes: &[u8]) -> Option<Self>68     fn read_bytes(bytes: &[u8]) -> Option<Self> {
69         let mut rd = Reader::init(bytes);
70         Self::read(&mut rd)
71     }
72 }
73 
74 // Encoding functions.
decode_u8(bytes: &[u8]) -> Option<u8>75 pub fn decode_u8(bytes: &[u8]) -> Option<u8> {
76     Some(bytes[0])
77 }
78 
79 impl Codec for u8 {
encode(&self, bytes: &mut Vec<u8>)80     fn encode(&self, bytes: &mut Vec<u8>) {
81         bytes.push(*self);
82     }
read(r: &mut Reader) -> Option<u8>83     fn read(r: &mut Reader) -> Option<u8> {
84         r.take(1).and_then(decode_u8)
85     }
86 }
87 
put_u16(v: u16, out: &mut [u8])88 pub fn put_u16(v: u16, out: &mut [u8]) {
89     out[0] = (v >> 8) as u8;
90     out[1] = v as u8;
91 }
92 
decode_u16(bytes: &[u8]) -> Option<u16>93 pub fn decode_u16(bytes: &[u8]) -> Option<u16> {
94     Some((u16::from(bytes[0]) << 8) | u16::from(bytes[1]))
95 }
96 
97 impl Codec for u16 {
encode(&self, bytes: &mut Vec<u8>)98     fn encode(&self, bytes: &mut Vec<u8>) {
99         let mut b16 = [0u8; 2];
100         put_u16(*self, &mut b16);
101         bytes.extend_from_slice(&b16);
102     }
103 
read(r: &mut Reader) -> Option<u16>104     fn read(r: &mut Reader) -> Option<u16> {
105         r.take(2).and_then(decode_u16)
106     }
107 }
108 
109 // Make a distinct type for u24, even though it's a u32 underneath
110 #[allow(non_camel_case_types)]
111 #[derive(Debug)]
112 pub struct u24(pub u32);
113 
114 impl u24 {
decode(bytes: &[u8]) -> Option<u24>115     pub fn decode(bytes: &[u8]) -> Option<u24> {
116         Some(u24((u32::from(bytes[0]) << 16)
117             | (u32::from(bytes[1]) << 8)
118             | u32::from(bytes[2])))
119     }
120 }
121 
122 impl Codec for u24 {
encode(&self, bytes: &mut Vec<u8>)123     fn encode(&self, bytes: &mut Vec<u8>) {
124         bytes.push((self.0 >> 16) as u8);
125         bytes.push((self.0 >> 8) as u8);
126         bytes.push(self.0 as u8);
127     }
128 
read(r: &mut Reader) -> Option<u24>129     fn read(r: &mut Reader) -> Option<u24> {
130         r.take(3).and_then(u24::decode)
131     }
132 }
133 
decode_u32(bytes: &[u8]) -> Option<u32>134 pub fn decode_u32(bytes: &[u8]) -> Option<u32> {
135     Some(
136         (u32::from(bytes[0]) << 24)
137             | (u32::from(bytes[1]) << 16)
138             | (u32::from(bytes[2]) << 8)
139             | u32::from(bytes[3]),
140     )
141 }
142 
143 impl Codec for u32 {
encode(&self, bytes: &mut Vec<u8>)144     fn encode(&self, bytes: &mut Vec<u8>) {
145         bytes.push((*self >> 24) as u8);
146         bytes.push((*self >> 16) as u8);
147         bytes.push((*self >> 8) as u8);
148         bytes.push(*self as u8);
149     }
150 
read(r: &mut Reader) -> Option<u32>151     fn read(r: &mut Reader) -> Option<u32> {
152         r.take(4).and_then(decode_u32)
153     }
154 }
155 
put_u64(v: u64, bytes: &mut [u8])156 pub fn put_u64(v: u64, bytes: &mut [u8]) {
157     bytes[0] = (v >> 56) as u8;
158     bytes[1] = (v >> 48) as u8;
159     bytes[2] = (v >> 40) as u8;
160     bytes[3] = (v >> 32) as u8;
161     bytes[4] = (v >> 24) as u8;
162     bytes[5] = (v >> 16) as u8;
163     bytes[6] = (v >> 8) as u8;
164     bytes[7] = v as u8;
165 }
166 
decode_u64(bytes: &[u8]) -> Option<u64>167 pub fn decode_u64(bytes: &[u8]) -> Option<u64> {
168     Some(
169         (u64::from(bytes[0]) << 56)
170             | (u64::from(bytes[1]) << 48)
171             | (u64::from(bytes[2]) << 40)
172             | (u64::from(bytes[3]) << 32)
173             | (u64::from(bytes[4]) << 24)
174             | (u64::from(bytes[5]) << 16)
175             | (u64::from(bytes[6]) << 8)
176             | u64::from(bytes[7]),
177     )
178 }
179 
180 impl Codec for u64 {
encode(&self, bytes: &mut Vec<u8>)181     fn encode(&self, bytes: &mut Vec<u8>) {
182         let mut b64 = [0u8; 8];
183         put_u64(*self, &mut b64);
184         bytes.extend_from_slice(&b64);
185     }
186 
read(r: &mut Reader) -> Option<u64>187     fn read(r: &mut Reader) -> Option<u64> {
188         r.take(8).and_then(decode_u64)
189     }
190 }
191 
encode_vec_u8<T: Codec>(bytes: &mut Vec<u8>, items: &[T])192 pub fn encode_vec_u8<T: Codec>(bytes: &mut Vec<u8>, items: &[T]) {
193     let mut sub: Vec<u8> = Vec::new();
194     for i in items {
195         i.encode(&mut sub);
196     }
197 
198     debug_assert!(sub.len() <= 0xff);
199     (sub.len() as u8).encode(bytes);
200     bytes.append(&mut sub);
201 }
202 
encode_vec_u16<T: Codec>(bytes: &mut Vec<u8>, items: &[T])203 pub fn encode_vec_u16<T: Codec>(bytes: &mut Vec<u8>, items: &[T]) {
204     let mut sub: Vec<u8> = Vec::new();
205     for i in items {
206         i.encode(&mut sub);
207     }
208 
209     debug_assert!(sub.len() <= 0xffff);
210     (sub.len() as u16).encode(bytes);
211     bytes.append(&mut sub);
212 }
213 
encode_vec_u24<T: Codec>(bytes: &mut Vec<u8>, items: &[T])214 pub fn encode_vec_u24<T: Codec>(bytes: &mut Vec<u8>, items: &[T]) {
215     let mut sub: Vec<u8> = Vec::new();
216     for i in items {
217         i.encode(&mut sub);
218     }
219 
220     debug_assert!(sub.len() <= 0xff_ffff);
221     u24(sub.len() as u32).encode(bytes);
222     bytes.append(&mut sub);
223 }
224 
read_vec_u8<T: Codec>(r: &mut Reader) -> Option<Vec<T>>225 pub fn read_vec_u8<T: Codec>(r: &mut Reader) -> Option<Vec<T>> {
226     let mut ret: Vec<T> = Vec::new();
227     let len = usize::from(u8::read(r)?);
228     let mut sub = r.sub(len)?;
229 
230     while sub.any_left() {
231         ret.push(T::read(&mut sub)?);
232     }
233 
234     Some(ret)
235 }
236 
read_vec_u16<T: Codec>(r: &mut Reader) -> Option<Vec<T>>237 pub fn read_vec_u16<T: Codec>(r: &mut Reader) -> Option<Vec<T>> {
238     let mut ret: Vec<T> = Vec::new();
239     let len = usize::from(u16::read(r)?);
240     let mut sub = r.sub(len)?;
241 
242     while sub.any_left() {
243         ret.push(T::read(&mut sub)?);
244     }
245 
246     Some(ret)
247 }
248 
read_vec_u24_limited<T: Codec>(r: &mut Reader, max_bytes: usize) -> Option<Vec<T>>249 pub fn read_vec_u24_limited<T: Codec>(r: &mut Reader, max_bytes: usize) -> Option<Vec<T>> {
250     let mut ret: Vec<T> = Vec::new();
251     let len = u24::read(r)?.0 as usize;
252     if len > max_bytes {
253         return None;
254     }
255 
256     let mut sub = r.sub(len)?;
257 
258     while sub.any_left() {
259         ret.push(T::read(&mut sub)?);
260     }
261 
262     Some(ret)
263 }
264