35
35
//! ```
36
36
//! use bech32::{Bech32, Bech32m, Fe32, Hrp};
37
37
//! use bech32::primitives::decode::{CheckedHrpstring, SegwitHrpstring, UncheckedHrpstring};
38
+ //! use bech32::segwit::VERSION_1;
38
39
//!
39
40
//! // An arbitrary HRP and a string of valid bech32 characters.
40
41
//! let s = "abcd143hj65vxw49rts6kcw35u6r6tgzguyr03vvveeewjqpn05efzq444444";
66
67
//! let segwit = SegwitHrpstring::new(address).expect("valid segwit address");
67
68
//! let _encoded_data = segwit.byte_iter();
68
69
//! assert_eq!(segwit.hrp(), Hrp::parse("bc").unwrap());
69
- //! assert_eq!(segwit.witness_version(), Fe32::P );
70
+ //! assert_eq!(segwit.witness_version(), VERSION_1 );
70
71
//! ```
71
72
//!
72
73
//! [BIP-173]: <https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki>
@@ -78,6 +79,7 @@ use crate::primitives::checksum::{self, Checksum};
78
79
use crate :: primitives:: gf32:: Fe32 ;
79
80
use crate :: primitives:: hrp:: { self , Hrp } ;
80
81
use crate :: primitives:: iter:: { Fe32IterExt , FesToBytes } ;
82
+ use crate :: primitives:: segwit:: { self , WitnessLengthError , VERSION_0 } ;
81
83
use crate :: { write_err, Bech32 , Bech32m } ;
82
84
83
85
/// Separator between the hrp and payload (as defined by BIP-173).
@@ -274,7 +276,7 @@ impl<'s> CheckedHrpstring<'s> {
274
276
self . data = & self . data [ 1 ..] ; // Remove the witness version byte from data.
275
277
276
278
self . validate_padding ( ) ?;
277
- self . validate_witness_length ( witness_version) ?;
279
+ self . validate_witness_program_length ( witness_version) ?;
278
280
279
281
Ok ( SegwitHrpstring { hrp : self . hrp ( ) , witness_version, data : self . data } )
280
282
}
@@ -319,21 +321,11 @@ impl<'s> CheckedHrpstring<'s> {
319
321
/// Validates the segwit witness length rules.
320
322
///
321
323
/// 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)
337
329
}
338
330
}
339
331
@@ -383,7 +375,7 @@ impl<'s> SegwitHrpstring<'s> {
383
375
}
384
376
385
377
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 > ( ) ?,
387
379
_ => unchecked. validate_and_remove_checksum :: < Bech32m > ( ) ?,
388
380
} ;
389
381
@@ -770,41 +762,6 @@ impl std::error::Error for ChecksumError {
770
762
}
771
763
}
772
764
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
-
808
765
/// Error validating the padding bits on the witness data.
809
766
#[ derive( Debug , Clone , PartialEq , Eq ) ]
810
767
pub enum PaddingError {
0 commit comments