1use core::fmt;
8use core::ops::Index;
9
10#[cfg(feature = "arbitrary")]
11use arbitrary::{Arbitrary, Unstructured};
12#[cfg(doc)]
13use encoding::Decoder4;
14use encoding::{
15 self, BytesEncoder, CompactSizeDecoder, CompactSizeEncoder, Decoder as _, DecoderStatus,
16 Encoder2,
17};
18#[cfg(feature = "hex")]
19use hex::DecodeVariableLengthBytesError;
20use internals::slice::SliceExt;
21
22#[cfg(feature = "hex")]
23use crate::hex_codec::HexPrimitive;
24use crate::prelude::{Box, Vec};
25#[cfg(doc)]
26use crate::TxIn;
27
28#[rustfmt::skip] #[doc(no_inline)]
30pub use self::error::{UnexpectedEofError, WitnessDecoderError};
31
32use self::error::WitnessDecoderErrorInner;
33
34const MAX_WITNESS_STACK_ITEMS: usize = 4_000_000;
40
41const MAX_WITNESS_ITEM_SIZE: usize = 4_000_000;
47
48#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
59pub struct Witness {
60 content: Vec<u8>,
71
72 witness_elements: usize,
77
78 indices_start: usize,
83}
84
85impl Witness {
86 #[inline]
88 pub const fn new() -> Self {
89 Self { content: Vec::new(), witness_elements: 0, indices_start: 0 }
90 }
91
92 pub fn from_slice<T: AsRef<[u8]>>(slice: &[T]) -> Self {
94 let witness_elements = slice.len();
95 let index_size = witness_elements * 4;
96 let content_size = slice
97 .iter()
98 .map(|elem| elem.as_ref().len() + CompactSizeEncoder::encoded_size(elem.as_ref().len()))
99 .sum();
100
101 let mut content = alloc::vec![0u8; content_size + index_size];
102 let mut cursor = 0usize;
103 for (i, elem) in slice.iter().enumerate() {
104 encode_cursor(&mut content, content_size, i, cursor);
105 let encoded = crate::compact_size_encode(elem.as_ref().len());
106 let encoded_size = encoded.as_slice().len();
107 content[cursor..cursor + encoded_size].copy_from_slice(encoded.as_slice());
108 cursor += encoded_size;
109 content[cursor..cursor + elem.as_ref().len()].copy_from_slice(elem.as_ref());
110 cursor += elem.as_ref().len();
111 }
112
113 Self { witness_elements, content, indices_start: content_size }
114 }
115
116 #[inline]
118 pub fn to_vec(&self) -> Vec<Vec<u8>> { self.iter().map(<[u8]>::to_vec).collect() }
119
120 #[inline]
122 pub fn is_empty(&self) -> bool { self.witness_elements == 0 }
123
124 #[must_use = "iterators are lazy and do nothing unless consumed"]
126 #[inline]
127 pub fn iter(&self) -> Iter<'_> {
128 Iter { inner: self.content.as_slice(), indices_start: self.indices_start, current_index: 0 }
129 }
130
131 #[inline]
133 pub const fn len(&self) -> usize { self.witness_elements }
134
135 pub fn size(&self) -> usize {
141 let mut size: usize = 0;
142
143 size += CompactSizeEncoder::encoded_size(self.witness_elements);
144 size += self
145 .iter()
146 .map(|witness_element| {
147 let len = witness_element.len();
148 CompactSizeEncoder::encoded_size(len) + len
149 })
150 .sum::<usize>();
151
152 size
153 }
154
155 #[inline]
157 pub fn clear(&mut self) {
158 self.content.clear();
159 self.witness_elements = 0;
160 self.indices_start = 0;
161 }
162
163 #[inline]
165 pub fn push<T: AsRef<[u8]>>(&mut self, new_element: T) {
166 self.push_slice(new_element.as_ref());
167 }
168
169 fn push_slice(&mut self, new_element: &[u8]) {
171 self.witness_elements += 1;
172 let previous_content_end = self.indices_start;
173 let encoded = crate::compact_size_encode(new_element.len());
174 let encoded_size = encoded.as_slice().len();
175 let current_content_len = self.content.len();
176 let new_item_total_len = encoded_size + new_element.len();
177 self.content.resize(current_content_len + new_item_total_len + 4, 0);
178
179 self.content[previous_content_end..].rotate_right(new_item_total_len);
180 self.indices_start += new_item_total_len;
181 encode_cursor(
182 &mut self.content,
183 self.indices_start,
184 self.witness_elements - 1,
185 previous_content_end,
186 );
187
188 let end_compact_size = previous_content_end + encoded_size;
189 self.content[previous_content_end..end_compact_size].copy_from_slice(encoded.as_slice());
190 self.content[end_compact_size..end_compact_size + new_element.len()]
191 .copy_from_slice(new_element);
192 }
193
194 #[inline]
196 pub fn last(&self) -> Option<&[u8]> { self.get_back(0) }
197
198 pub fn get_back(&self, index: usize) -> Option<&[u8]> {
221 if self.witness_elements <= index {
222 None
223 } else {
224 self.get(self.witness_elements - 1 - index)
225 }
226 }
227
228 #[inline]
230 pub fn get(&self, index: usize) -> Option<&[u8]> {
231 let pos = decode_cursor(&self.content, self.indices_start, index)?;
232
233 let mut slice = &self.content[pos..]; let element_len = decode_unchecked(&mut slice);
235 let end = cast_to_usize_if_valid(element_len)?;
236 Some(&slice[..end])
237 }
238
239 #[cfg(feature = "hex")]
245 pub fn from_hex<I, T>(iter: I) -> Result<Self, DecodeVariableLengthBytesError>
246 where
247 I: IntoIterator<Item = T>,
248 T: AsRef<str>,
249 {
250 let result = iter
251 .into_iter()
252 .map(|hex_str| crate::hex::decode_to_vec(hex_str.as_ref()))
253 .collect::<Result<Vec<_>, _>>()?;
254
255 Ok(Self::from_slice(&result))
256 }
257}
258
259#[inline]
262fn encode_cursor(bytes: &mut [u8], start_of_indices: usize, index: usize, value: usize) {
263 let start = start_of_indices + index * 4;
264 let end = start + 4;
265 bytes[start..end]
266 .copy_from_slice(&u32::to_ne_bytes(value.try_into().expect("larger than u32")));
267}
268
269#[inline]
270fn decode_cursor(bytes: &[u8], start_of_indices: usize, index: usize) -> Option<usize> {
271 let start = start_of_indices + index * 4;
272 let pos = bytes.get_array::<4>(start).map(|index_bytes| u32::from_ne_bytes(*index_bytes))?;
273 usize::try_from(pos).ok()
274}
275
276impl encoding::Encode for Witness {
277 type Encoder<'e>
278 = WitnessEncoder<'e>
279 where
280 Self: 'e;
281
282 fn encoder(&self) -> Self::Encoder<'_> {
283 let num_elements = CompactSizeEncoder::new(self.len());
284 let witness_elements =
285 BytesEncoder::without_length_prefix(&self.content[..self.indices_start]);
286
287 WitnessEncoder::new(Encoder2::new(num_elements, witness_elements))
288 }
289}
290
291impl encoding::Decode for Witness {
292 type Decoder = WitnessDecoder;
293}
294
295encoding::encoder_newtype_exact! {
296 #[derive(Debug, Clone)]
298 pub struct WitnessEncoder<'e>(Encoder2<CompactSizeEncoder, BytesEncoder<'e>>);
299}
300
301#[cfg(feature = "alloc")]
303#[derive(Debug, Clone)]
304pub struct WitnessDecoder {
305 content: Vec<u8>,
308 witness_count_decoder: CompactSizeDecoder,
310 witness_elements: Option<usize>,
312 element_idx: usize,
314 element_length_decoder: CompactSizeDecoder,
316 element_bytes_remaining: Option<usize>,
320}
321
322impl WitnessDecoder {
323 pub const fn new() -> Self {
325 Self {
326 content: Vec::new(),
327 witness_elements: None,
328 witness_count_decoder: CompactSizeDecoder::new_with_limit(MAX_WITNESS_STACK_ITEMS),
329 element_idx: 0,
330 element_length_decoder: CompactSizeDecoder::new_with_limit(MAX_WITNESS_ITEM_SIZE),
331 element_bytes_remaining: None,
332 }
333 }
334}
335
336impl Default for WitnessDecoder {
337 fn default() -> Self { Self::new() }
338}
339
340impl encoding::Decoder for WitnessDecoder {
341 type Output = Witness;
342 type Error = WitnessDecoderError;
343
344 fn push_bytes(&mut self, bytes: &mut &[u8]) -> Result<DecoderStatus, Self::Error> {
345 use WitnessDecoderError as E;
346 use WitnessDecoderErrorInner as Inner;
347
348 if self.witness_elements.is_none() {
350 if self
351 .witness_count_decoder
352 .push_bytes(bytes)
353 .map_err(|e| E(Inner::LengthPrefixDecode(e)))?
354 .needs_more()
355 {
356 return Ok(DecoderStatus::NeedsMore);
357 }
358 let decoder = core::mem::take(&mut self.witness_count_decoder);
360 let witness_elements = decoder.end().map_err(|e| E(Inner::LengthPrefixDecode(e)))?;
361 self.witness_elements = Some(witness_elements);
362
363 if witness_elements == 0 {
365 return Ok(DecoderStatus::Ready);
366 }
367
368 self.content.reserve(128);
374 }
375
376 let Some(witness_elements) = self.witness_elements else {
377 unreachable!("witness_elements must be Some after initial read")
378 };
379
380 loop {
382 if self.element_idx >= witness_elements {
384 return Ok(DecoderStatus::Ready);
385 }
386
387 if bytes.is_empty() {
388 return Ok(DecoderStatus::NeedsMore);
389 }
390
391 if let Some(bytes_to_read) = self.element_bytes_remaining {
394 let can_copy = bytes.len().min(bytes_to_read);
395 if can_copy == bytes_to_read && self.element_idx + 1 == witness_elements {
398 self.content.reserve_exact(can_copy + witness_elements * 4);
399 }
400 self.content.extend_from_slice(&bytes[..can_copy]);
401 *bytes = &bytes[can_copy..];
402 let remaining = bytes_to_read - can_copy;
403
404 if remaining == 0 {
405 self.element_idx += 1;
407 self.element_bytes_remaining = None;
408 } else {
409 self.element_bytes_remaining = Some(remaining);
410 }
411 } else {
412 if self
413 .element_length_decoder
414 .push_bytes(bytes)
415 .map_err(|e| E(Inner::LengthPrefixDecode(e)))?
416 .needs_more()
417 {
418 return Ok(DecoderStatus::NeedsMore);
419 }
420
421 let decoder = core::mem::take(&mut self.element_length_decoder);
423 let element_length = decoder.end().map_err(|e| E(Inner::LengthPrefixDecode(e)))?;
424
425 let encoded_compact_size = crate::compact_size_encode(element_length);
427 self.content.extend_from_slice(encoded_compact_size.as_slice());
428
429 if element_length == 0 {
430 self.element_idx += 1;
433 self.element_bytes_remaining = None;
434 } else {
435 self.element_bytes_remaining = Some(element_length);
436 }
437 }
438 }
439 }
440
441 fn end(mut self) -> Result<Self::Output, Self::Error> {
442 use WitnessDecoderError as E;
443 use WitnessDecoderErrorInner as Inner;
444
445 let Some(witness_elements) = self.witness_elements else {
446 return Err(E(Inner::UnexpectedEof(UnexpectedEofError { missing_elements: 0 })));
448 };
449
450 let remaining = witness_elements - self.element_idx;
451
452 if remaining == 0 {
453 let indices_start = self.content.len();
456
457 self.content.reserve(witness_elements * 4);
460 let mut read_pos = 0;
461 for _ in 0..witness_elements {
462 let offset = u32::try_from(read_pos).expect("larger than u32");
463 let (element_length, prefix_size) = {
464 let mut slice = &self.content[read_pos..indices_start];
465 let before = slice.len();
466 let element_length = decode_unchecked(&mut slice);
467 (element_length, before - slice.len())
468 };
469 let data_len = usize::try_from(element_length).expect("element data is present");
470 read_pos += prefix_size + data_len;
471 self.content.extend_from_slice(&offset.to_ne_bytes());
472 }
473
474 Ok(Witness { content: self.content, witness_elements, indices_start })
475 } else {
476 Err(E(Inner::UnexpectedEof(UnexpectedEofError { missing_elements: remaining })))
477 }
478 }
479
480 fn read_limit(&self) -> usize {
481 if self.witness_elements.is_none() {
482 self.witness_count_decoder.read_limit()
484 } else {
485 match self.element_bytes_remaining {
487 None => self.element_length_decoder.read_limit(),
488 Some(remaining) => remaining,
489 }
490 }
491 }
492}
493
494impl<T: core::borrow::Borrow<[u8]>> PartialEq<[T]> for Witness {
497 fn eq(&self, rhs: &[T]) -> bool {
498 if self.len() != rhs.len() {
499 return false;
500 }
501 self.iter().zip(rhs).all(|(left, right)| left == right.borrow())
502 }
503}
504
505impl<T: core::borrow::Borrow<[u8]>> PartialEq<&[T]> for Witness {
506 fn eq(&self, rhs: &&[T]) -> bool { *self == **rhs }
507}
508
509impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for [T] {
510 fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
511}
512
513impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for &[T] {
514 fn eq(&self, rhs: &Witness) -> bool { *rhs == **self }
515}
516
517impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<[T; N]> for Witness {
518 fn eq(&self, rhs: &[T; N]) -> bool { *self == *rhs.as_slice() }
519}
520
521impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<&[T; N]> for Witness {
522 fn eq(&self, rhs: &&[T; N]) -> bool { *self == *rhs.as_slice() }
523}
524
525impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for [T; N] {
526 fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
527}
528
529impl<const N: usize, T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for &[T; N] {
530 fn eq(&self, rhs: &Witness) -> bool { *rhs == **self }
531}
532
533impl<T: core::borrow::Borrow<[u8]>> PartialEq<Vec<T>> for Witness {
534 fn eq(&self, rhs: &Vec<T>) -> bool { *self == **rhs }
535}
536
537impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for Vec<T> {
538 fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
539}
540
541impl<T: core::borrow::Borrow<[u8]>> PartialEq<Box<[T]>> for Witness {
542 fn eq(&self, rhs: &Box<[T]>) -> bool { *self == **rhs }
543}
544
545impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for Box<[T]> {
546 fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
547}
548
549impl<T: core::borrow::Borrow<[u8]>> PartialEq<alloc::rc::Rc<[T]>> for Witness {
550 fn eq(&self, rhs: &alloc::rc::Rc<[T]>) -> bool { *self == **rhs }
551}
552
553impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for alloc::rc::Rc<[T]> {
554 fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
555}
556
557#[cfg(target_has_atomic = "ptr")]
558impl<T: core::borrow::Borrow<[u8]>> PartialEq<alloc::sync::Arc<[T]>> for Witness {
559 fn eq(&self, rhs: &alloc::sync::Arc<[T]>) -> bool { *self == **rhs }
560}
561
562#[cfg(target_has_atomic = "ptr")]
563impl<T: core::borrow::Borrow<[u8]>> PartialEq<Witness> for alloc::sync::Arc<[T]> {
564 fn eq(&self, rhs: &Witness) -> bool { *rhs == *self }
565}
566
567#[allow(clippy::missing_fields_in_debug)] impl fmt::Debug for Witness {
573 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
574 let total_bytes: usize = self.iter().map(<[u8]>::len).sum();
575
576 f.debug_struct("Witness")
577 .field("num_elements", &self.witness_elements)
578 .field("total_bytes", &total_bytes)
579 .field(
580 "elements",
581 &WrapDebug(|f| {
582 #[cfg(feature = "hex")]
583 {
584 f.debug_list().entries(self.iter().map(hex::DisplayHex::as_hex)).finish()
585 }
586 #[cfg(not(feature = "hex"))]
587 {
588 f.debug_list().entries(self.iter()).finish()
589 }
590 }),
591 )
592 .finish()
593 }
594}
595
596#[cfg(feature = "hex")]
601impl fmt::LowerHex for Witness {
602 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
603 fmt::LowerHex::fmt(&HexPrimitive(self), f)
604 }
605}
606
607#[cfg(feature = "hex")]
608impl fmt::UpperHex for Witness {
609 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
610 fmt::UpperHex::fmt(&HexPrimitive(self), f)
611 }
612}
613
614#[derive(Clone)]
616pub struct Iter<'a> {
617 inner: &'a [u8],
618 indices_start: usize,
619 current_index: usize,
620}
621
622impl Index<usize> for Witness {
623 type Output = [u8];
624
625 #[track_caller]
626 #[inline]
627 fn index(&self, index: usize) -> &Self::Output { self.get(index).expect("out of bounds") }
628}
629
630impl<'a> Iterator for Iter<'a> {
631 type Item = &'a [u8];
632
633 fn next(&mut self) -> Option<Self::Item> {
634 let index = decode_cursor(self.inner, self.indices_start, self.current_index)?;
635 let mut slice = &self.inner[index..]; let element_len = decode_unchecked(&mut slice);
637 let end = cast_to_usize_if_valid(element_len)?;
638 self.current_index += 1;
639 Some(&slice[..end])
640 }
641
642 #[inline]
643 fn size_hint(&self) -> (usize, Option<usize>) {
644 let total_count = (self.inner.len() - self.indices_start) / 4;
645 let remaining = total_count - self.current_index;
646 (remaining, Some(remaining))
647 }
648}
649
650impl ExactSizeIterator for Iter<'_> {}
651
652impl<'a> IntoIterator for &'a Witness {
653 type IntoIter = Iter<'a>;
654 type Item = &'a [u8];
655
656 #[inline]
657 fn into_iter(self) -> Self::IntoIter { self.iter() }
658}
659
660impl<T: AsRef<[u8]>> FromIterator<T> for Witness {
661 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
662 let mut decoder = WitnessDecoder::new();
663
664 let mut buffer = Vec::with_capacity(256);
668 let mut witness_elements = 0;
669
670 for elem in iter {
674 let encoded = crate::compact_size_encode(elem.as_ref().len());
675 buffer.extend_from_slice(encoded.as_slice());
676 buffer.extend_from_slice(elem.as_ref());
677 witness_elements += 1;
678 }
679
680 let witness_count = crate::compact_size_encode(witness_elements);
681 let _ = decoder.push_bytes(&mut witness_count.as_slice());
682
683 let _ = decoder.push_bytes(&mut buffer.as_slice());
684
685 decoder.end().expect("witness_elements in decoder is equal to number of provided elements")
686 }
687}
688
689#[cfg(feature = "serde")]
691impl serde::Serialize for Witness {
692 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
693 where
694 S: serde::Serializer,
695 {
696 use serde::ser::SerializeSeq;
697
698 let human_readable = serializer.is_human_readable();
699 let mut seq = serializer.serialize_seq(Some(self.witness_elements))?;
700
701 for elem in self {
703 if human_readable {
704 seq.serialize_element(&SerializeBytesAsHex(elem))?;
705 } else {
706 seq.serialize_element(&elem)?;
707 }
708 }
709 seq.end()
710 }
711}
712
713#[cfg(feature = "serde")]
714impl<'de> serde::Deserialize<'de> for Witness {
715 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
716 where
717 D: serde::Deserializer<'de>,
718 {
719 use crate::prelude::String;
720
721 struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor {
723 type Value = Witness;
724
725 fn expecting(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
726 write!(f, "a sequence of hex arrays")
727 }
728
729 fn visit_seq<A: serde::de::SeqAccess<'de>>(
730 self,
731 mut a: A,
732 ) -> Result<Self::Value, A::Error> {
733 let mut ret = match a.size_hint() {
734 Some(len) => Vec::with_capacity(len),
735 None => Vec::new(),
736 };
737
738 while let Some(elem) = a.next_element::<String>()? {
739 let vec = hex::decode_to_vec(&elem).map_err(serde::de::Error::custom)?;
740 ret.push(vec);
741 }
742 Ok(Witness::from_slice(&ret))
743 }
744 }
745
746 if deserializer.is_human_readable() {
747 deserializer.deserialize_seq(Visitor)
748 } else {
749 let vec: Vec<Vec<u8>> = serde::Deserialize::deserialize(deserializer)?;
750 Ok(Self::from_slice(&vec))
751 }
752 }
753}
754
755impl From<Vec<Vec<u8>>> for Witness {
756 #[inline]
757 fn from(vec: Vec<Vec<u8>>) -> Self { Self::from_slice(&vec) }
758}
759
760impl From<&[&[u8]]> for Witness {
761 #[inline]
762 fn from(slice: &[&[u8]]) -> Self { Self::from_slice(slice) }
763}
764
765impl From<&[Vec<u8>]> for Witness {
766 #[inline]
767 fn from(slice: &[Vec<u8>]) -> Self { Self::from_slice(slice) }
768}
769
770impl From<Vec<&[u8]>> for Witness {
771 #[inline]
772 fn from(vec: Vec<&[u8]>) -> Self { Self::from_slice(&vec) }
773}
774
775impl<const N: usize> From<[&[u8]; N]> for Witness {
776 #[inline]
777 fn from(arr: [&[u8]; N]) -> Self { Self::from_slice(&arr) }
778}
779
780impl<const N: usize> From<&[&[u8]; N]> for Witness {
781 #[inline]
782 fn from(arr: &[&[u8]; N]) -> Self { Self::from_slice(arr) }
783}
784
785impl<const N: usize> From<&[[u8; N]]> for Witness {
786 #[inline]
787 fn from(slice: &[[u8; N]]) -> Self { Self::from_slice(slice) }
788}
789
790impl<const N: usize> From<&[&[u8; N]]> for Witness {
791 #[inline]
792 fn from(slice: &[&[u8; N]]) -> Self { Self::from_slice(slice) }
793}
794
795impl<const N: usize, const M: usize> From<[[u8; M]; N]> for Witness {
796 #[inline]
797 fn from(slice: [[u8; M]; N]) -> Self { Self::from_slice(&slice) }
798}
799
800impl<const N: usize, const M: usize> From<&[[u8; M]; N]> for Witness {
801 #[inline]
802 fn from(slice: &[[u8; M]; N]) -> Self { Self::from_slice(slice) }
803}
804
805impl<const N: usize, const M: usize> From<[&[u8; M]; N]> for Witness {
806 #[inline]
807 fn from(slice: [&[u8; M]; N]) -> Self { Self::from_slice(&slice) }
808}
809
810impl<const N: usize, const M: usize> From<&[&[u8; M]; N]> for Witness {
811 #[inline]
812 fn from(slice: &[&[u8; M]; N]) -> Self { Self::from_slice(slice) }
813}
814
815impl Default for Witness {
816 #[inline]
817 fn default() -> Self { Self::new() }
818}
819
820#[cfg(feature = "arbitrary")]
821impl<'a> Arbitrary<'a> for Witness {
822 fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
823 let arbitrary_bytes = Vec::<Vec<u8>>::arbitrary(u)?;
824 Ok(Self::from_slice(&arbitrary_bytes))
825 }
826}
827
828fn cast_to_usize_if_valid(n: u64) -> Option<usize> {
839 const MAX_VEC_SIZE: u64 = 4_000_000;
841
842 if n > MAX_VEC_SIZE {
843 return None;
844 }
845
846 usize::try_from(n).ok()
847}
848
849fn decode_unchecked(slice: &mut &[u8]) -> u64 {
861 assert!(!slice.is_empty(), "tried to decode an empty slice");
862
863 match slice[0] {
864 0xFF => {
865 const SIZE: usize = 9;
866 assert!(slice.len() >= SIZE, "slice too short, expected at least 9 bytes");
867
868 let mut bytes = [0_u8; SIZE - 1];
869 bytes.copy_from_slice(&slice[1..SIZE]);
870
871 let v = u64::from_le_bytes(bytes);
872 debug_assert!(v > u32::MAX.into(), "non-minimal encoding of a u64");
873 *slice = &slice[SIZE..];
874 v
875 }
876 0xFE => {
877 const SIZE: usize = 5;
878 assert!(slice.len() >= SIZE, "slice too short, expected at least 5 bytes");
879
880 let mut bytes = [0_u8; SIZE - 1];
881 bytes.copy_from_slice(&slice[1..SIZE]);
882
883 let v = u32::from_le_bytes(bytes);
884 debug_assert!(v > u16::MAX.into(), "non-minimal encoding of a u32");
885 *slice = &slice[SIZE..];
886 u64::from(v)
887 }
888 0xFD => {
889 const SIZE: usize = 3;
890 assert!(slice.len() >= SIZE, "slice too short, expected at least 3 bytes");
891
892 let mut bytes = [0_u8; SIZE - 1];
893 bytes.copy_from_slice(&slice[1..SIZE]);
894
895 let v = u16::from_le_bytes(bytes);
896 debug_assert!(v >= 0xFD, "non-minimal encoding of a u16");
897 *slice = &slice[SIZE..];
898 u64::from(v)
899 }
900 n => {
901 *slice = &slice[1..];
902 u64::from(n)
903 }
904 }
905}
906
907struct WrapDebug<F: Fn(&mut fmt::Formatter) -> fmt::Result>(pub F);
909
910impl<F: Fn(&mut fmt::Formatter) -> fmt::Result> fmt::Debug for WrapDebug<F> {
911 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { (self.0)(f) }
912}
913
914#[cfg(feature = "serde")]
916struct SerializeBytesAsHex<'a>(pub &'a [u8]);
917
918#[cfg(feature = "serde")]
919impl serde::Serialize for SerializeBytesAsHex<'_> {
920 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
921 where
922 S: serde::Serializer,
923 {
924 use hex::DisplayHex;
925
926 serializer.collect_str(&format_args!("{:x}", self.0.as_hex()))
927 }
928}
929
930pub mod error {
932 use core::convert::Infallible;
933 use core::fmt;
934
935 use encoding::CompactSizeDecoderError;
936 use internals::write_err;
937
938 #[derive(Debug, Clone, PartialEq, Eq)]
942 pub struct WitnessDecoderError(pub(super) WitnessDecoderErrorInner);
943
944 #[derive(Debug, Clone, PartialEq, Eq)]
945 pub(super) enum WitnessDecoderErrorInner {
946 LengthPrefixDecode(CompactSizeDecoderError),
948 UnexpectedEof(UnexpectedEofError),
950 }
951
952 impl From<Infallible> for WitnessDecoderError {
953 fn from(never: Infallible) -> Self { match never {} }
954 }
955
956 impl fmt::Display for WitnessDecoderError {
957 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
958 use WitnessDecoderErrorInner as E;
959
960 match self.0 {
961 E::LengthPrefixDecode(ref e) => write_err!(f, "vec decoder error"; e),
962 E::UnexpectedEof(ref e) => write_err!(f, "decoder error"; e),
963 }
964 }
965 }
966
967 #[cfg(feature = "std")]
968 impl std::error::Error for WitnessDecoderError {
969 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
970 use WitnessDecoderErrorInner as E;
971
972 match self.0 {
973 E::LengthPrefixDecode(ref e) => Some(e),
974 E::UnexpectedEof(ref e) => Some(e),
975 }
976 }
977 }
978
979 #[derive(Debug, Clone, PartialEq, Eq)]
981 pub struct UnexpectedEofError {
982 pub(super) missing_elements: usize,
984 }
985
986 impl From<Infallible> for UnexpectedEofError {
987 fn from(never: Infallible) -> Self { match never {} }
988 }
989
990 impl fmt::Display for UnexpectedEofError {
991 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
992 write!(f, "not enough witness elements for decoder, missing {}", self.missing_elements)
993 }
994 }
995
996 #[cfg(feature = "std")]
997 impl std::error::Error for UnexpectedEofError {
998 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
999 let Self { missing_elements: _ } = self;
1000 None
1001 }
1002 }
1003}
1004
1005#[cfg(test)]
1006mod test {
1007 #[cfg(feature = "alloc")]
1008 use alloc::string::ToString;
1009 #[cfg(feature = "alloc")]
1010 use alloc::{format, vec};
1011 #[cfg(feature = "std")]
1012 use std::error::Error as _;
1013
1014 use encoding::check_encode;
1015 #[cfg(feature = "alloc")]
1016 use encoding::Decode as _;
1017
1018 use super::*;
1019
1020 fn single_empty_element() -> Witness { Witness::from([[0u8; 0]]) }
1022
1023 #[test]
1024 fn witness_single_empty_element() {
1025 let mut got = Witness::new();
1026 got.push([]);
1027 let want = single_empty_element();
1028 assert_eq!(got, want);
1029 }
1030
1031 #[test]
1032 fn push() {
1033 let mut witness = Witness::default();
1035 assert!(witness.is_empty());
1036 assert_eq!(witness.last(), None);
1037 assert_eq!(witness.get_back(1), None);
1038
1039 assert_eq!(witness.get(0), None);
1040 assert_eq!(witness.get(1), None);
1041 assert_eq!(witness.get(2), None);
1042 assert_eq!(witness.get(3), None);
1043
1044 let push = [11_u8];
1046 witness.push(push);
1047 assert!(!witness.is_empty());
1048
1049 assert_eq!(witness, [[11_u8]]);
1050
1051 let element_0 = push.as_slice();
1052 assert_eq!(element_0, &witness[0]);
1053
1054 assert_eq!(witness.get_back(1), None);
1055 assert_eq!(witness.last(), Some(element_0));
1056
1057 assert_eq!(witness.get(0), Some(element_0));
1058 assert_eq!(witness.get(1), None);
1059 assert_eq!(witness.get(2), None);
1060 assert_eq!(witness.get(3), None);
1061
1062 let push = [21u8, 22u8];
1064 witness.push(push);
1065
1066 assert_eq!(witness, [&[11_u8] as &[_], &[21, 22]]);
1067
1068 let element_1 = push.as_slice();
1069 assert_eq!(element_1, &witness[1]);
1070
1071 assert_eq!(witness.get(0), Some(element_0));
1072 assert_eq!(witness.get(1), Some(element_1));
1073 assert_eq!(witness.get(2), None);
1074 assert_eq!(witness.get(3), None);
1075
1076 assert_eq!(witness.get_back(1), Some(element_0));
1077 assert_eq!(witness.last(), Some(element_1));
1078
1079 let push = [31u8, 32u8];
1081 witness.push(push);
1082
1083 assert_eq!(witness, [&[11_u8] as &[_], &[21, 22], &[31, 32]]);
1084
1085 let element_2 = push.as_slice();
1086 assert_eq!(element_2, &witness[2]);
1087
1088 assert_eq!(witness.get(0), Some(element_0));
1089 assert_eq!(witness.get(1), Some(element_1));
1090 assert_eq!(witness.get(2), Some(element_2));
1091 assert_eq!(witness.get(3), None);
1092
1093 assert_eq!(witness.get_back(2), Some(element_0));
1094 assert_eq!(witness.get_back(1), Some(element_1));
1095 assert_eq!(witness.last(), Some(element_2));
1096 }
1097
1098 #[test]
1099 fn exact_sized_iterator() {
1100 let arbitrary_element = [1_u8, 2, 3];
1101 let num_pushes = 5; let mut witness = Witness::default();
1104
1105 for i in 0..num_pushes {
1106 assert_eq!(witness.iter().len(), i);
1107 witness.push(arbitrary_element);
1108 }
1109
1110 let mut iter = witness.iter();
1111 for i in (0..=num_pushes).rev() {
1112 assert_eq!(iter.len(), i);
1113 iter.next();
1114 }
1115 }
1116
1117 #[test]
1118 fn witness_from_impl() {
1119 let vec = vec![vec![11], vec![21, 22]];
1121 let slice_vec: &[Vec<u8>] = &vec;
1122 let slice_slice: &[&[u8]] = &[&[11u8], &[21, 22]];
1123 let vec_slice: Vec<&[u8]> = vec![&[11u8], &[21, 22]];
1124
1125 let witness_vec_vec = Witness::from(vec.clone());
1126 let witness_slice_vec = Witness::from(slice_vec);
1127 let witness_slice_slice = Witness::from(slice_slice);
1128 let witness_vec_slice = Witness::from(vec_slice);
1129
1130 let mut expected = Witness::from_slice(&vec);
1131 assert_eq!(expected.len(), 2);
1132 assert_eq!(expected.to_vec(), vec);
1133
1134 assert_eq!(witness_vec_vec, expected);
1135 assert_eq!(witness_slice_vec, expected);
1136 assert_eq!(witness_slice_slice, expected);
1137 assert_eq!(witness_vec_slice, expected);
1138
1139 expected.clear();
1141 assert!(expected.is_empty());
1142 }
1143
1144 #[test]
1145 fn witness_from_array_impl() {
1146 const DATA_1: [u8; 3] = [1, 2, 3];
1147 const DATA_2: [u8; 3] = [4, 5, 6];
1148 let witness = Witness::from_slice(&[DATA_1, DATA_2]);
1149
1150 let witness_from_array_ref = Witness::from(&[DATA_1, DATA_2]);
1151 let witness_from_array_of_refs = Witness::from([&DATA_1, &DATA_2]);
1152 let witness_from_ref_to_array_of_refs = Witness::from(&[&DATA_1, &DATA_2]);
1153 let witness_from_fixed_array = Witness::from([DATA_1, DATA_2]);
1154 let witness_from_slice_of_refs = Witness::from(&[&DATA_1, &DATA_2][..]);
1155 let witness_from_nested_array = Witness::from(&[DATA_1, DATA_2][..]);
1156
1157 assert_eq!(witness_from_array_ref, witness);
1158 assert_eq!(witness_from_array_of_refs, witness);
1159 assert_eq!(witness_from_ref_to_array_of_refs, witness);
1160 assert_eq!(witness_from_fixed_array, witness);
1161 assert_eq!(witness_from_slice_of_refs, witness);
1162 assert_eq!(witness_from_nested_array, witness);
1163 }
1164
1165 #[test]
1166 fn witness_size() {
1167 let mut witness = Witness::new();
1168 let want = 1; assert_eq!(witness.size(), want);
1170
1171 witness.push([1, 2, 3]);
1172 let want = 5; assert_eq!(witness.size(), want);
1174
1175 witness.push([4, 5]);
1176 let want = 8; assert_eq!(witness.size(), want);
1178 }
1179
1180 #[test]
1181 fn partial_eq() {
1182 const EMPTY_BYTES: &[u8] = &[];
1183 const DATA_1: &[u8] = &[42];
1184 const DATA_2: &[u8] = &[42, 21];
1185
1186 macro_rules! ck {
1187 ($witness:expr, $container:expr, $different:expr) => {{
1188 let witness = $witness;
1189 let container = $container;
1190 let different = $different;
1191
1192 assert_eq!(witness, container, stringify!($container));
1193 assert_eq!(container, witness, stringify!($container));
1194
1195 assert_ne!(witness, different, stringify!($container));
1196 assert_ne!(different, witness, stringify!($container));
1197 }};
1198 }
1199
1200 let container: &[&[u8]] = &[EMPTY_BYTES];
1202 let different: &[&[u8]] = &[DATA_1];
1203 ck!(Witness::from(container), container, different);
1204
1205 let container: &[&[u8]] = &[DATA_1];
1206 let different: &[&[u8]] = &[DATA_2];
1207 ck!(Witness::from(container), container, different);
1208
1209 let container: &[&[u8]; 2] = &[DATA_1, DATA_2];
1211 let different: &[&[u8]; 2] = &[DATA_2, DATA_1];
1212 ck!(Witness::from(container), container, different);
1213
1214 let container: [&[u8]; 2] = [DATA_1, DATA_2];
1216 let different: [&[u8]; 2] = [DATA_2, DATA_1];
1217 ck!(Witness::from(container), container, different);
1218
1219 let container: Vec<&[u8]> = vec![DATA_1, DATA_2];
1221 let different: Vec<&[u8]> = vec![DATA_2, DATA_1];
1222 ck!(Witness::from(container.as_slice()), container, different);
1223
1224 let container: Box<[&[u8]]> = vec![DATA_1, DATA_2].into_boxed_slice();
1226 let different: Box<[&[u8]]> = vec![DATA_2, DATA_1].into_boxed_slice();
1227 ck!(Witness::from(&*container), container, different);
1228
1229 let container: alloc::rc::Rc<[&[u8]]> = vec![DATA_1, DATA_2].into();
1231 let different: alloc::rc::Rc<[&[u8]]> = vec![DATA_2, DATA_1].into();
1232 ck!(Witness::from(&*container), container, different);
1233
1234 let container: alloc::sync::Arc<[&[u8]]> = vec![DATA_1, DATA_2].into();
1236 let different: alloc::sync::Arc<[&[u8]]> = vec![DATA_2, DATA_1].into();
1237 ck!(Witness::from(&*container), container, different);
1238 }
1239
1240 #[test]
1241 fn partial_eq_for_slice() {
1242 let witness = Witness::from_slice(&[vec![1, 2, 3], vec![4, 5, 6]]);
1243 let container: &[Vec<u8>] = &[vec![1, 2, 3], vec![4, 5, 6]];
1244 let different: &[Vec<u8>] = &[vec![1, 2], vec![4, 5]];
1245
1246 assert_eq!(*container, witness);
1248 assert_ne!(*different, witness);
1249 }
1250
1251 #[test]
1252 fn partial_eq_len_mismatch() {
1253 let witness = Witness::from_slice(&[&[1u8][..]]);
1254 let rhs = vec![vec![1u8], vec![2u8]];
1255 assert_ne!(witness, rhs.as_slice());
1256 }
1257
1258 #[test]
1259 #[cfg(feature = "serde")]
1260 fn serde_bincode_backward_compatibility() {
1261 let old_witness_format = vec![vec![0u8], vec![2]];
1262 let new_witness_format = Witness::from_slice(&old_witness_format);
1263
1264 let old = bincode::serialize(&old_witness_format).unwrap();
1265 let new = bincode::serialize(&new_witness_format).unwrap();
1266
1267 assert_eq!(old, new);
1268 }
1269
1270 #[cfg(feature = "serde")]
1271 fn arbitrary_witness() -> Witness {
1272 let mut witness = Witness::default();
1273
1274 witness.push([0_u8]);
1275 witness.push([1_u8; 32]);
1276 witness.push([2_u8; 72]);
1277
1278 witness
1279 }
1280
1281 #[test]
1282 #[cfg(feature = "serde")]
1283 fn serde_bincode_roundtrips() {
1284 let original = arbitrary_witness();
1285 let ser = bincode::serialize(&original).unwrap();
1286 let roundtrip: Witness = bincode::deserialize(&ser).unwrap();
1287 assert_eq!(roundtrip, original);
1288 }
1289
1290 #[test]
1291 #[cfg(feature = "serde")]
1292 fn serde_human_roundtrips() {
1293 let original = arbitrary_witness();
1294 let ser = serde_json::to_string(&original).unwrap();
1295 let roundtrip: Witness = serde_json::from_str(&ser).unwrap();
1296 assert_eq!(roundtrip, original);
1297 }
1298
1299 #[test]
1300 #[cfg(feature = "serde")]
1301 fn serde_human() {
1302 let witness = Witness::from_slice(&[vec![0u8, 123, 75], vec![2u8, 6, 3, 7, 8]]);
1303 let json = serde_json::to_string(&witness).unwrap();
1304 assert_eq!(json, r#"["007b4b","0206030708"]"#);
1305 }
1306
1307 #[test]
1308 fn test_witness_from_iterator() {
1309 let bytes1 = [1u8, 2, 3];
1310 let bytes2 = [4u8, 5];
1311 let bytes3 = [6u8, 7, 8, 9];
1312 let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
1313
1314 let witness1 = Witness::from_iter(data);
1316
1317 let mut witness2 = Witness::new();
1319 for item in &data {
1320 witness2.push(item);
1321 }
1322 assert_eq!(witness1, witness2);
1323 assert_eq!(witness1.len(), witness2.len());
1324 assert_eq!(witness1.to_vec(), witness2.to_vec());
1325
1326 let bytes4 = [0u8, 123, 75];
1328 let bytes5 = [2u8, 6, 3, 7, 8];
1329 let data = [bytes4.to_vec(), bytes5.to_vec()];
1330 let witness3: Witness = data.iter().collect();
1331 assert_eq!(witness3.len(), 2);
1332 assert_eq!(witness3.to_vec(), data);
1333
1334 let empty_data: Vec<Vec<u8>> = vec![];
1336 let witness4: Witness = empty_data.iter().collect();
1337 assert!(witness4.is_empty());
1338 }
1339
1340 #[test]
1341 #[cfg(feature = "hex")]
1342 fn test_from_hex() {
1343 let hex_strings = [
1344 "30440220703350f1c8be5b41b4cb03b3b680c4f3337f987514a6b08e16d5d9f81e9b5f72022018fb269ba5b82864c0e1edeaf788829eb332fe34a859cc1f99c4a02edfb5d0df01",
1345 "0208689fe2cca52d8726cefaf274de8fa61d5faa5e1058ad35b49fb194c035f9a4",
1346 ];
1347
1348 let witness = Witness::from_hex(hex_strings).unwrap();
1349 assert_eq!(witness.len(), 2);
1350 }
1351
1352 #[test]
1353 #[cfg(feature = "hex")]
1354 fn empty_witness_lower_hex() {
1355 let empty = Witness::new();
1356 assert_eq!(format!("{:x}", empty), "00");
1357 }
1358
1359 #[test]
1360 #[cfg(feature = "hex")]
1361 fn witness_lower_hex() {
1362 let witness = Witness::from_iter([[1u8, 2, 3].as_slice(), [4u8, 5].as_slice()]);
1363 assert_eq!(format!("{:x}", witness), "0203010203020405");
1365 }
1366
1367 #[test]
1368 #[cfg(feature = "hex")]
1369 fn witness_upper_hex() {
1370 let witness = Witness::from_iter([[0xABu8, 0xCD].as_slice()]);
1371 assert_eq!(format!("{:X}", witness), "0102ABCD");
1372 }
1373
1374 #[test]
1375 fn encode() {
1376 let bytes1 = [1u8, 2, 3];
1377 let bytes2 = [4u8, 5];
1378 let bytes3 = [6u8, 7, 8, 9];
1379 let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
1380
1381 let witness = Witness::from_iter(data);
1383
1384 let want = [0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x06, 0x07, 0x08, 0x09];
1385 let got = encoding::encode_to_vec(&witness);
1386
1387 assert_eq!(&got, &want);
1388 }
1389
1390 #[test]
1391 fn encodes_using_correct_chunks() {
1392 let bytes1 = [1u8, 2, 3];
1393 let bytes2 = [4u8, 5];
1394 let data = [&bytes1[..], &bytes2[..]];
1395
1396 let witness = Witness::from_iter(data);
1398
1399 check_encode(&witness, &[2u8, 3u8, 1, 2, 3, 2, 4, 5]);
1400 }
1401
1402 #[test]
1403 fn encode_empty() {
1404 let witness = Witness::default();
1405
1406 let want = [0x00];
1407 let got = encoding::encode_to_vec(&witness);
1408
1409 assert_eq!(&got, &want);
1410 }
1411
1412 #[cfg(feature = "alloc")]
1413 fn witness_test_case() -> (Witness, Vec<u8>) {
1414 let bytes1 = [1u8];
1415 let bytes2 = [2u8, 3];
1416 let bytes3 = [4u8, 5, 6];
1417 let data = [&bytes1[..], &bytes2[..], &bytes3[..]];
1418
1419 let witness = Witness::from_iter(data);
1420
1421 #[rustfmt::skip]
1422 let encoded = vec![
1423 0x03_u8,
1424 0x01, 0x01,
1425 0x02, 0x02, 0x03,
1426 0x03, 0x04, 0x05, 0x06
1427 ];
1428
1429 (witness, encoded)
1430 }
1431
1432 #[test]
1433 #[cfg(feature = "alloc")]
1434 fn decode_witness_one_single_call() {
1435 let (want, encoded) = witness_test_case();
1436
1437 let mut slice = encoded.as_slice();
1438 let mut decoder = WitnessDecoder::new();
1439 decoder.push_bytes(&mut slice).unwrap();
1440
1441 let got = decoder.end().unwrap();
1442
1443 assert_eq!(got, want);
1444 }
1445
1446 #[test]
1447 #[cfg(feature = "alloc")]
1448 #[allow(clippy::many_single_char_names)]
1449 fn decode_witness_many_calls() {
1450 let (want, encoded) = witness_test_case();
1451
1452 let mut decoder = WitnessDecoder::new();
1453
1454 let mut a = &encoded.as_slice()[0..1]; let mut b = &encoded.as_slice()[1..2]; let mut c = &encoded.as_slice()[2..5]; let mut d = &encoded.as_slice()[5..6]; let mut e = &encoded.as_slice()[6..7]; let mut f = &encoded.as_slice()[7..9]; let mut g = &encoded.as_slice()[9..]; decoder.push_bytes(&mut a).unwrap();
1463 decoder.push_bytes(&mut b).unwrap();
1464 decoder.push_bytes(&mut c).unwrap();
1465 decoder.push_bytes(&mut d).unwrap();
1466 decoder.push_bytes(&mut e).unwrap();
1467 decoder.push_bytes(&mut f).unwrap();
1468 decoder.push_bytes(&mut g).unwrap();
1469
1470 let got = decoder.end().unwrap();
1471
1472 assert_eq!(got, want);
1473 }
1474
1475 #[test]
1476 #[cfg(feature = "alloc")]
1477 fn decode_max_length() {
1478 let mut encoded = Vec::new();
1479 encoded.extend_from_slice(crate::compact_size_encode(1usize).as_slice());
1480 encoded.extend_from_slice(crate::compact_size_encode(4_000_000usize).as_slice());
1481 encoded.resize(encoded.len() + 4_000_000, 0u8);
1482
1483 let mut slice = encoded.as_slice();
1484 let mut decoder = WitnessDecoder::new();
1485 decoder.push_bytes(&mut slice).unwrap();
1486 let witness = decoder.end().unwrap();
1487 assert_eq!(witness[0].len(), 4_000_000);
1488 }
1489
1490 #[test]
1491 #[cfg(feature = "alloc")]
1492 fn decode_length_prefix_error() {
1493 let mut encoded = Vec::new();
1494 encoded.extend_from_slice(crate::compact_size_encode(1usize).as_slice());
1495 encoded.extend_from_slice(crate::compact_size_encode(4_000_001usize).as_slice());
1496
1497 let mut slice = encoded.as_slice();
1498 let mut decoder = WitnessDecoder::new();
1499 let err = decoder.push_bytes(&mut slice).unwrap_err();
1500 assert!(matches!(
1501 err,
1502 WitnessDecoderError(WitnessDecoderErrorInner::LengthPrefixDecode(_))
1503 ));
1504 assert!(!err.to_string().is_empty());
1505 #[cfg(feature = "std")]
1506 assert!(err.source().is_some());
1507 }
1508
1509 #[test]
1510 #[cfg(feature = "alloc")]
1511 fn decode_empty_witness() {
1512 let encoded = vec![0x00];
1514 let mut slice = encoded.as_slice();
1515 let mut decoder = WitnessDecoder::new();
1516
1517 assert!(decoder.push_bytes(&mut slice).unwrap().is_ready());
1518 let witness = decoder.end().unwrap();
1519
1520 assert_eq!(witness.len(), 0);
1521 assert!(witness.is_empty());
1522 }
1523
1524 #[test]
1525 #[cfg(feature = "alloc")]
1526 fn decode_single_element() {
1527 let encoded = vec![0x01, 0x02, 0xAB, 0xCD];
1529 let mut slice = encoded.as_slice();
1530 let mut decoder = WitnessDecoder::new();
1531
1532 assert!(decoder.push_bytes(&mut slice).unwrap().is_ready());
1533 let witness = decoder.end().unwrap();
1534
1535 assert_eq!(witness.len(), 1);
1536 assert_eq!(&witness[0], &[0xABu8, 0xCD][..]);
1537 }
1538
1539 #[test]
1540 #[cfg(feature = "alloc")]
1541 fn decode_empty_element() {
1542 let encoded = vec![0x01, 0x00];
1544 let mut slice = encoded.as_slice();
1545 let mut decoder = WitnessDecoder::new();
1546
1547 assert!(decoder.push_bytes(&mut slice).unwrap().is_ready());
1548 let witness = decoder.end().unwrap();
1549
1550 assert_eq!(witness.len(), 1);
1551 assert_eq!(&witness[0], &[] as &[u8]);
1552 }
1553
1554 #[test]
1555 #[cfg(feature = "alloc")]
1556 fn decode_multiple_empty_elements() {
1557 let encoded = vec![0x03, 0x00, 0x00, 0x00];
1559 let mut slice = encoded.as_slice();
1560 let mut decoder = WitnessDecoder::new();
1561
1562 assert!(decoder.push_bytes(&mut slice).unwrap().is_ready());
1563 let witness = decoder.end().unwrap();
1564
1565 assert_eq!(witness.len(), 3);
1566 assert_eq!(&witness[0], &[] as &[u8]);
1567 assert_eq!(&witness[1], &[] as &[u8]);
1568 assert_eq!(&witness[2], &[] as &[u8]);
1569 }
1570
1571 #[test]
1572 #[cfg(feature = "alloc")]
1573 fn decode_incomplete_witness_count() {
1574 let encoded = vec![0xFD, 0x03];
1576 let mut slice = encoded.as_slice();
1577 let mut decoder = WitnessDecoder::new();
1578
1579 assert!(decoder.push_bytes(&mut slice).unwrap().needs_more());
1580
1581 let err = decoder.end().unwrap_err();
1582 assert!(matches!(err, WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(_))));
1583 }
1584
1585 #[test]
1586 #[cfg(feature = "alloc")]
1587 fn decode_incomplete_element_length() {
1588 let encoded = vec![0x01, 0xFD, 0x05]; let mut slice = encoded.as_slice();
1591 let mut decoder = WitnessDecoder::new();
1592
1593 assert!(decoder.push_bytes(&mut slice).unwrap().needs_more());
1594
1595 let err = decoder.end().unwrap_err();
1596 assert!(matches!(err, WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(_))));
1597 }
1598
1599 #[test]
1600 #[cfg(feature = "alloc")]
1601 fn decode_incomplete_element_data() {
1602 let encoded = vec![0x01, 0x05, 0xAA, 0xBB, 0xCC];
1604 let mut slice = encoded.as_slice();
1605 let mut decoder = WitnessDecoder::new();
1606
1607 assert!(decoder.push_bytes(&mut slice).unwrap().needs_more());
1608
1609 let err = decoder.end().unwrap_err();
1610 assert!(matches!(err, WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(_))));
1611 }
1612
1613 #[test]
1614 #[cfg(feature = "alloc")]
1615 fn decoder_read_limit() {
1616 let mut decoder = Witness::decoder();
1617 assert_eq!(decoder.read_limit(), 1);
1619
1620 let mut bytes = [0x01u8].as_slice();
1622 decoder.push_bytes(&mut bytes).unwrap();
1623 assert_eq!(decoder.read_limit(), 1);
1625
1626 let mut bytes = [0xFDu8].as_slice();
1628 decoder.push_bytes(&mut bytes).unwrap();
1629 assert_eq!(decoder.read_limit(), 2);
1630
1631 let mut bytes = [0xF4u8, 0x01].as_slice();
1633 decoder.push_bytes(&mut bytes).unwrap();
1634 assert_eq!(decoder.read_limit(), 500);
1636
1637 let mut bytes = [0xAAu8].as_slice();
1639 decoder.push_bytes(&mut bytes).unwrap();
1640 assert_eq!(decoder.read_limit(), 499);
1641 }
1642
1643 #[test]
1644 #[cfg(feature = "alloc")]
1645 fn decoder_end_without_witness_count_errors() {
1646 let err = WitnessDecoder::new().end().unwrap_err();
1647 assert!(matches!(
1648 err,
1649 WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(UnexpectedEofError {
1650 missing_elements: 0
1651 }))
1652 ));
1653 assert!(!err.to_string().is_empty());
1654 #[cfg(feature = "std")]
1655 assert!(err.source().is_some());
1656 }
1657
1658 #[test]
1659 #[cfg(feature = "alloc")]
1660 fn decoder_unexpected_eof_error() {
1661 let mut decoder = WitnessDecoder::new();
1662 let mut slice = [0x01].as_slice(); assert!(decoder.push_bytes(&mut slice).unwrap().needs_more());
1664
1665 let inner = match decoder.end().unwrap_err() {
1666 WitnessDecoderError(WitnessDecoderErrorInner::UnexpectedEof(inner)) => inner,
1667 err => panic!("unexpected error: {err}"),
1668 };
1669 assert!(!inner.to_string().is_empty());
1670 }
1671
1672 #[test]
1673 #[cfg(feature = "alloc")]
1674 fn decode_buffer_resizing() {
1675 let large_element = vec![0xFF; 500];
1677 let mut encoded = vec![0x02];
1678 encoded.extend_from_slice(&[0xFD, 0xF4, 0x01]);
1679 encoded.extend_from_slice(&large_element);
1680 encoded.extend_from_slice(&[0xFD, 0xF4, 0x01]);
1681 encoded.extend_from_slice(&large_element);
1682
1683 let mut slice = encoded.as_slice();
1684 let mut decoder = WitnessDecoder::new();
1685 assert!(decoder.push_bytes(&mut slice).unwrap().is_ready());
1686
1687 let witness = decoder.end().unwrap();
1688 assert_eq!(witness.len(), 2);
1689 assert_eq!(&witness[0], large_element.as_slice());
1690 assert_eq!(&witness[1], large_element.as_slice());
1691 }
1692
1693 #[test]
1694 #[cfg(feature = "alloc")]
1695 fn iter_next_none_if_cursor_decode_fails() {
1696 let witness = Witness { content: vec![], witness_elements: 1, indices_start: 0 };
1697 assert!(witness.iter().next().is_none());
1698 }
1699
1700 #[test]
1701 #[cfg(feature = "alloc")]
1702 fn iter_next_none_if_element_len_too_big() {
1703 let mut content = vec![0xFE];
1705 content.extend_from_slice(&4_000_001u32.to_le_bytes());
1706 let indices_start = content.len();
1707 content.extend_from_slice(&u32::to_ne_bytes(0));
1708
1709 let witness = Witness { content, witness_elements: 1, indices_start };
1710 assert!(witness.iter().next().is_none());
1711 }
1712
1713 #[test]
1714 #[cfg(feature = "alloc")]
1715 fn witness_debug() {
1716 let witness = Witness::from_slice(&[&[0xAAu8][..]]);
1717 let s = format!("{:?}", witness);
1718 assert!(!s.is_empty());
1719 }
1720
1721 #[test]
1722 fn size_matches_encoding_length() {
1723 let empty = Witness::new();
1724 assert_eq!(empty.size(), encoding::encode_to_vec(&empty).len());
1725
1726 let mut witness = Witness::new();
1727 witness.push([0u8; 0]);
1728 assert_eq!(witness.size(), encoding::encode_to_vec(&witness).len());
1729 witness.push([0u8; 252]);
1730 assert_eq!(witness.size(), encoding::encode_to_vec(&witness).len());
1731 witness.push([0u8; 253]);
1732 assert_eq!(witness.size(), encoding::encode_to_vec(&witness).len());
1733 }
1734
1735 #[test]
1736 #[cfg(feature = "alloc")]
1737 fn witness_encoder_len_matches_encoding_length() {
1738 use encoding::{Encode as _, ExactSizeEncoder as _};
1739
1740 fn assert_exact_len(witness: &Witness) {
1742 let encoded_len = encoding::encode_to_vec(witness).len();
1743 assert_eq!(witness.encoder().len(), encoded_len);
1744 }
1745
1746 assert_exact_len(&Witness::new());
1748
1749 let mut witness = Witness::new();
1751 witness.push([0u8; 0]);
1752 assert_exact_len(&witness);
1753
1754 let witness =
1756 Witness::from_iter([[1u8, 2, 3].as_slice(), [4u8, 5].as_slice(), [6u8].as_slice()]);
1757 assert_exact_len(&witness);
1758
1759 let mut witness = Witness::new();
1761 witness.push([0u8; 252]);
1762 assert_exact_len(&witness);
1763 witness.push([0u8; 253]);
1764 assert_exact_len(&witness);
1765
1766 let witness = (0..253u32).map(|_| [0xABu8].as_slice()).collect::<Witness>();
1769 assert_exact_len(&witness);
1770 }
1771
1772 #[test]
1773 fn decode_value_1_byte() {
1774 for v in [0x00, 0x01, 0x02, 0xFA, 0xFB, 0xFC] {
1776 let raw = [v];
1777 let mut slice = raw.as_slice();
1778 let got = decode_unchecked(&mut slice);
1779 assert_eq!(got, u64::from(v));
1780 assert!(slice.is_empty());
1781 }
1782 }
1783
1784 macro_rules! check_decode {
1785 ($($test_name:ident, $size:expr, $want:expr, $encoded:expr);* $(;)?) => {
1786 $(
1787 #[test]
1788 fn $test_name() {
1789 let mut slice = $encoded.as_slice();
1790 let got = decode_unchecked(&mut slice);
1791 assert_eq!(got, $want);
1792 assert_eq!(slice.len(), $encoded.len() - $size);
1793 }
1794 )*
1795 }
1796 }
1797
1798 check_decode! {
1799 decode_from_3_byte_slice_lower_bound, 3, 0xFD, [0xFD, 0xFD, 0x00];
1801 decode_from_3_byte_slice_three_over_lower_bound, 3, 0x0100, [0xFD, 0x00, 0x01];
1802 decode_from_3_byte_slice_endianness, 3, 0xABCD, [0xFD, 0xCD, 0xAB];
1803 decode_from_3_byte_slice_upper_bound, 3, 0xFFFF, [0xFD, 0xFF, 0xFF];
1804
1805 decode_from_5_byte_slice_lower_bound, 5, 0x0001_0000, [0xFE, 0x00, 0x00, 0x01, 0x00];
1807 decode_from_5_byte_slice_endianness, 5, 0x0123_4567, [0xFE, 0x67, 0x45, 0x23, 0x01];
1808 decode_from_5_byte_slice_upper_bound, 5, 0xFFFF_FFFF, [0xFE, 0xFF, 0xFF, 0xFF, 0xFF];
1809 decode_from_9_byte_slice_lower_bound, 9, 0x0000_0001_0000_0000, [0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00];
1811 decode_from_9_byte_slice_endianness, 9, 0x0123_4567_89AB_CDEF, [0xFF, 0xEF, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01];
1812 decode_from_9_byte_slice_upper_bound, 9, u64::MAX, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF];
1813
1814 decode_1_byte_from_bigger_slice, 1, 32, [0x20, 0xAB, 0xBC];
1816 decode_3_byte_from_bigger_slice, 3, 0xFFFF, [0xFD, 0xFF, 0xFF, 0xAB, 0xBC];
1817 decode_5_byte_from_bigger_slice, 5, 0xFFFF_FFFF, [0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xBC];
1818 decode_9_byte_from_bigger_slice, 9, u64::MAX, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xBC];
1819 }
1820
1821 #[test]
1822 #[should_panic(expected = "tried to decode an empty slice")]
1823 fn decode_from_empty_slice_panics() {
1824 let mut slice = [].as_slice();
1825 let _ = decode_unchecked(&mut slice);
1826 }
1827
1828 #[test]
1829 #[should_panic(expected = "slice too short, expected at least 5 bytes")]
1830 fn decode_non_minimal_panics() {
1832 let mut slice = [0xFE, 0xCD, 0xAB].as_slice();
1833 let _ = decode_unchecked(&mut slice);
1834 }
1835
1836 #[cfg(feature = "alloc")]
1837 #[test]
1838 fn test_dos_protection() {
1839 let mut encoded = Vec::new();
1840 encoded.extend_from_slice(&[0xFE, 0x00, 0x09, 0x3D, 0x00]); encoded.extend_from_slice(&[0xFE, 0x00, 0x09, 0x3D, 0x00]); let mut slice = encoded.as_slice();
1844 let mut dec = WitnessDecoder::new();
1845
1846 assert!(dec.push_bytes(&mut slice).unwrap().needs_more());
1847
1848 assert_eq!(dec.content.len(), 5);
1851 assert!(dec.content.capacity() < 100_000);
1852 }
1853}