3535//! ```
3636//! use bech32::{Bech32, Bech32m, Fe32, Hrp};
3737//! use bech32::primitives::decode::{CheckedHrpstring, SegwitHrpstring, UncheckedHrpstring};
38+ //! use bech32::segwit::VERSION_1;
3839//!
3940//! // An arbitrary HRP and a string of valid bech32 characters.
4041//! let s = "abcd143hj65vxw49rts6kcw35u6r6tgzguyr03vvveeewjqpn05efzq444444";
6667//! let segwit = SegwitHrpstring::new(address).expect("valid segwit address");
6768//! let _encoded_data = segwit.byte_iter();
6869//! assert_eq!(segwit.hrp(), Hrp::parse("bc").unwrap());
69- //! assert_eq!(segwit.witness_version(), Fe32::P );
70+ //! assert_eq!(segwit.witness_version(), VERSION_1 );
7071//! ```
7172//!
7273//! [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
@@ -78,6 +79,7 @@ use crate::primitives::checksum::{self, Checksum};
7879use crate :: primitives:: gf32:: Fe32 ;
7980use crate :: primitives:: hrp:: { self , Hrp } ;
8081use crate :: primitives:: iter:: { Fe32IterExt , FesToBytes } ;
82+ use crate :: primitives:: segwit:: { self , WitnessLengthError , VERSION_0 } ;
8183use crate :: { write_err, Bech32 , Bech32m } ;
8284
8385/// Separator between the hrp and payload (as defined by BIP-173).
@@ -274,7 +276,7 @@ impl<'s> CheckedHrpstring<'s> {
274276 self . data = & self . data [ 1 ..] ; // Remove the witness version byte from data.
275277
276278 self . validate_padding ( ) ?;
277- self . validate_witness_length ( witness_version) ?;
279+ self . validate_witness_program_length ( witness_version) ?;
278280
279281 Ok ( SegwitHrpstring { hrp : self . hrp ( ) , witness_version, data : self . data } )
280282 }
@@ -319,21 +321,11 @@ impl<'s> CheckedHrpstring<'s> {
319321 /// Validates the segwit witness length rules.
320322 ///
321323 /// Must be called after the witness version byte is removed from the data.
322- #[ allow( clippy:: manual_range_contains) ] // For witness length range check.
323- fn validate_witness_length ( & self , witness_version : Fe32 ) -> Result < ( ) , WitnessLengthError > {
324- use WitnessLengthError :: * ;
325-
326- let witness_len = self . byte_iter ( ) . len ( ) ;
327- if witness_len < 2 {
328- return Err ( TooShort ) ;
329- }
330- if witness_len > 40 {
331- return Err ( TooLong ) ;
332- }
333- if witness_version == Fe32 :: Q && witness_len != 20 && witness_len != 32 {
334- return Err ( InvalidSegwitV0 ) ;
335- }
336- Ok ( ( ) )
324+ fn validate_witness_program_length (
325+ & self ,
326+ witness_version : Fe32 ,
327+ ) -> Result < ( ) , WitnessLengthError > {
328+ segwit:: validate_witness_program_length ( self . byte_iter ( ) . len ( ) , witness_version)
337329 }
338330}
339331
@@ -383,7 +375,7 @@ impl<'s> SegwitHrpstring<'s> {
383375 }
384376
385377 let checked: CheckedHrpstring < ' s > = match witness_version {
386- Fe32 :: Q => unchecked. validate_and_remove_checksum :: < Bech32 > ( ) ?,
378+ VERSION_0 => unchecked. validate_and_remove_checksum :: < Bech32 > ( ) ?,
387379 _ => unchecked. validate_and_remove_checksum :: < Bech32m > ( ) ?,
388380 } ;
389381
@@ -770,41 +762,6 @@ impl std::error::Error for ChecksumError {
770762 }
771763}
772764
773- /// Witness program invalid because of incorrect length.
774- #[ derive( Debug , Clone , PartialEq , Eq ) ]
775- #[ non_exhaustive]
776- pub enum WitnessLengthError {
777- /// The witness data is too short.
778- TooShort ,
779- /// The witness data is too long.
780- TooLong ,
781- /// The segwit v0 witness is not 20 or 32 bytes long.
782- InvalidSegwitV0 ,
783- }
784-
785- impl fmt:: Display for WitnessLengthError {
786- fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
787- use WitnessLengthError :: * ;
788-
789- match * self {
790- TooShort => write ! ( f, "witness program is less than 2 bytes long" ) ,
791- TooLong => write ! ( f, "witness program is more than 40 bytes long" ) ,
792- InvalidSegwitV0 => write ! ( f, "the segwit v0 witness is not 20 or 32 bytes long" ) ,
793- }
794- }
795- }
796-
797- #[ cfg( feature = "std" ) ]
798- impl std:: error:: Error for WitnessLengthError {
799- fn source ( & self ) -> Option < & ( dyn std:: error:: Error + ' static ) > {
800- use WitnessLengthError :: * ;
801-
802- match * self {
803- TooShort | TooLong | InvalidSegwitV0 => None ,
804- }
805- }
806- }
807-
808765/// Error validating the padding bits on the witness data.
809766#[ derive( Debug , Clone , PartialEq , Eq ) ]
810767pub enum PaddingError {
0 commit comments