1use 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
58pub const MAX_BUF_SIZE: usize = 64 * 1024;
60
61pub trait Writer {
66 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
77struct 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 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 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
169pub 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
182pub 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 pub fn new(read: &'a mut R, total_bytes: u64) -> Self {
194 Self { read, bytes_read: 0, total_bytes }
195 }
196
197 #[inline]
199 pub fn bytes_remain(&mut self) -> bool {
200 self.bytes_read != self.total_bytes
201 }
202
203 #[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
232impl<'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
241pub struct ReadTrackingReader<'a, R: Read> {
246 read: &'a mut R,
247 pub have_read: bool,
249}
250impl<'a, R: Read> ReadTrackingReader<'a, R> {
251 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
270pub trait Writeable {
274 fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error>;
276
277 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 #[cfg(test)]
286 debug_assert_eq!(len, msg.0.len());
287 msg.0
288 }
289
290 #[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 #[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
319pub trait Readable
323where
324 Self: Sized,
325{
326 fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError>;
328}
329
330pub(crate) trait CursorReadable
333where
334 Self: Sized,
335{
336 fn read<R: AsRef<[u8]>>(reader: &mut io::Cursor<R>) -> Result<Self, DecodeError>;
338}
339
340pub trait ReadableArgs<P>
345where
346 Self: Sized,
347{
348 fn read<R: Read>(reader: &mut R, params: P) -> Result<Self, DecodeError>;
350}
351
352pub trait LengthLimitedRead: Read {
359 fn remaining_bytes(&self) -> u64;
361}
362
363impl LengthLimitedRead for &[u8] {
364 fn remaining_bytes(&self) -> u64 {
365 self.len() as u64
368 }
369}
370
371pub(crate) trait LengthReadableArgs<P>
374where
375 Self: Sized,
376{
377 fn read<R: LengthLimitedRead>(reader: &mut R, params: P) -> Result<Self, DecodeError>;
379}
380
381pub trait LengthReadable
391where
392 Self: Sized,
393{
394 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
409pub trait MaybeReadable
413where
414 Self: Sized,
415{
416 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
427pub 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}
445impl<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
460pub 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#[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
555pub 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#[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 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 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 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); impl_array!(4, u8); impl_array!(12, u8); impl_array!(16, u8); impl_array!(32, u8); impl_array!(PUBLIC_KEY_SIZE, u8); impl_array!(64, u8); impl_array!(66, u8); impl_array!(1300, u8); impl_array!(8, u16);
740impl_array!(32, u16);
741
742impl_array!(MAX_HOPS * HOLD_TIME_LEN, u8);
744impl_array!(HMAC_LEN * HMAC_COUNT, u8);
745
746pub 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 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
949impl<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
984macro_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
1023macro_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 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#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1608pub struct Hostname(String);
1609impl Hostname {
1610 pub fn len(&self) -> u8 {
1612 (&self.0).len() as u8
1613 }
1614
1615 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
1687impl 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}
1695impl 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 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 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}