Address custom HTLC TLV fixups
[rust-lightning] / lightning / src / util / ser.rs
index 1570e5aeea44de753460b1bfcb8523c00b690dfc..1eb5e7424c82343d0bb88aef7df632dc408563f0 100644 (file)
@@ -37,12 +37,14 @@ use bitcoin::hashes::sha256d::Hash as Sha256dHash;
 use bitcoin::hash_types::{Txid, BlockHash};
 use core::marker::Sized;
 use core::time::Duration;
+use crate::chain::ClaimId;
 use crate::ln::msgs::DecodeError;
 #[cfg(taproot)]
 use crate::ln::msgs::PartialSignatureWithNonce;
 use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret};
 
 use crate::util::byte_utils::{be48_to_array, slice_to_be48};
+use crate::util::string::UntrustedString;
 
 /// serialization buffer size
 pub const MAX_BUF_SIZE: usize = 64 * 1024;
@@ -356,6 +358,7 @@ impl Readable for U48 {
 /// encoded in several different ways, which we must check for at deserialization-time. Thus, if
 /// you're looking for an example of a variable-length integer to use for your own project, move
 /// along, this is a rather poor design.
+#[derive(Clone, Copy, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)]
 pub struct BigSize(pub u64);
 impl Writeable for BigSize {
        #[inline]
@@ -629,6 +632,21 @@ impl<'a> From<&'a String> for WithoutLength<&'a String> {
        fn from(s: &'a String) -> Self { Self(s) }
 }
 
+
+impl Writeable for WithoutLength<&UntrustedString> {
+       #[inline]
+       fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+               WithoutLength(&self.0.0).write(w)
+       }
+}
+impl Readable for WithoutLength<UntrustedString> {
+       #[inline]
+       fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
+               let s: WithoutLength<String> = Readable::read(r)?;
+               Ok(Self(UntrustedString(s.0)))
+       }
+}
+
 impl<'a, T: Writeable> Writeable for WithoutLength<&'a Vec<T>> {
        #[inline]
        fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
@@ -831,6 +849,7 @@ impl Readable for Vec<u8> {
 }
 
 impl_for_vec!(ecdsa::Signature);
+impl_for_vec!(crate::chain::channelmonitor::ChannelMonitorUpdate);
 impl_for_vec!(crate::ln::channelmanager::MonitorUpdateCompletionAction);
 impl_for_vec!((A, B), A, B);
 impl_writeable_for_vec!(&crate::routing::router::BlindedTail);
@@ -1333,6 +1352,7 @@ impl Readable for Hostname {
        }
 }
 
+/// This is not exported to bindings users as `Duration`s are simply mapped as ints.
 impl Writeable for Duration {
        #[inline]
        fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
@@ -1340,6 +1360,7 @@ impl Writeable for Duration {
                self.subsec_nanos().write(w)
        }
 }
+/// This is not exported to bindings users as `Duration`s are simply mapped as ints.
 impl Readable for Duration {
        #[inline]
        fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
@@ -1384,7 +1405,24 @@ impl Readable for TransactionU16LenLimited {
        fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
                let len = <u16 as Readable>::read(r)?;
                let mut tx_reader = FixedLengthReader::new(r, len as u64);
-               Ok(Self(Readable::read(&mut tx_reader)?))
+               let tx: Transaction = Readable::read(&mut tx_reader)?;
+               if tx_reader.bytes_remain() {
+                       Err(DecodeError::BadLengthDescriptor)
+               } else {
+                       Ok(Self(tx))
+               }
+       }
+}
+
+impl Writeable for ClaimId {
+       fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
+               self.0.write(writer)
+       }
+}
+
+impl Readable for ClaimId {
+       fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
+               Ok(Self(Readable::read(reader)?))
        }
 }