X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Futil%2Fser.rs;h=db9549c658dd594fd8ed0d529282666632cc6b70;hb=HEAD;hp=299515d9022ed46341754d2eca417a5f48f85fce;hpb=648a31b91a19b927e040a3dff5876ef834d2ba7a;p=rust-lightning diff --git a/src/util/ser.rs b/src/util/ser.rs deleted file mode 100644 index 299515d9..00000000 --- a/src/util/ser.rs +++ /dev/null @@ -1,327 +0,0 @@ -use std::result::Result; -use std::io::{Read, Write}; -use std::collections::HashMap; -use std::hash::Hash; -use std::mem; - -use secp256k1::{Secp256k1, Signature}; -use secp256k1::key::PublicKey; -use bitcoin::util::hash::Sha256dHash; -use bitcoin::blockdata::script::Script; -use std::marker::Sized; -use ln::msgs::DecodeError; - -use util::byte_utils::{be64_to_array, be32_to_array, be16_to_array, slice_to_be16, slice_to_be32, slice_to_be64}; - -const MAX_BUF_SIZE: usize = 64 * 1024; - -pub struct Writer { writer: W } -pub struct Reader { reader: R } - -pub trait Writeable { - fn write(&self, writer: &mut Writer) -> Result<(), DecodeError>; -} - -pub trait Readable - where Self: Sized, - R: Read -{ - fn read(reader: &mut Reader) -> Result; -} - -impl Writer { - pub fn new(writer: W) -> Writer { - return Writer { writer } - } - pub fn into_inner(self) -> W { self.writer } - pub fn get_ref(&self) -> &W { &self.writer } - fn write_u64(&mut self, v: u64) -> Result<(), DecodeError> { - Ok(self.writer.write_all(&be64_to_array(v))?) - } - fn write_u32(&mut self, v: u32) -> Result<(), DecodeError> { - Ok(self.writer.write_all(&be32_to_array(v))?) - } - fn write_u16(&mut self, v: u16) -> Result<(), DecodeError> { - Ok(self.writer.write_all(&be16_to_array(v))?) - } - fn write_u8(&mut self, v: u8) -> Result<(), DecodeError> { - Ok(self.writer.write_all(&[v])?) - } - fn write_bool(&mut self, v: bool) -> Result<(), DecodeError> { - Ok(self.writer.write_all(&[if v {1} else {0}])?) - } - pub fn write_all(&mut self, v: &[u8]) -> Result<(), DecodeError> { - Ok(self.writer.write_all(v)?) - } -} - -impl Reader { - pub fn new(reader: R) -> Reader { - return Reader { reader } - } - pub fn into_inner(self) -> R { self.reader } - pub fn get_ref(&self) -> &R { &self.reader } - - fn read_u64(&mut self) -> Result { - let mut buf = [0; 8]; - self.reader.read_exact(&mut buf)?; - Ok(slice_to_be64(&buf)) - } - - fn read_u32(&mut self) -> Result { - let mut buf = [0; 4]; - self.reader.read_exact(&mut buf)?; - Ok(slice_to_be32(&buf)) - } - - fn read_u16(&mut self) -> Result { - let mut buf = [0; 2]; - self.reader.read_exact(&mut buf)?; - Ok(slice_to_be16(&buf)) - } - - fn read_u8(&mut self) -> Result { - let mut buf = [0; 1]; - self.reader.read_exact(&mut buf)?; - Ok(buf[0]) - } - fn read_bool(&mut self) -> Result { - let mut buf = [0; 1]; - self.reader.read_exact(&mut buf)?; - if buf[0] != 0 && buf[0] != 1 { - return Err(DecodeError::InvalidValue); - } - Ok(buf[0] == 1) - } - pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), DecodeError> { - Ok(self.reader.read_exact(buf)?) - } - pub fn read_to_end(&mut self, buf: &mut Vec) -> Result { - Ok(self.reader.read_to_end(buf)?) - } -} - -macro_rules! impl_writeable_primitive { - ($val_type:ty, $meth_write:ident, $meth_read:ident) => { - impl Writeable for $val_type { - #[inline] - fn write(&self, writer: &mut Writer) -> Result<(), DecodeError> { - writer.$meth_write(*self) - } - } - impl Readable for $val_type { - #[inline] - fn read(reader: &mut Reader) -> Result<$val_type, DecodeError> { - reader.$meth_read() - } - } - } -} - -impl_writeable_primitive!(u64, write_u64, read_u64); -impl_writeable_primitive!(u32, write_u32, read_u32); -impl_writeable_primitive!(u16, write_u16, read_u16); -impl_writeable_primitive!(u8, write_u8, read_u8); -impl_writeable_primitive!(bool, write_bool, read_bool); - -// u8 arrays -macro_rules! impl_array { - ( $size:expr ) => ( - impl Writeable for [u8; $size] - where W: Write - { - #[inline] - fn write(&self, w: &mut Writer) -> Result<(), DecodeError> { - w.write_all(self)?; - Ok(()) - } - } - - impl Readable for [u8; $size] - where R: Read - { - #[inline] - fn read(r: &mut Reader) -> Result { - let mut buf = [0u8; $size]; - r.read_exact(&mut buf)?; - Ok(buf) - } - } - ); -} - -//TODO: performance issue with [u8; size] with impl_array!() -impl_array!(32); // for channel id & hmac -impl_array!(33); // for PublicKey -impl_array!(64); // for Signature -impl_array!(1300); // for OnionPacket.hop_data - -// HashMap -impl Writeable for HashMap - where W: Write, - K: Writeable + Eq + Hash, - V: Writeable -{ - #[inline] - fn write(&self, w: &mut Writer) -> Result<(), DecodeError> { - (self.len() as u16).write(w)?; - for (key, value) in self.iter() { - key.write(w)?; - value.write(w)?; - } - Ok(()) - } -} - -impl Readable for HashMap - where R: Read, - K: Readable + Eq + Hash, - V: Readable -{ - #[inline] - fn read(r: &mut Reader) -> Result { - let len: u16 = Readable::read(r)?; - let mut ret = HashMap::with_capacity(len as usize); - for _ in 0..len { - ret.insert(K::read(r)?, V::read(r)?); - } - Ok(ret) - } -} - -// Vectors -impl> Writeable for Vec { - #[inline] - fn write(&self, w: &mut Writer) -> Result<(), DecodeError> { - let byte_size = (self.len() as usize) - .checked_mul(mem::size_of::()) - .ok_or(DecodeError::BadLengthDescriptor)?; - if byte_size > MAX_BUF_SIZE { - return Err(DecodeError::BadLengthDescriptor); - } - (self.len() as u16).write(w)?; - // performance with Vec - for e in self.iter() { - e.write(w)?; - } - Ok(()) - } -} - -impl> Readable for Vec { - #[inline] - fn read(r: &mut Reader) -> Result { - let len: u16 = Readable::read(r)?; - let byte_size = (len as usize) - .checked_mul(mem::size_of::()) - .ok_or(DecodeError::BadLengthDescriptor)?; - if byte_size > MAX_BUF_SIZE { - return Err(DecodeError::BadLengthDescriptor); - } - let mut ret = Vec::with_capacity(len as usize); - for _ in 0..len { ret.push(T::read(r)?); } - Ok(ret) - } -} - -impl Writeable for Script { - fn write(&self, w: &mut Writer) -> Result<(), DecodeError> { - self.to_bytes().to_vec().write(w) - } -} - -impl Readable for Script { - fn read(r: &mut Reader) -> Result { - let len = >::read(r)? as usize; - let mut buf = vec![0; len]; - r.read_exact(&mut buf)?; - Ok(Script::from(buf)) - } -} - -impl Writeable for Option