Skip to main content

lightning/util/
ser.rs

1// This file is Copyright its original authors, visible in version control
2// history.
3//
4// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7// You may not use this file except in accordance with one or both of these
8// licenses.
9
10//! A very simple serialization framework which is used to serialize/deserialize messages as well
11//! as [`ChannelManager`]s and [`ChannelMonitor`]s.
12//!
13//! [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
14//! [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
15
16use crate::io::{self, BufRead, Read, Write};
17use crate::io_extras::{copy, sink};
18use crate::ln::interactivetxs::{TxInMetadata, TxOutMetadata};
19use crate::ln::onion_utils::{HMAC_COUNT, HMAC_LEN, HOLD_TIME_LEN, MAX_HOPS};
20use crate::prelude::*;
21use crate::sync::{Mutex, RwLock};
22use core::cmp;
23use core::hash::Hash;
24use core::ops::Deref;
25
26use alloc::collections::BTreeMap;
27
28use bitcoin::absolute::LockTime as AbsoluteLockTime;
29use bitcoin::amount::{Amount, SignedAmount};
30use bitcoin::consensus::Encodable;
31use bitcoin::constants::ChainHash;
32use bitcoin::hash_types::{BlockHash, Txid};
33use bitcoin::hashes::hmac::Hmac;
34use bitcoin::hashes::sha256::Hash as Sha256;
35use bitcoin::hashes::sha256d::Hash as Sha256dHash;
36use bitcoin::script::{self, ScriptBuf};
37use bitcoin::secp256k1::constants::{
38	COMPACT_SIGNATURE_SIZE, PUBLIC_KEY_SIZE, SCHNORR_SIGNATURE_SIZE, SECRET_KEY_SIZE,
39};
40use bitcoin::secp256k1::ecdsa;
41use bitcoin::secp256k1::schnorr;
42use bitcoin::secp256k1::{PublicKey, SecretKey};
43use bitcoin::transaction::{OutPoint, Transaction, TxOut};
44use bitcoin::{consensus, Sequence, TxIn, Weight, Witness};
45
46use dnssec_prover::rr::Name;
47
48use crate::chain::ClaimId;
49#[cfg(taproot)]
50use crate::ln::msgs::PartialSignatureWithNonce;
51use crate::ln::msgs::{DecodeError, SerialId};
52use crate::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
53use crate::types::string::UntrustedString;
54use crate::util::byte_utils::{be48_to_array, slice_to_be48};
55
56use core::time::Duration;
57
58/// serialization buffer size
59pub const MAX_BUF_SIZE: usize = 64 * 1024;
60
61/// A simplified version of `std::io::Write` that exists largely for backwards compatibility.
62/// An impl is provided for any type that also impls `std::io::Write`.
63///
64/// This is not exported to bindings users as we only export serialization to/from byte arrays instead
65pub trait Writer {
66	/// Writes the given buf out. See std::io::Write::write_all for more
67	fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error>;
68}
69
70impl<W: Write> Writer for W {
71	#[inline]
72	fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error> {
73		<Self as io::Write>::write_all(self, buf)
74	}
75}
76
77// TODO: Drop this entirely if rust-bitcoin releases a version bump with https://github.com/rust-bitcoin/rust-bitcoin/pull/3173
78/// Wrap buffering support for implementations of Read.
79/// A [`Read`]er which keeps an internal buffer to avoid hitting the underlying stream directly for
80/// every read, implementing [`BufRead`].
81///
82/// In order to avoid reading bytes past the first object, and those bytes then ending up getting
83/// dropped, this BufReader operates in one-byte-increments.
84struct BufReader<'a, R: Read> {
85	inner: &'a mut R,
86	buf: [u8; 1],
87	is_consumed: bool,
88}
89
90impl<'a, R: Read> BufReader<'a, R> {
91	/// Creates a [`BufReader`] which will read from the given `inner`.
92	pub fn new(inner: &'a mut R) -> Self {
93		BufReader { inner, buf: [0; 1], is_consumed: true }
94	}
95}
96
97impl<'a, R: Read> Read for BufReader<'a, R> {
98	#[inline]
99	fn read(&mut self, output: &mut [u8]) -> io::Result<usize> {
100		if output.is_empty() {
101			return Ok(0);
102		}
103		let mut offset = 0;
104		if !self.is_consumed {
105			output[0] = self.buf[0];
106			self.is_consumed = true;
107			offset = 1;
108		}
109		self.inner.read(&mut output[offset..]).map(|len| len + offset)
110	}
111}
112
113impl<'a, R: Read> BufRead for BufReader<'a, R> {
114	#[inline]
115	fn fill_buf(&mut self) -> io::Result<&[u8]> {
116		debug_assert!(false, "rust-bitcoin doesn't actually use this");
117		if self.is_consumed {
118			let count = self.inner.read(&mut self.buf[..])?;
119			debug_assert!(count <= 1, "read gave us a garbage length");
120
121			// upon hitting EOF, assume the byte is already consumed
122			self.is_consumed = count == 0;
123		}
124
125		if self.is_consumed {
126			Ok(&[])
127		} else {
128			Ok(&self.buf[..])
129		}
130	}
131
132	#[inline]
133	fn consume(&mut self, amount: usize) {
134		debug_assert!(false, "rust-bitcoin doesn't actually use this");
135		if amount >= 1 {
136			debug_assert_eq!(amount, 1, "Can only consume one byte");
137			debug_assert!(!self.is_consumed, "Cannot consume more than had been read");
138			self.is_consumed = true;
139		}
140	}
141}
142
143pub(crate) struct WriterWriteAdaptor<'a, W: Writer + 'a>(pub &'a mut W);
144impl<'a, W: Writer + 'a> Write for WriterWriteAdaptor<'a, W> {
145	#[inline]
146	fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error> {
147		self.0.write_all(buf)
148	}
149	#[inline]
150	fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
151		self.0.write_all(buf)?;
152		Ok(buf.len())
153	}
154	#[inline]
155	fn flush(&mut self) -> Result<(), io::Error> {
156		Ok(())
157	}
158}
159
160pub(crate) struct VecWriter(pub Vec<u8>);
161impl Writer for VecWriter {
162	#[inline]
163	fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error> {
164		self.0.extend_from_slice(buf);
165		Ok(())
166	}
167}
168
169/// Writer that only tracks the amount of data written - useful if you need to calculate the length
170/// of some data when serialized but don't yet need the full data.
171///
172/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
173pub struct LengthCalculatingWriter(pub usize);
174impl Writer for LengthCalculatingWriter {
175	#[inline]
176	fn write_all(&mut self, buf: &[u8]) -> Result<(), io::Error> {
177		self.0 += buf.len();
178		Ok(())
179	}
180}
181
182/// Essentially `std::io::Take` but a bit simpler and with a method to walk the underlying stream
183/// forward to ensure we always consume exactly the fixed length specified.
184///
185/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
186pub struct FixedLengthReader<'a, R: Read> {
187	read: &'a mut R,
188	bytes_read: u64,
189	total_bytes: u64,
190}
191impl<'a, R: Read> FixedLengthReader<'a, R> {
192	/// Returns a new [`FixedLengthReader`].
193	pub fn new(read: &'a mut R, total_bytes: u64) -> Self {
194		Self { read, bytes_read: 0, total_bytes }
195	}
196
197	/// Returns whether some bytes are remaining or not.
198	#[inline]
199	pub fn bytes_remain(&mut self) -> bool {
200		self.bytes_read != self.total_bytes
201	}
202
203	/// Consumes the remaining bytes.
204	#[inline]
205	pub fn eat_remaining(&mut self) -> Result<(), DecodeError> {
206		copy(self, &mut sink()).unwrap();
207		if self.bytes_read != self.total_bytes {
208			Err(DecodeError::ShortRead)
209		} else {
210			Ok(())
211		}
212	}
213}
214impl<'a, R: Read> Read for FixedLengthReader<'a, R> {
215	#[inline]
216	fn read(&mut self, dest: &mut [u8]) -> Result<usize, io::Error> {
217		if self.total_bytes == self.bytes_read {
218			Ok(0)
219		} else {
220			let read_len = cmp::min(dest.len() as u64, self.total_bytes - self.bytes_read);
221			match self.read.read(&mut dest[0..(read_len as usize)]) {
222				Ok(v) => {
223					self.bytes_read += v as u64;
224					Ok(v)
225				},
226				Err(e) => Err(e),
227			}
228		}
229	}
230}
231
232/// This is not exported to bindings users as reads are always from byte arrays, never streams, in
233/// bindings.
234impl<'a, R: Read> LengthLimitedRead for FixedLengthReader<'a, R> {
235	#[inline]
236	fn remaining_bytes(&self) -> u64 {
237		self.total_bytes.saturating_sub(self.bytes_read)
238	}
239}
240
241/// A [`Read`] implementation which tracks whether any bytes have been read at all. This allows us to distinguish
242/// between "EOF reached before we started" and "EOF reached mid-read".
243///
244/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
245pub struct ReadTrackingReader<'a, R: Read> {
246	read: &'a mut R,
247	/// Returns whether we have read from this reader or not yet.
248	pub have_read: bool,
249}
250impl<'a, R: Read> ReadTrackingReader<'a, R> {
251	/// Returns a new [`ReadTrackingReader`].
252	pub fn new(read: &'a mut R) -> Self {
253		Self { read, have_read: false }
254	}
255}
256impl<'a, R: Read> Read for ReadTrackingReader<'a, R> {
257	#[inline]
258	fn read(&mut self, dest: &mut [u8]) -> Result<usize, io::Error> {
259		match self.read.read(dest) {
260			Ok(0) => Ok(0),
261			Ok(len) => {
262				self.have_read = true;
263				Ok(len)
264			},
265			Err(e) => Err(e),
266		}
267	}
268}
269
270/// A trait that various LDK types implement allowing them to be written out to a [`Writer`].
271///
272/// This is not exported to bindings users as we only export serialization to/from byte arrays instead
273pub trait Writeable {
274	/// Writes `self` out to the given [`Writer`].
275	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error>;
276
277	/// Writes `self` out to a `Vec<u8>`.
278	fn encode(&self) -> Vec<u8> {
279		let len = self.serialized_length();
280		let mut msg = VecWriter(Vec::with_capacity(len));
281		self.write(&mut msg).unwrap();
282		// Note that objects with interior mutability may change size between when we called
283		// serialized_length and when we called write. That's okay, but shouldn't happen during
284		// testing as most of our tests are not threaded.
285		#[cfg(test)]
286		debug_assert_eq!(len, msg.0.len());
287		msg.0
288	}
289
290	/// Writes `self` out to a `Vec<u8>`.
291	#[cfg(test)]
292	fn encode_with_len(&self) -> Vec<u8> {
293		let mut msg = VecWriter(Vec::new());
294		0u16.write(&mut msg).unwrap();
295		self.write(&mut msg).unwrap();
296		let len = msg.0.len();
297		debug_assert_eq!(len - 2, self.serialized_length());
298		msg.0[..2].copy_from_slice(&(len as u16 - 2).to_be_bytes());
299		msg.0
300	}
301
302	/// Gets the length of this object after it has been serialized. This can be overridden to
303	/// optimize cases where we prepend an object with its length.
304	// Note that LLVM optimizes this away in most cases! Check that it isn't before you override!
305	#[inline]
306	fn serialized_length(&self) -> usize {
307		let mut len_calc = LengthCalculatingWriter(0);
308		self.write(&mut len_calc).expect("No in-memory data may fail to serialize");
309		len_calc.0
310	}
311}
312
313impl<'a, T: Writeable> Writeable for &'a T {
314	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
315		(*self).write(writer)
316	}
317}
318
319/// A trait that various LDK types implement allowing them to be read in from a [`Read`].
320///
321/// This is not exported to bindings users as we only export serialization to/from byte arrays instead
322pub trait Readable
323where
324	Self: Sized,
325{
326	/// Reads a `Self` in from the given [`Read`].
327	fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError>;
328}
329
330/// A trait that various LDK types implement allowing them to be read in from a
331/// [`io::Cursor`].
332pub(crate) trait CursorReadable
333where
334	Self: Sized,
335{
336	/// Reads a `Self` in from the given [`Read`].
337	fn read<R: AsRef<[u8]>>(reader: &mut io::Cursor<R>) -> Result<Self, DecodeError>;
338}
339
340/// A trait that various higher-level LDK types implement allowing them to be read in
341/// from a [`Read`] given some additional set of arguments which is required to deserialize.
342///
343/// This is not exported to bindings users as we only export serialization to/from byte arrays instead
344pub trait ReadableArgs<P>
345where
346	Self: Sized,
347{
348	/// Reads a `Self` in from the given [`Read`].
349	fn read<R: Read>(reader: &mut R, params: P) -> Result<Self, DecodeError>;
350}
351
352/// A [`io::Read`] that limits the amount of bytes that can be read. Implementations should ensure
353/// that the object being read will only consume a fixed number of bytes from the underlying
354/// [`io::Read`], see [`FixedLengthReader`] for an example.
355///
356/// This is not exported to bindings users as reads are always from byte arrays, never streams, in
357/// bindings.
358pub trait LengthLimitedRead: Read {
359	/// The number of bytes remaining to be read.
360	fn remaining_bytes(&self) -> u64;
361}
362
363impl LengthLimitedRead for &[u8] {
364	fn remaining_bytes(&self) -> u64 {
365		// The underlying `Read` implementation for slice updates the slice to point to the yet unread
366		// part.
367		self.len() as u64
368	}
369}
370
371/// Similar to [`LengthReadable`]. Useful when an additional set of arguments is required to
372/// deserialize.
373pub(crate) trait LengthReadableArgs<P>
374where
375	Self: Sized,
376{
377	/// Reads a `Self` in from the given [`LengthLimitedRead`].
378	fn read<R: LengthLimitedRead>(reader: &mut R, params: P) -> Result<Self, DecodeError>;
379}
380
381/// A trait that allows the implementer to be read in from a [`LengthLimitedRead`], requiring the
382/// reader to limit the number of total bytes read from its underlying [`Read`]. Useful for structs
383/// that will always consume the entire provided [`Read`] when deserializing.
384///
385/// Any type that implements [`Readable`] also automatically has a [`LengthReadable`]
386/// implementation, but some types, most notably onion packets, only implement [`LengthReadable`].
387///
388/// This is not exported to bindings users as reads are always from byte arrays, never streams, in
389/// bindings.
390pub trait LengthReadable
391where
392	Self: Sized,
393{
394	/// Reads a `Self` in from the given [`LengthLimitedRead`].
395	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
396		reader: &mut R,
397	) -> Result<Self, DecodeError>;
398}
399
400impl<T: Readable> LengthReadable for T {
401	#[inline]
402	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
403		reader: &mut R,
404	) -> Result<T, DecodeError> {
405		Readable::read(reader)
406	}
407}
408
409/// A trait that various LDK types implement allowing them to (maybe) be read in from a [`Read`].
410///
411/// This is not exported to bindings users as we only export serialization to/from byte arrays instead
412pub trait MaybeReadable
413where
414	Self: Sized,
415{
416	/// Reads a `Self` in from the given [`Read`].
417	fn read<R: Read>(reader: &mut R) -> Result<Option<Self>, DecodeError>;
418}
419
420impl<T: Readable> MaybeReadable for T {
421	#[inline]
422	fn read<R: Read>(reader: &mut R) -> Result<Option<T>, DecodeError> {
423		Ok(Some(Readable::read(reader)?))
424	}
425}
426
427/// Wrapper to read a required (non-optional) TLV record.
428///
429/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
430pub struct RequiredWrapper<T>(pub Option<T>);
431impl<T: LengthReadable> LengthReadable for RequiredWrapper<T> {
432	#[inline]
433	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
434		reader: &mut R,
435	) -> Result<Self, DecodeError> {
436		Ok(Self(Some(LengthReadable::read_from_fixed_length_buffer(reader)?)))
437	}
438}
439impl<A, T: ReadableArgs<A>> ReadableArgs<A> for RequiredWrapper<T> {
440	#[inline]
441	fn read<R: Read>(reader: &mut R, args: A) -> Result<Self, DecodeError> {
442		Ok(Self(Some(ReadableArgs::read(reader, args)?)))
443	}
444}
445/// When handling `default_values`, we want to map the default-value T directly
446/// to a `RequiredWrapper<T>` in a way that works for `field: T = t;` as
447/// well. Thus, we assume `Into<T> for T` does nothing and use that.
448impl<T> From<T> for RequiredWrapper<T> {
449	fn from(t: T) -> RequiredWrapper<T> {
450		RequiredWrapper(Some(t))
451	}
452}
453impl<T: Clone> Clone for RequiredWrapper<T> {
454	fn clone(&self) -> Self {
455		Self(self.0.clone())
456	}
457}
458impl<T: Copy> Copy for RequiredWrapper<T> {}
459
460/// Wrapper to read a required (non-optional) TLV record that may have been upgraded without
461/// backwards compat.
462///
463/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
464pub struct UpgradableRequired<T: MaybeReadable>(pub Option<T>);
465impl<T: MaybeReadable> MaybeReadable for UpgradableRequired<T> {
466	#[inline]
467	fn read<R: Read>(reader: &mut R) -> Result<Option<Self>, DecodeError> {
468		let tlv = MaybeReadable::read(reader)?;
469		if let Some(tlv) = tlv {
470			return Ok(Some(Self(Some(tlv))));
471		}
472		Ok(None)
473	}
474}
475
476pub(crate) struct U48(pub u64);
477impl Writeable for U48 {
478	#[inline]
479	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
480		writer.write_all(&be48_to_array(self.0))
481	}
482}
483impl Readable for U48 {
484	#[inline]
485	fn read<R: Read>(reader: &mut R) -> Result<U48, DecodeError> {
486		let mut buf = [0; 6];
487		reader.read_exact(&mut buf)?;
488		Ok(U48(slice_to_be48(&buf)))
489	}
490}
491
492/// Lightning TLV uses a custom variable-length integer called `BigSize`. It is similar to Bitcoin's
493/// variable-length integers except that it is serialized in big-endian instead of little-endian.
494///
495/// Like Bitcoin's variable-length integer, it exhibits ambiguity in that certain values can be
496/// encoded in several different ways, which we must check for at deserialization-time. Thus, if
497/// you're looking for an example of a variable-length integer to use for your own project, move
498/// along, this is a rather poor design.
499#[derive(Clone, Copy, Debug, Hash, PartialOrd, Ord, PartialEq, Eq)]
500pub struct BigSize(pub u64);
501impl Writeable for BigSize {
502	#[inline]
503	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
504		match self.0 {
505			0..=0xFC => (self.0 as u8).write(writer),
506			0xFD..=0xFFFF => {
507				0xFDu8.write(writer)?;
508				(self.0 as u16).write(writer)
509			},
510			0x10000..=0xFFFFFFFF => {
511				0xFEu8.write(writer)?;
512				(self.0 as u32).write(writer)
513			},
514			_ => {
515				0xFFu8.write(writer)?;
516				(self.0 as u64).write(writer)
517			},
518		}
519	}
520}
521impl Readable for BigSize {
522	#[inline]
523	fn read<R: Read>(reader: &mut R) -> Result<BigSize, DecodeError> {
524		let n: u8 = Readable::read(reader)?;
525		match n {
526			0xFF => {
527				let x: u64 = Readable::read(reader)?;
528				if x < 0x100000000 {
529					Err(DecodeError::InvalidValue)
530				} else {
531					Ok(BigSize(x))
532				}
533			},
534			0xFE => {
535				let x: u32 = Readable::read(reader)?;
536				if x < 0x10000 {
537					Err(DecodeError::InvalidValue)
538				} else {
539					Ok(BigSize(x as u64))
540				}
541			},
542			0xFD => {
543				let x: u16 = Readable::read(reader)?;
544				if x < 0xFD {
545					Err(DecodeError::InvalidValue)
546				} else {
547					Ok(BigSize(x as u64))
548				}
549			},
550			n => Ok(BigSize(n as u64)),
551		}
552	}
553}
554
555/// The lightning protocol uses u16s for lengths in most cases. As our serialization framework
556/// primarily targets that, we must as well. However, because we may serialize objects that have
557/// more than 65K entries, we need to be able to store larger values. Thus, we define a variable
558/// length integer here that is backwards-compatible for values < 0xffff. We treat 0xffff as
559/// "read eight more bytes".
560///
561/// To ensure we only have one valid encoding per value, we add 0xffff to values written as eight
562/// bytes. Thus, 0xfffe is serialized as 0xfffe, whereas 0xffff is serialized as
563/// 0xffff0000000000000000 (i.e. read-eight-bytes then zero).
564pub struct CollectionLength(pub u64);
565impl Writeable for CollectionLength {
566	#[inline]
567	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
568		if self.0 < 0xffff {
569			(self.0 as u16).write(writer)
570		} else {
571			0xffffu16.write(writer)?;
572			(self.0 - 0xffff).write(writer)
573		}
574	}
575}
576
577impl Readable for CollectionLength {
578	#[inline]
579	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
580		let mut val: u64 = <u16 as Readable>::read(r)? as u64;
581		if val == 0xffff {
582			val =
583				<u64 as Readable>::read(r)?.checked_add(0xffff).ok_or(DecodeError::InvalidValue)?;
584		}
585		Ok(CollectionLength(val))
586	}
587}
588
589/// In TLV we occasionally send fields which only consist of, or potentially end with, a
590/// variable-length integer which is simply truncated by skipping high zero bytes. This type
591/// encapsulates such integers implementing [`Readable`]/[`Writeable`] for them.
592#[cfg_attr(test, derive(PartialEq, Eq, Debug))]
593pub(crate) struct HighZeroBytesDroppedBigSize<T>(pub T);
594
595macro_rules! impl_writeable_primitive {
596	($val_type:ty, $len: expr) => {
597		impl Writeable for $val_type {
598			#[inline]
599			fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
600				writer.write_all(&self.to_be_bytes())
601			}
602		}
603		impl Writeable for HighZeroBytesDroppedBigSize<$val_type> {
604			#[inline]
605			fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
606				// Skip any full leading 0 bytes when writing (in BE):
607				writer.write_all(&self.0.to_be_bytes()[(self.0.leading_zeros() / 8) as usize..$len])
608			}
609		}
610		impl Readable for $val_type {
611			#[inline]
612			fn read<R: Read>(reader: &mut R) -> Result<$val_type, DecodeError> {
613				let mut buf = [0; $len];
614				reader.read_exact(&mut buf)?;
615				Ok(<$val_type>::from_be_bytes(buf))
616			}
617		}
618		impl Readable for HighZeroBytesDroppedBigSize<$val_type> {
619			#[inline]
620			fn read<R: Read>(
621				reader: &mut R,
622			) -> Result<HighZeroBytesDroppedBigSize<$val_type>, DecodeError> {
623				// We need to accept short reads (read_len == 0) as "EOF" and handle them as simply
624				// the high bytes being dropped. To do so, we start reading into the middle of buf
625				// and then convert the appropriate number of bytes with extra high bytes out of
626				// buf.
627				let mut buf = [0; $len * 2];
628				let mut read_len = reader.read(&mut buf[$len..])?;
629				let mut total_read_len = read_len;
630				while read_len != 0 && total_read_len != $len {
631					read_len = reader.read(&mut buf[($len + total_read_len)..])?;
632					total_read_len += read_len;
633				}
634				if total_read_len == 0 || buf[$len] != 0 {
635					let first_byte = $len - ($len - total_read_len);
636					let mut bytes = [0; $len];
637					bytes.copy_from_slice(&buf[first_byte..first_byte + $len]);
638					Ok(HighZeroBytesDroppedBigSize(<$val_type>::from_be_bytes(bytes)))
639				} else {
640					// If the encoding had extra zero bytes, return a failure even though we know
641					// what they meant (as the TLV test vectors require this)
642					Err(DecodeError::InvalidValue)
643				}
644			}
645		}
646		impl From<$val_type> for HighZeroBytesDroppedBigSize<$val_type> {
647			fn from(val: $val_type) -> Self {
648				Self(val)
649			}
650		}
651	};
652}
653
654impl_writeable_primitive!(u128, 16);
655impl_writeable_primitive!(u64, 8);
656impl_writeable_primitive!(u32, 4);
657impl_writeable_primitive!(u16, 2);
658impl_writeable_primitive!(i64, 8);
659impl_writeable_primitive!(i32, 4);
660impl_writeable_primitive!(i16, 2);
661impl_writeable_primitive!(i8, 1);
662
663impl Writeable for u8 {
664	#[inline]
665	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
666		writer.write_all(&[*self])
667	}
668}
669impl Readable for u8 {
670	#[inline]
671	fn read<R: Read>(reader: &mut R) -> Result<u8, DecodeError> {
672		let mut buf = [0; 1];
673		reader.read_exact(&mut buf)?;
674		Ok(buf[0])
675	}
676}
677
678impl Writeable for bool {
679	#[inline]
680	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
681		writer.write_all(&[if *self { 1 } else { 0 }])
682	}
683}
684impl Readable for bool {
685	#[inline]
686	fn read<R: Read>(reader: &mut R) -> Result<bool, DecodeError> {
687		let mut buf = [0; 1];
688		reader.read_exact(&mut buf)?;
689		if buf[0] != 0 && buf[0] != 1 {
690			return Err(DecodeError::InvalidValue);
691		}
692		Ok(buf[0] == 1)
693	}
694}
695
696macro_rules! impl_array {
697	($size:expr, $ty: ty) => {
698		impl Writeable for [$ty; $size] {
699			#[inline]
700			fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
701				let mut out = [0; $size * core::mem::size_of::<$ty>()];
702				for (idx, v) in self.iter().enumerate() {
703					let startpos = idx * core::mem::size_of::<$ty>();
704					out[startpos..startpos + core::mem::size_of::<$ty>()]
705						.copy_from_slice(&v.to_be_bytes());
706				}
707				w.write_all(&out)
708			}
709		}
710
711		impl Readable for [$ty; $size] {
712			#[inline]
713			fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
714				let mut buf = [0u8; $size * core::mem::size_of::<$ty>()];
715				r.read_exact(&mut buf)?;
716				let mut res = [0; $size];
717				for (idx, v) in res.iter_mut().enumerate() {
718					let startpos = idx * core::mem::size_of::<$ty>();
719					let mut arr = [0; core::mem::size_of::<$ty>()];
720					arr.copy_from_slice(&buf[startpos..startpos + core::mem::size_of::<$ty>()]);
721					*v = <$ty>::from_be_bytes(arr);
722				}
723				Ok(res)
724			}
725		}
726	};
727}
728
729impl_array!(3, u8); // for rgb, ISO 4217 code
730impl_array!(4, u8); // for IPv4
731impl_array!(12, u8); // for OnionV2
732impl_array!(16, u8); // for IPv6
733impl_array!(32, u8); // for channel id & hmac
734impl_array!(PUBLIC_KEY_SIZE, u8); // for PublicKey
735impl_array!(64, u8); // for ecdsa::Signature and schnorr::Signature
736impl_array!(66, u8); // for MuSig2 nonces
737impl_array!(1300, u8); // for OnionPacket.hop_data
738
739impl_array!(8, u16);
740impl_array!(32, u16);
741
742// Implement array serialization for attribution_data.
743impl_array!(MAX_HOPS * HOLD_TIME_LEN, u8);
744impl_array!(HMAC_LEN * HMAC_COUNT, u8);
745
746/// A type for variable-length values within TLV record where the length is encoded as part of the record.
747/// Used to prevent encoding the length twice.
748///
749/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
750pub struct WithoutLength<T>(pub T);
751
752impl Writeable for WithoutLength<&String> {
753	#[inline]
754	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
755		w.write_all(self.0.as_bytes())
756	}
757}
758impl LengthReadable for WithoutLength<String> {
759	#[inline]
760	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
761		let v: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(r)?;
762		Ok(Self(String::from_utf8(v.0).map_err(|_| DecodeError::InvalidValue)?))
763	}
764}
765impl<'a> From<&'a String> for WithoutLength<&'a String> {
766	fn from(s: &'a String) -> Self {
767		Self(s)
768	}
769}
770
771impl Writeable for UntrustedString {
772	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
773		self.0.write(w)
774	}
775}
776
777impl Readable for UntrustedString {
778	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
779		let s: String = Readable::read(r)?;
780		Ok(Self(s))
781	}
782}
783
784impl Writeable for WithoutLength<&UntrustedString> {
785	#[inline]
786	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
787		WithoutLength(&self.0 .0).write(w)
788	}
789}
790impl LengthReadable for WithoutLength<UntrustedString> {
791	#[inline]
792	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
793		let s: WithoutLength<String> = LengthReadable::read_from_fixed_length_buffer(r)?;
794		Ok(Self(UntrustedString(s.0)))
795	}
796}
797
798trait AsWriteableSlice {
799	type Inner: Writeable;
800	fn as_slice(&self) -> &[Self::Inner];
801}
802
803impl<T: Writeable> AsWriteableSlice for &Vec<T> {
804	type Inner = T;
805	fn as_slice(&self) -> &[T] {
806		&self
807	}
808}
809impl<T: Writeable> AsWriteableSlice for &[T] {
810	type Inner = T;
811	fn as_slice(&self) -> &[T] {
812		&self
813	}
814}
815
816impl<S: AsWriteableSlice> Writeable for WithoutLength<S> {
817	#[inline]
818	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
819		for ref v in self.0.as_slice() {
820			v.write(writer)?;
821		}
822		Ok(())
823	}
824}
825
826impl<T: MaybeReadable> LengthReadable for WithoutLength<Vec<T>> {
827	#[inline]
828	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
829		reader: &mut R,
830	) -> Result<Self, DecodeError> {
831		let mut values = Vec::new();
832		loop {
833			let mut track_read = ReadTrackingReader::new(reader);
834			match MaybeReadable::read(&mut track_read) {
835				Ok(Some(v)) => {
836					values.push(v);
837				},
838				Ok(None) => {},
839				// If we failed to read any bytes at all, we reached the end of our TLV
840				// stream and have simply exhausted all entries.
841				Err(ref e) if e == &DecodeError::ShortRead && !track_read.have_read => break,
842				Err(e) => return Err(e),
843			}
844		}
845		Ok(Self(values))
846	}
847}
848impl<'a, T> From<&'a Vec<T>> for WithoutLength<&'a Vec<T>> {
849	fn from(v: &'a Vec<T>) -> Self {
850		Self(v)
851	}
852}
853
854impl Writeable for WithoutLength<&ScriptBuf> {
855	#[inline]
856	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
857		writer.write_all(self.0.as_bytes())
858	}
859}
860
861impl LengthReadable for WithoutLength<ScriptBuf> {
862	#[inline]
863	fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
864		let v: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(r)?;
865		Ok(WithoutLength(script::Builder::from(v.0).into_script()))
866	}
867}
868
869#[derive(Debug)]
870pub(crate) struct Iterable<'a, I: Iterator<Item = &'a T> + Clone, T: 'a>(pub I);
871
872impl<'a, I: Iterator<Item = &'a T> + Clone, T: 'a + Writeable> Writeable for Iterable<'a, I, T> {
873	#[inline]
874	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
875		for ref v in self.0.clone() {
876			v.write(writer)?;
877		}
878		Ok(())
879	}
880}
881
882#[cfg(test)]
883impl<'a, I: Iterator<Item = &'a T> + Clone, T: 'a + PartialEq> PartialEq for Iterable<'a, I, T> {
884	fn eq(&self, other: &Self) -> bool {
885		self.0.clone().collect::<Vec<_>>() == other.0.clone().collect::<Vec<_>>()
886	}
887}
888
889#[derive(Debug)]
890pub(crate) struct IterableOwned<I: Iterator<Item = T> + Clone, T>(pub I);
891
892impl<I: Iterator<Item = T> + Clone, T: Writeable> Writeable for IterableOwned<I, T> {
893	#[inline]
894	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
895		for ref v in self.0.clone() {
896			v.write(writer)?;
897		}
898		Ok(())
899	}
900}
901
902macro_rules! impl_for_map {
903	($ty: ident, $keybound: ident, $constr: expr) => {
904		impl<K, V> Writeable for $ty<K, V>
905		where
906			K: Writeable + Eq + $keybound,
907			V: Writeable,
908		{
909			#[inline]
910			fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
911				CollectionLength(self.len() as u64).write(w)?;
912				for (key, value) in self.iter() {
913					key.write(w)?;
914					value.write(w)?;
915				}
916				Ok(())
917			}
918		}
919
920		impl<K, V> Readable for $ty<K, V>
921		where
922			K: Readable + Eq + $keybound,
923			V: MaybeReadable,
924		{
925			#[inline]
926			fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
927				let len: CollectionLength = Readable::read(r)?;
928				let entry_size = ::core::mem::size_of::<K>() + ::core::mem::size_of::<V>();
929				let max_alloc = MAX_BUF_SIZE / (entry_size + 1);
930				let mut ret = $constr(cmp::min(len.0 as usize, max_alloc));
931				for _ in 0..len.0 {
932					let k = K::read(r)?;
933					let v_opt = V::read(r)?;
934					if let Some(v) = v_opt {
935						if ret.insert(k, v).is_some() {
936							return Err(DecodeError::InvalidValue);
937						}
938					}
939				}
940				Ok(ret)
941			}
942		}
943	};
944}
945
946impl_for_map!(BTreeMap, Ord, |_| BTreeMap::new());
947impl_for_map!(HashMap, Hash, |len| hash_map_with_capacity(len));
948
949// HashSet
950impl<T> Writeable for HashSet<T>
951where
952	T: Writeable + Eq + Hash,
953{
954	#[inline]
955	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
956		CollectionLength(self.len() as u64).write(w)?;
957		for item in self.iter() {
958			item.write(w)?;
959		}
960		Ok(())
961	}
962}
963
964impl<T> Readable for HashSet<T>
965where
966	T: Readable + Eq + Hash,
967{
968	#[inline]
969	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
970		let len: CollectionLength = Readable::read(r)?;
971		let mut ret = hash_set_with_capacity(cmp::min(
972			len.0 as usize,
973			MAX_BUF_SIZE / core::mem::size_of::<T>(),
974		));
975		for _ in 0..len.0 {
976			if !ret.insert(T::read(r)?) {
977				return Err(DecodeError::InvalidValue);
978			}
979		}
980		Ok(ret)
981	}
982}
983
984// Vectors
985macro_rules! impl_writeable_for_vec {
986	($ty: ty $(, $name: ident)*) => {
987		impl<$($name : Writeable),*> Writeable for Vec<$ty> {
988			#[inline]
989			fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
990				CollectionLength(self.len() as u64).write(w)?;
991				for elem in self.iter() {
992					elem.write(w)?;
993				}
994				Ok(())
995			}
996		}
997	}
998}
999macro_rules! impl_readable_for_vec {
1000	($ty: ty $(, $name: ident)*) => {
1001		impl<$($name : Readable),*> Readable for Vec<$ty> {
1002			#[inline]
1003			fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1004				let len: CollectionLength = Readable::read(r)?;
1005				let mut ret = Vec::with_capacity(cmp::min(len.0 as usize, MAX_BUF_SIZE / core::mem::size_of::<$ty>()));
1006				for _ in 0..len.0 {
1007					if let Some(val) = MaybeReadable::read(r)? {
1008						ret.push(val);
1009					}
1010				}
1011				Ok(ret)
1012			}
1013		}
1014	}
1015}
1016macro_rules! impl_for_vec {
1017	($ty: ty $(, $name: ident)*) => {
1018		impl_writeable_for_vec!($ty $(, $name)*);
1019		impl_readable_for_vec!($ty $(, $name)*);
1020	}
1021}
1022
1023// Alternatives to impl_writeable_for_vec/impl_readable_for_vec that add a length prefix to each
1024// element in the Vec. Intended to be used when elements have variable lengths.
1025macro_rules! impl_writeable_for_vec_with_element_length_prefix {
1026	($ty: ty $(, $name: ident)*) => {
1027		impl<$($name : Writeable),*> Writeable for Vec<$ty> {
1028			#[inline]
1029			fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1030				CollectionLength(self.len() as u64).write(w)?;
1031				for elem in self.iter() {
1032					CollectionLength(elem.serialized_length() as u64).write(w)?;
1033					elem.write(w)?;
1034				}
1035				Ok(())
1036			}
1037		}
1038	}
1039}
1040macro_rules! impl_readable_for_vec_with_element_length_prefix {
1041	($ty: ty $(, $name: ident)*) => {
1042		impl<$($name : Readable),*> Readable for Vec<$ty> {
1043			#[inline]
1044			fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1045				let len: CollectionLength = Readable::read(r)?;
1046				let mut ret = Vec::with_capacity(cmp::min(len.0 as usize, MAX_BUF_SIZE / core::mem::size_of::<$ty>()));
1047				for _ in 0..len.0 {
1048					let elem_len: CollectionLength = Readable::read(r)?;
1049					let mut elem_reader = FixedLengthReader::new(r, elem_len.0);
1050					ret.push(LengthReadable::read_from_fixed_length_buffer(&mut elem_reader)?);
1051				}
1052				Ok(ret)
1053			}
1054		}
1055	}
1056}
1057macro_rules! impl_for_vec_with_element_length_prefix {
1058	($ty: ty $(, $name: ident)*) => {
1059		impl_writeable_for_vec_with_element_length_prefix!($ty $(, $name)*);
1060		impl_readable_for_vec_with_element_length_prefix!($ty $(, $name)*);
1061	}
1062}
1063
1064impl Writeable for Vec<u8> {
1065	#[inline]
1066	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1067		CollectionLength(self.len() as u64).write(w)?;
1068		w.write_all(&self)
1069	}
1070}
1071
1072impl Readable for Vec<u8> {
1073	#[inline]
1074	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1075		let mut len: CollectionLength = Readable::read(r)?;
1076		let mut ret = Vec::new();
1077		while len.0 > 0 {
1078			let readamt = cmp::min(len.0 as usize, MAX_BUF_SIZE);
1079			let readstart = ret.len();
1080			ret.resize(readstart + readamt, 0);
1081			r.read_exact(&mut ret[readstart..])?;
1082			len.0 -= readamt as u64;
1083		}
1084		Ok(ret)
1085	}
1086}
1087
1088impl_for_vec!(ecdsa::Signature);
1089impl_for_vec!(crate::chain::channelmonitor::ChannelMonitorUpdate);
1090impl_for_vec!(crate::ln::channelmanager::MonitorUpdateCompletionAction);
1091impl_for_vec!(crate::ln::channelmanager::PaymentClaimDetails);
1092impl_for_vec!(crate::ln::msgs::SocketAddress);
1093impl_for_vec!((A, B), A, B);
1094impl_for_vec!(SerialId);
1095impl_for_vec!(TxInMetadata);
1096impl_for_vec!(TxOutMetadata);
1097impl_for_vec!(crate::ln::our_peer_storage::PeerStorageMonitorHolder);
1098impl_for_vec!(crate::blinded_path::message::BlindedMessagePath);
1099impl_writeable_for_vec!(&crate::routing::router::BlindedTail);
1100impl_readable_for_vec!(crate::routing::router::BlindedTail);
1101impl_for_vec!(crate::routing::router::TrampolineHop);
1102impl_for_vec_with_element_length_prefix!(crate::ln::msgs::UpdateAddHTLC);
1103impl_writeable_for_vec_with_element_length_prefix!(&crate::ln::msgs::UpdateAddHTLC);
1104impl_for_vec!(u32);
1105
1106impl Writeable for Vec<Witness> {
1107	#[inline]
1108	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1109		(self.len() as u16).write(w)?;
1110		for witness in self {
1111			(witness.size() as u16).write(w)?;
1112			witness.write(w)?;
1113		}
1114		Ok(())
1115	}
1116}
1117
1118impl Readable for Vec<Witness> {
1119	#[inline]
1120	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1121		let num_witnesses = <u16 as Readable>::read(r)? as usize;
1122		let mut witnesses = Vec::with_capacity(num_witnesses);
1123		for _ in 0..num_witnesses {
1124			// Even though the length of each witness can be inferred in its consensus-encoded form,
1125			// the spec includes a length prefix so that implementations don't have to deserialize
1126			//  each initially. We do that here anyway as in general we'll need to be able to make
1127			// assertions on some properties of the witnesses when receiving a message providing a list
1128			// of witnesses. We'll just do a sanity check for the lengths and error if there is a mismatch.
1129			let witness_len = <u16 as Readable>::read(r)? as usize;
1130			let witness = <Witness as Readable>::read(r)?;
1131			if witness.size() != witness_len {
1132				return Err(DecodeError::BadLengthDescriptor);
1133			}
1134			witnesses.push(witness);
1135		}
1136		Ok(witnesses)
1137	}
1138}
1139
1140impl Writeable for ScriptBuf {
1141	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1142		(self.len() as u16).write(w)?;
1143		w.write_all(self.as_bytes())
1144	}
1145}
1146
1147impl Readable for ScriptBuf {
1148	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1149		let len = <u16 as Readable>::read(r)? as usize;
1150		let mut buf = vec![0; len];
1151		r.read_exact(&mut buf)?;
1152		Ok(ScriptBuf::from(buf))
1153	}
1154}
1155
1156impl Writeable for PublicKey {
1157	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1158		self.serialize().write(w)
1159	}
1160	#[inline]
1161	fn serialized_length(&self) -> usize {
1162		PUBLIC_KEY_SIZE
1163	}
1164}
1165
1166impl Readable for PublicKey {
1167	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1168		let buf: [u8; PUBLIC_KEY_SIZE] = Readable::read(r)?;
1169		match PublicKey::from_slice(&buf) {
1170			Ok(key) => Ok(key),
1171			Err(_) => return Err(DecodeError::InvalidValue),
1172		}
1173	}
1174}
1175
1176impl Writeable for SecretKey {
1177	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1178		let mut ser = [0; SECRET_KEY_SIZE];
1179		ser.copy_from_slice(&self[..]);
1180		ser.write(w)
1181	}
1182	#[inline]
1183	fn serialized_length(&self) -> usize {
1184		SECRET_KEY_SIZE
1185	}
1186}
1187
1188impl Readable for SecretKey {
1189	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1190		let buf: [u8; SECRET_KEY_SIZE] = Readable::read(r)?;
1191		match SecretKey::from_slice(&buf) {
1192			Ok(key) => Ok(key),
1193			Err(_) => return Err(DecodeError::InvalidValue),
1194		}
1195	}
1196}
1197
1198#[cfg(taproot)]
1199impl Writeable for musig2::types::PublicNonce {
1200	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1201		self.serialize().write(w)
1202	}
1203}
1204
1205#[cfg(taproot)]
1206impl Readable for musig2::types::PublicNonce {
1207	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1208		let buf: [u8; PUBLIC_KEY_SIZE * 2] = Readable::read(r)?;
1209		musig2::types::PublicNonce::from_slice(&buf).map_err(|_| DecodeError::InvalidValue)
1210	}
1211}
1212
1213#[cfg(taproot)]
1214impl Writeable for PartialSignatureWithNonce {
1215	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1216		self.0.serialize().write(w)?;
1217		self.1.write(w)
1218	}
1219}
1220
1221#[cfg(taproot)]
1222impl Readable for PartialSignatureWithNonce {
1223	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1224		let partial_signature_buf: [u8; SECRET_KEY_SIZE] = Readable::read(r)?;
1225		let partial_signature = musig2::types::PartialSignature::from_slice(&partial_signature_buf)
1226			.map_err(|_| DecodeError::InvalidValue)?;
1227		let public_nonce: musig2::types::PublicNonce = Readable::read(r)?;
1228		Ok(PartialSignatureWithNonce(partial_signature, public_nonce))
1229	}
1230}
1231
1232impl Writeable for Hmac<Sha256> {
1233	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1234		w.write_all(&self[..])
1235	}
1236}
1237
1238impl Readable for Hmac<Sha256> {
1239	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1240		use bitcoin::hashes::Hash;
1241
1242		let buf: [u8; 32] = Readable::read(r)?;
1243		Ok(Hmac::<Sha256>::from_byte_array(buf))
1244	}
1245}
1246
1247impl Writeable for Sha256dHash {
1248	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1249		w.write_all(&self[..])
1250	}
1251}
1252
1253impl Readable for Sha256dHash {
1254	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1255		use bitcoin::hashes::Hash;
1256
1257		let buf: [u8; 32] = Readable::read(r)?;
1258		Ok(Sha256dHash::from_slice(&buf[..]).unwrap())
1259	}
1260}
1261
1262impl Writeable for ecdsa::Signature {
1263	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1264		self.serialize_compact().write(w)
1265	}
1266}
1267
1268impl Readable for ecdsa::Signature {
1269	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1270		let buf: [u8; COMPACT_SIGNATURE_SIZE] = Readable::read(r)?;
1271		match ecdsa::Signature::from_compact(&buf) {
1272			Ok(sig) => Ok(sig),
1273			Err(_) => return Err(DecodeError::InvalidValue),
1274		}
1275	}
1276}
1277
1278impl Writeable for schnorr::Signature {
1279	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1280		self.as_ref().write(w)
1281	}
1282}
1283
1284impl Readable for schnorr::Signature {
1285	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1286		let buf: [u8; SCHNORR_SIGNATURE_SIZE] = Readable::read(r)?;
1287		match schnorr::Signature::from_slice(&buf) {
1288			Ok(sig) => Ok(sig),
1289			Err(_) => return Err(DecodeError::InvalidValue),
1290		}
1291	}
1292}
1293
1294impl Writeable for PaymentPreimage {
1295	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1296		self.0.write(w)
1297	}
1298}
1299
1300impl Readable for PaymentPreimage {
1301	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1302		let buf: [u8; 32] = Readable::read(r)?;
1303		Ok(PaymentPreimage(buf))
1304	}
1305}
1306
1307impl Writeable for PaymentHash {
1308	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1309		self.0.write(w)
1310	}
1311}
1312
1313impl Readable for PaymentHash {
1314	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1315		let buf: [u8; 32] = Readable::read(r)?;
1316		Ok(PaymentHash(buf))
1317	}
1318}
1319
1320impl Writeable for PaymentSecret {
1321	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1322		self.0.write(w)
1323	}
1324}
1325
1326impl Readable for PaymentSecret {
1327	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1328		let buf: [u8; 32] = Readable::read(r)?;
1329		Ok(PaymentSecret(buf))
1330	}
1331}
1332
1333impl<T: Writeable> Writeable for Box<T> {
1334	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1335		T::write(&**self, w)
1336	}
1337}
1338
1339impl<T: Readable> Readable for Box<T> {
1340	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1341		Ok(Box::new(Readable::read(r)?))
1342	}
1343}
1344
1345impl<T: Writeable> Writeable for Option<T> {
1346	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1347		match *self {
1348			None => 0u8.write(w)?,
1349			Some(ref data) => {
1350				BigSize(data.serialized_length() as u64 + 1).write(w)?;
1351				data.write(w)?;
1352			},
1353		}
1354		Ok(())
1355	}
1356}
1357
1358impl<T: LengthReadable> Readable for Option<T> {
1359	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1360		let len: BigSize = Readable::read(r)?;
1361		match len.0 {
1362			0 => Ok(None),
1363			len => {
1364				let mut reader = FixedLengthReader::new(r, len - 1);
1365				Ok(Some(LengthReadable::read_from_fixed_length_buffer(&mut reader)?))
1366			},
1367		}
1368	}
1369}
1370
1371impl Writeable for AbsoluteLockTime {
1372	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1373		self.to_consensus_u32().write(w)
1374	}
1375}
1376
1377impl Readable for AbsoluteLockTime {
1378	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1379		let lock_time: u32 = Readable::read(r)?;
1380		Ok(AbsoluteLockTime::from_consensus(lock_time))
1381	}
1382}
1383
1384impl Writeable for Amount {
1385	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1386		self.to_sat().write(w)
1387	}
1388}
1389
1390impl Readable for Amount {
1391	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1392		let amount: u64 = Readable::read(r)?;
1393		Ok(Amount::from_sat(amount))
1394	}
1395}
1396
1397impl Writeable for SignedAmount {
1398	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1399		self.to_sat().write(w)
1400	}
1401}
1402
1403impl Readable for SignedAmount {
1404	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1405		let amount: i64 = Readable::read(r)?;
1406		Ok(SignedAmount::from_sat(amount))
1407	}
1408}
1409
1410impl Writeable for Weight {
1411	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1412		self.to_wu().write(w)
1413	}
1414}
1415
1416impl Readable for Weight {
1417	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1418		let wu: u64 = Readable::read(r)?;
1419		Ok(Weight::from_wu(wu))
1420	}
1421}
1422
1423impl Writeable for Txid {
1424	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1425		w.write_all(&self[..])
1426	}
1427}
1428
1429impl Readable for Txid {
1430	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1431		use bitcoin::hashes::Hash;
1432
1433		let buf: [u8; 32] = Readable::read(r)?;
1434		Ok(Txid::from_slice(&buf[..]).unwrap())
1435	}
1436}
1437
1438impl Writeable for BlockHash {
1439	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1440		w.write_all(&self[..])
1441	}
1442}
1443
1444impl Readable for BlockHash {
1445	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1446		use bitcoin::hashes::Hash;
1447
1448		let buf: [u8; 32] = Readable::read(r)?;
1449		Ok(BlockHash::from_slice(&buf[..]).unwrap())
1450	}
1451}
1452
1453impl Writeable for ChainHash {
1454	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1455		w.write_all(self.as_bytes())
1456	}
1457}
1458
1459impl Readable for ChainHash {
1460	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1461		let buf: [u8; 32] = Readable::read(r)?;
1462		Ok(ChainHash::from(buf))
1463	}
1464}
1465
1466impl Writeable for OutPoint {
1467	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1468		self.txid.write(w)?;
1469		self.vout.write(w)?;
1470		Ok(())
1471	}
1472}
1473
1474impl Readable for OutPoint {
1475	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1476		let txid = Readable::read(r)?;
1477		let vout = Readable::read(r)?;
1478		Ok(OutPoint { txid, vout })
1479	}
1480}
1481
1482macro_rules! impl_consensus_ser {
1483	($bitcoin_type: ty) => {
1484		impl Writeable for $bitcoin_type {
1485			fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
1486				match self.consensus_encode(&mut WriterWriteAdaptor(writer)) {
1487					Ok(_) => Ok(()),
1488					Err(e) => Err(e),
1489				}
1490			}
1491		}
1492
1493		impl Readable for $bitcoin_type {
1494			fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1495				let mut reader = BufReader::<_>::new(r);
1496				match consensus::encode::Decodable::consensus_decode(&mut reader) {
1497					Ok(t) => Ok(t),
1498					Err(consensus::encode::Error::Io(ref e))
1499						if e.kind() == io::ErrorKind::UnexpectedEof =>
1500					{
1501						Err(DecodeError::ShortRead)
1502					},
1503					Err(consensus::encode::Error::Io(e)) => Err(DecodeError::Io(e.kind().into())),
1504					Err(_) => Err(DecodeError::InvalidValue),
1505				}
1506			}
1507		}
1508	};
1509}
1510impl_consensus_ser!(Transaction);
1511impl_consensus_ser!(TxIn);
1512impl_consensus_ser!(TxOut);
1513impl_consensus_ser!(Witness);
1514impl_consensus_ser!(Sequence);
1515
1516impl<T: Readable> Readable for Mutex<T> {
1517	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1518		let t: T = Readable::read(r)?;
1519		Ok(Mutex::new(t))
1520	}
1521}
1522impl<T: Writeable> Writeable for Mutex<T> {
1523	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1524		self.lock().unwrap().write(w)
1525	}
1526}
1527
1528impl<T: Readable> Readable for RwLock<T> {
1529	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1530		let t: T = Readable::read(r)?;
1531		Ok(RwLock::new(t))
1532	}
1533}
1534impl<T: Writeable> Writeable for RwLock<T> {
1535	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1536		self.read().unwrap().write(w)
1537	}
1538}
1539
1540macro_rules! impl_tuple_ser {
1541	($($i: ident : $type: tt),*) => {
1542		impl<$($type),*> Readable for ($($type),*)
1543		where $(
1544			$type: Readable,
1545		)*
1546		{
1547			fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1548				Ok(($(<$type as Readable>::read(r)?),*))
1549			}
1550		}
1551
1552		impl<$($type),*> Writeable for ($($type),*)
1553		where $(
1554			$type: Writeable,
1555		)*
1556		{
1557			fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1558				let ($($i),*) = self;
1559				$($i.write(w)?;)*
1560				Ok(())
1561			}
1562		}
1563	}
1564}
1565
1566impl_tuple_ser!(a: A, b: B);
1567impl_tuple_ser!(a: A, b: B, c: C);
1568impl_tuple_ser!(a: A, b: B, c: C, d: D);
1569impl_tuple_ser!(a: A, b: B, c: C, d: D, e: E);
1570impl_tuple_ser!(a: A, b: B, c: C, d: D, e: E, f: F);
1571impl_tuple_ser!(a: A, b: B, c: C, d: D, e: E, f: F, g: G);
1572
1573impl Writeable for () {
1574	fn write<W: Writer>(&self, _: &mut W) -> Result<(), io::Error> {
1575		Ok(())
1576	}
1577}
1578impl Readable for () {
1579	fn read<R: Read>(_r: &mut R) -> Result<Self, DecodeError> {
1580		Ok(())
1581	}
1582}
1583
1584impl Writeable for String {
1585	#[inline]
1586	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1587		CollectionLength(self.len() as u64).write(w)?;
1588		w.write_all(self.as_bytes())
1589	}
1590}
1591impl Readable for String {
1592	#[inline]
1593	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1594		let v: Vec<u8> = Readable::read(r)?;
1595		let ret = String::from_utf8(v).map_err(|_| DecodeError::InvalidValue)?;
1596		Ok(ret)
1597	}
1598}
1599
1600/// Represents a hostname for serialization purposes.
1601/// Only the character set and length will be validated.
1602/// The character set consists of ASCII alphanumeric characters, hyphens, and periods.
1603/// Its length is guaranteed to be representable by a single byte.
1604/// This serialization is used by [`BOLT 7`] hostnames.
1605///
1606/// [`BOLT 7`]: https://github.com/lightning/bolts/blob/master/07-routing-gossip.md
1607#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1608pub struct Hostname(String);
1609impl Hostname {
1610	/// Returns the length of the hostname.
1611	pub fn len(&self) -> u8 {
1612		(&self.0).len() as u8
1613	}
1614
1615	/// Check if the chars in `s` are allowed to be included in a [`Hostname`].
1616	pub(crate) fn str_is_valid_hostname(s: &str) -> bool {
1617		s.len() <= 255
1618			&& s.chars().all(|c| c.is_ascii_alphanumeric() || c == '.' || c == '_' || c == '-')
1619	}
1620}
1621
1622impl core::fmt::Display for Hostname {
1623	fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1624		write!(f, "{}", self.0)?;
1625		Ok(())
1626	}
1627}
1628impl Deref for Hostname {
1629	type Target = String;
1630
1631	fn deref(&self) -> &Self::Target {
1632		&self.0
1633	}
1634}
1635impl From<Hostname> for String {
1636	fn from(hostname: Hostname) -> Self {
1637		hostname.0
1638	}
1639}
1640impl TryFrom<Vec<u8>> for Hostname {
1641	type Error = ();
1642
1643	fn try_from(bytes: Vec<u8>) -> Result<Self, Self::Error> {
1644		if let Ok(s) = String::from_utf8(bytes) {
1645			Hostname::try_from(s)
1646		} else {
1647			Err(())
1648		}
1649	}
1650}
1651impl TryFrom<String> for Hostname {
1652	type Error = ();
1653
1654	fn try_from(s: String) -> Result<Self, Self::Error> {
1655		if Hostname::str_is_valid_hostname(&s) {
1656			Ok(Hostname(s))
1657		} else {
1658			Err(())
1659		}
1660	}
1661}
1662impl Writeable for Hostname {
1663	#[inline]
1664	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1665		self.len().write(w)?;
1666		w.write_all(self.as_bytes())
1667	}
1668}
1669impl Readable for Hostname {
1670	#[inline]
1671	fn read<R: Read>(r: &mut R) -> Result<Hostname, DecodeError> {
1672		let len: u8 = Readable::read(r)?;
1673		let mut vec = Vec::with_capacity(len.into());
1674		vec.resize(len.into(), 0);
1675		r.read_exact(&mut vec)?;
1676		Hostname::try_from(vec).map_err(|_| DecodeError::InvalidValue)
1677	}
1678}
1679
1680impl TryInto<Name> for Hostname {
1681	type Error = ();
1682	fn try_into(self) -> Result<Name, ()> {
1683		Name::try_from(self.0)
1684	}
1685}
1686
1687/// This is not exported to bindings users as `Duration`s are simply mapped as ints.
1688impl Writeable for Duration {
1689	#[inline]
1690	fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1691		self.as_secs().write(w)?;
1692		self.subsec_nanos().write(w)
1693	}
1694}
1695/// This is not exported to bindings users as `Duration`s are simply mapped as ints.
1696impl Readable for Duration {
1697	#[inline]
1698	fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1699		let secs = Readable::read(r)?;
1700		let nanos = Readable::read(r)?;
1701		// Duration::new panics if the nanosecond part in excess of a second, added to the second
1702		// part, overflows. To ensure this won't happen, we simply reject any case where there are
1703		// nanoseconds in excess of a second, which is invalid anyway.
1704		if nanos >= 1_000_000_000 {
1705			Err(DecodeError::InvalidValue)
1706		} else {
1707			Ok(Duration::new(secs, nanos))
1708		}
1709	}
1710}
1711
1712impl Writeable for ClaimId {
1713	fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
1714		self.0.write(writer)
1715	}
1716}
1717
1718impl Readable for ClaimId {
1719	fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1720		Ok(Self(Readable::read(reader)?))
1721	}
1722}
1723
1724#[cfg(test)]
1725mod tests {
1726	use crate::prelude::*;
1727	use crate::util::ser::{Hostname, Readable, Writeable};
1728	use bitcoin::hex::FromHex;
1729	use bitcoin::secp256k1::ecdsa;
1730
1731	#[test]
1732	fn hostname_conversion() {
1733		assert_eq!(Hostname::try_from(String::from("a-test.com")).unwrap().as_str(), "a-test.com");
1734
1735		assert!(Hostname::try_from(String::from("\"")).is_err());
1736		assert!(Hostname::try_from(String::from("$")).is_err());
1737		assert!(Hostname::try_from(String::from("⚡")).is_err());
1738		let mut large_vec = Vec::with_capacity(256);
1739		large_vec.resize(256, b'A');
1740		assert!(Hostname::try_from(String::from_utf8(large_vec).unwrap()).is_err());
1741	}
1742
1743	#[test]
1744	fn hostname_serialization() {
1745		let hostname = Hostname::try_from(String::from("test")).unwrap();
1746		let mut buf: Vec<u8> = Vec::new();
1747		hostname.write(&mut buf).unwrap();
1748		assert_eq!(Hostname::read(&mut buf.as_slice()).unwrap().as_str(), "test");
1749	}
1750
1751	#[test]
1752	/// Taproot will likely fill legacy signature fields with all 0s.
1753	/// This test ensures that doing so won't break serialization.
1754	fn null_signature_codec() {
1755		let buffer = vec![0u8; 64];
1756		let mut cursor = crate::io::Cursor::new(buffer.clone());
1757		let signature = ecdsa::Signature::read(&mut cursor).unwrap();
1758		let serialization = signature.serialize_compact();
1759		assert_eq!(buffer, serialization.to_vec())
1760	}
1761
1762	#[test]
1763	fn bigsize_encoding_decoding() {
1764		let values = [0, 252, 253, 65535, 65536, 4294967295, 4294967296, 18446744073709551615];
1765		let bytes = [
1766			"00",
1767			"fc",
1768			"fd00fd",
1769			"fdffff",
1770			"fe00010000",
1771			"feffffffff",
1772			"ff0000000100000000",
1773			"ffffffffffffffffff",
1774		];
1775		for i in 0..=7 {
1776			let mut stream = crate::io::Cursor::new(<Vec<u8>>::from_hex(bytes[i]).unwrap());
1777			assert_eq!(super::BigSize::read(&mut stream).unwrap().0, values[i]);
1778			let mut stream = super::VecWriter(Vec::new());
1779			super::BigSize(values[i]).write(&mut stream).unwrap();
1780			assert_eq!(stream.0, <Vec<u8>>::from_hex(bytes[i]).unwrap());
1781		}
1782		let err_bytes = [
1783			"fd00fc",
1784			"fe0000ffff",
1785			"ff00000000ffffffff",
1786			"fd00",
1787			"feffff",
1788			"ffffffffff",
1789			"fd",
1790			"fe",
1791			"ff",
1792			"",
1793		];
1794		for i in 0..=9 {
1795			let mut stream = crate::io::Cursor::new(<Vec<u8>>::from_hex(err_bytes[i]).unwrap());
1796			if i < 3 {
1797				assert_eq!(
1798					super::BigSize::read(&mut stream).err(),
1799					Some(crate::ln::msgs::DecodeError::InvalidValue)
1800				);
1801			} else {
1802				assert_eq!(
1803					super::BigSize::read(&mut stream).err(),
1804					Some(crate::ln::msgs::DecodeError::ShortRead)
1805				);
1806			}
1807		}
1808	}
1809}