Expose (de)serialziers as we'll need them and I don't like warnings
[rust-lightning] / src / util / ser.rs
1 use std::result::Result;
2 use std::io::{Read, Write};
3 use std::collections::HashMap;
4 use std::hash::Hash;
5 use std::mem;
6
7 use secp256k1::{Secp256k1, Signature};
8 use secp256k1::key::PublicKey;
9 use bitcoin::util::hash::Sha256dHash;
10 use bitcoin::blockdata::script::Script;
11 use std::marker::Sized;
12 use ln::msgs::DecodeError;
13
14 use util::byte_utils::{be64_to_array, be32_to_array, be16_to_array, slice_to_be16, slice_to_be32, slice_to_be64};
15
16 const MAX_BUF_SIZE: usize = 64 * 1024;
17
18 /// A struct that holds an std::io::Write-impl'ing object and implements various
19 /// rust-lightning-specific write functions.
20 pub struct Writer<W: Write> { writer: W }
21 /// A struct that holds an std::io::Read-impl'ing object and implements various
22 /// rust-lightning-specific read functions.
23 pub struct Reader<R: Read> { reader: R }
24
25 /// A trait that various rust-lightning types implement allowing them to be written out to a Writer
26 pub trait Writeable<W: Write> {
27         /// Writes self out to the given Writer
28         fn write(&self, writer: &mut Writer<W>) -> Result<(), DecodeError>;
29 }
30
31 /// A trait that various rust-lightning types implement allowing them to be read in from a Reader
32 pub trait Readable<R>
33         where Self: Sized,
34               R: Read
35 {
36         /// Reads a Self in from the given Reader
37         fn read(reader: &mut Reader<R>) -> Result<Self, DecodeError>;
38 }
39
40 impl<W: Write> Writer<W> {
41         /// Creates a new Writer from an std::io::Write-impl'ing object
42         pub fn new(writer: W) -> Writer<W> {
43                 return Writer { writer }
44         }
45         /// Consumes this object and returns the original writer
46         pub fn into_inner(self) -> W { self.writer }
47         /// Gets a reference to the original writer
48         pub fn get_ref(&self) -> &W { &self.writer }
49         fn write_u64(&mut self, v: u64) -> Result<(), DecodeError> {
50                 Ok(self.writer.write_all(&be64_to_array(v))?)
51         }
52         fn write_u32(&mut self, v: u32) -> Result<(), DecodeError> {
53                 Ok(self.writer.write_all(&be32_to_array(v))?)
54         }
55         fn write_u16(&mut self, v: u16) -> Result<(), DecodeError> {
56                 Ok(self.writer.write_all(&be16_to_array(v))?)
57         }
58         fn write_u8(&mut self, v: u8) -> Result<(), DecodeError> {
59                 Ok(self.writer.write_all(&[v])?)
60         }
61         fn write_bool(&mut self, v: bool) -> Result<(), DecodeError> {
62                 Ok(self.writer.write_all(&[if v {1} else {0}])?)
63         }
64         pub(crate) fn write_all(&mut self, v: &[u8]) -> Result<(), DecodeError> {
65                 Ok(self.writer.write_all(v)?)
66         }
67 }
68
69 impl<R: Read> Reader<R> {
70         /// Creates a new Reader from an std::io::Read-impl'ing object
71         pub fn new(reader: R) -> Reader<R> {
72                 return Reader { reader }
73         }
74         /// Consumes this object and returns the original reader
75         pub fn into_inner(self) -> R { self.reader }
76         /// Gets a reference to the original reader
77         pub fn get_ref(&self) -> &R { &self.reader }
78
79         fn read_u64(&mut self) -> Result<u64, DecodeError> {
80                 let mut buf = [0; 8];
81                 self.reader.read_exact(&mut buf)?;
82                 Ok(slice_to_be64(&buf))
83         }
84
85         fn read_u32(&mut self) -> Result<u32, DecodeError> {
86                 let mut buf = [0; 4];
87                 self.reader.read_exact(&mut buf)?;
88                 Ok(slice_to_be32(&buf))
89         }
90
91         fn read_u16(&mut self) -> Result<u16, DecodeError> {
92                 let mut buf = [0; 2];
93                 self.reader.read_exact(&mut buf)?;
94                 Ok(slice_to_be16(&buf))
95         }
96
97         fn read_u8(&mut self) -> Result<u8, DecodeError> {
98                 let mut buf = [0; 1];
99                 self.reader.read_exact(&mut buf)?;
100                 Ok(buf[0])
101         }
102         fn read_bool(&mut self) -> Result<bool, DecodeError> {
103                 let mut buf = [0; 1];
104                 self.reader.read_exact(&mut buf)?;
105                 if buf[0] != 0 && buf[0] != 1 {
106                         return Err(DecodeError::InvalidValue);
107                 }
108                 Ok(buf[0] == 1)
109         }
110         pub(crate) fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), DecodeError> {
111                 Ok(self.reader.read_exact(buf)?)
112         }
113         pub(crate) fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, DecodeError> {
114                 Ok(self.reader.read_to_end(buf)?)
115         }
116 }
117
118 macro_rules! impl_writeable_primitive {
119         ($val_type:ty, $meth_write:ident, $meth_read:ident) => {
120                 impl<W:Write> Writeable<W> for $val_type {
121                         #[inline]
122                         fn write(&self, writer: &mut Writer<W>) -> Result<(), DecodeError> {
123                                 writer.$meth_write(*self)
124                         }
125                 }
126                 impl<R:Read> Readable<R> for $val_type {
127                         #[inline]
128                         fn read(reader: &mut Reader<R>) -> Result<$val_type, DecodeError> {
129                                 reader.$meth_read()
130                         }
131                 }
132         }
133 }
134
135 impl_writeable_primitive!(u64, write_u64, read_u64);
136 impl_writeable_primitive!(u32, write_u32, read_u32);
137 impl_writeable_primitive!(u16, write_u16, read_u16);
138 impl_writeable_primitive!(u8, write_u8, read_u8);
139 impl_writeable_primitive!(bool, write_bool, read_bool);
140
141 // u8 arrays
142 macro_rules! impl_array {
143         ( $size:expr ) => (
144                 impl<W> Writeable<W> for [u8; $size]
145                         where W: Write
146                 {
147                         #[inline]
148                         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
149                                 w.write_all(self)?;
150                                 Ok(())
151                         }
152                 }
153
154                 impl<R> Readable<R> for [u8; $size]
155                         where R: Read
156                 {
157                         #[inline]
158                         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
159                                 let mut buf = [0u8; $size];
160                                 r.read_exact(&mut buf)?;
161                                 Ok(buf)
162                         }
163                 }
164         );
165 }
166
167 //TODO: performance issue with [u8; size] with impl_array!()
168 impl_array!(32); // for channel id & hmac
169 impl_array!(33); // for PublicKey
170 impl_array!(64); // for Signature
171 impl_array!(1300); // for OnionPacket.hop_data
172
173 // HashMap
174 impl<W, K, V> Writeable<W> for HashMap<K, V>
175         where W: Write,
176               K: Writeable<W> + Eq + Hash,
177               V: Writeable<W>
178 {
179         #[inline]
180         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
181         (self.len() as u16).write(w)?;
182                 for (key, value) in self.iter() {
183                         key.write(w)?;
184                         value.write(w)?;
185                 }
186                 Ok(())
187         }
188 }
189
190 impl<R, K, V> Readable<R> for HashMap<K, V>
191         where R: Read,
192               K: Readable<R> + Eq + Hash,
193               V: Readable<R>
194 {
195         #[inline]
196         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
197                 let len: u16 = Readable::read(r)?;
198                 let mut ret = HashMap::with_capacity(len as usize);
199                 for _ in 0..len {
200                         ret.insert(K::read(r)?, V::read(r)?);
201                 }
202                 Ok(ret)
203         }
204 }
205
206 // Vectors
207 impl<W: Write, T: Writeable<W>> Writeable<W> for Vec<T> {
208         #[inline]
209         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
210                 let byte_size = (self.len() as usize)
211                                 .checked_mul(mem::size_of::<T>())
212                                 .ok_or(DecodeError::BadLengthDescriptor)?;
213                 if byte_size > MAX_BUF_SIZE {
214                         return Err(DecodeError::BadLengthDescriptor);
215                 }
216                 (self.len() as u16).write(w)?;
217                 // performance with Vec<u8>
218                 for e in self.iter() {
219                         e.write(w)?;
220                 }
221                 Ok(())
222         }
223 }
224
225 impl<R: Read, T: Readable<R>> Readable<R> for Vec<T> {
226         #[inline]
227         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
228                 let len: u16 = Readable::read(r)?;
229                 let byte_size = (len as usize)
230                                 .checked_mul(mem::size_of::<T>())
231                                 .ok_or(DecodeError::BadLengthDescriptor)?;
232                 if byte_size > MAX_BUF_SIZE {
233                         return Err(DecodeError::BadLengthDescriptor);
234                 }
235                 let mut ret = Vec::with_capacity(len as usize);
236                 for _ in 0..len { ret.push(T::read(r)?); }
237                 Ok(ret)
238         }
239 }
240
241 impl<W: Write> Writeable<W> for Script {
242         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
243                 self.to_bytes().to_vec().write(w)
244         }
245 }
246
247 impl<R: Read> Readable<R> for Script {
248         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
249                 let len = <u16 as Readable<R>>::read(r)? as usize;
250                 let mut buf = vec![0; len];
251                 r.read_exact(&mut buf)?;
252                 Ok(Script::from(buf))
253         }
254 }
255
256 impl<W: Write> Writeable<W> for Option<Script> {
257         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
258                 if let &Some(ref script) = self {
259                         script.write(w)?;
260                 }
261                 Ok(())
262         }
263 }
264
265 impl<R: Read> Readable<R> for Option<Script> {
266         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
267                 match <u16 as Readable<R>>::read(r) {
268                         Ok(len) => {
269                                 let mut buf = vec![0; len as usize];
270                                 r.read_exact(&mut buf)?;
271                                 Ok(Some(Script::from(buf)))
272                         },
273                         Err(DecodeError::ShortRead) => Ok(None),
274                         Err(e) => Err(e)
275                 }
276         }
277 }
278
279 impl<W: Write> Writeable<W> for PublicKey {
280         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
281                 self.serialize().write(w)
282         }
283 }
284
285 impl<R: Read> Readable<R> for PublicKey {
286         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
287                 let buf: [u8; 33] = Readable::read(r)?;
288                 match PublicKey::from_slice(&Secp256k1::without_caps(), &buf) {
289                         Ok(key) => Ok(key),
290                         Err(_) => return Err(DecodeError::BadPublicKey),
291                 }
292         }
293 }
294
295 impl<W: Write> Writeable<W> for Sha256dHash {
296         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
297                 self.as_bytes().write(w)
298         }
299 }
300
301 impl<R: Read> Readable<R> for Sha256dHash {
302         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
303                 let buf: [u8; 32] = Readable::read(r)?;
304                 Ok(From::from(&buf[..]))
305         }
306 }
307
308 impl<W: Write> Writeable<W> for Signature {
309         fn write(&self, w: &mut Writer<W>) -> Result<(), DecodeError> {
310                 self.serialize_compact(&Secp256k1::without_caps()).write(w)
311         }
312 }
313
314 impl<R: Read> Readable<R> for Signature {
315         fn read(r: &mut Reader<R>) -> Result<Self, DecodeError> {
316                 let buf: [u8; 64] = Readable::read(r)?;
317                 match Signature::from_compact(&Secp256k1::without_caps(), &buf) {
318                         Ok(sig) => Ok(sig),
319                         Err(_) => return Err(DecodeError::BadSignature),
320                 }
321         }
322 }