@@ -304,7 +304,7 @@ impl FromStr for DescriptorPublicKey {
304
304
) ) ;
305
305
}
306
306
307
- let ( key_part, origin) = DescriptorXKey :: < bip32 :: ExtendedPubKey > :: parse_xkey_origin ( s) ?;
307
+ let ( key_part, origin) = parse_xkey_origin ( s) ?;
308
308
309
309
if key_part. contains ( "pub" ) {
310
310
let ( xpub, derivation_path, wildcard) =
@@ -491,7 +491,7 @@ impl FromStr for DescriptorSecretKey {
491
491
type Err = DescriptorKeyParseError ;
492
492
493
493
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
494
- let ( key_part, origin) = DescriptorXKey :: < bip32 :: ExtendedPubKey > :: parse_xkey_origin ( s) ?;
494
+ let ( key_part, origin) = parse_xkey_origin ( s) ?;
495
495
496
496
if key_part. len ( ) <= 52 {
497
497
let sk = bitcoin:: PrivateKey :: from_str ( key_part)
@@ -513,64 +513,61 @@ impl FromStr for DescriptorSecretKey {
513
513
}
514
514
}
515
515
516
- impl < K : InnerXKey > DescriptorXKey < K > {
517
- fn parse_xkey_origin (
518
- s : & str ,
519
- ) -> Result < ( & str , Option < bip32:: KeySource > ) , DescriptorKeyParseError > {
520
- for ch in s. as_bytes ( ) {
521
- if * ch < 20 || * ch > 127 {
522
- return Err ( DescriptorKeyParseError (
523
- "Encountered an unprintable character" ,
524
- ) ) ;
525
- }
516
+ // Parse the origin information part of a descriptor key.
517
+ fn parse_xkey_origin ( s : & str ) -> Result < ( & str , Option < bip32:: KeySource > ) , DescriptorKeyParseError > {
518
+ for ch in s. as_bytes ( ) {
519
+ if * ch < 20 || * ch > 127 {
520
+ return Err ( DescriptorKeyParseError (
521
+ "Encountered an unprintable character" ,
522
+ ) ) ;
526
523
}
524
+ }
525
+
526
+ if s. is_empty ( ) {
527
+ return Err ( DescriptorKeyParseError ( "Empty key" ) ) ;
528
+ }
529
+ let mut parts = s[ 1 ..] . split ( ']' ) ;
530
+
531
+ if let Some ( '[' ) = s. chars ( ) . next ( ) {
532
+ let mut raw_origin = parts
533
+ . next ( )
534
+ . ok_or ( DescriptorKeyParseError ( "Unclosed '['" ) ) ?
535
+ . split ( '/' ) ;
536
+
537
+ let origin_id_hex = raw_origin. next ( ) . ok_or ( DescriptorKeyParseError (
538
+ "No master fingerprint found after '['" ,
539
+ ) ) ?;
527
540
528
- if s. is_empty ( ) {
529
- return Err ( DescriptorKeyParseError ( "Empty key" ) ) ;
541
+ if origin_id_hex. len ( ) != 8 {
542
+ return Err ( DescriptorKeyParseError (
543
+ "Master fingerprint should be 8 characters long" ,
544
+ ) ) ;
530
545
}
531
- let mut parts = s[ 1 ..] . split ( ']' ) ;
532
-
533
- if let Some ( '[' ) = s. chars ( ) . next ( ) {
534
- let mut raw_origin = parts
535
- . next ( )
536
- . ok_or ( DescriptorKeyParseError ( "Unclosed '['" ) ) ?
537
- . split ( '/' ) ;
538
-
539
- let origin_id_hex = raw_origin. next ( ) . ok_or ( DescriptorKeyParseError (
540
- "No master fingerprint found after '['" ,
541
- ) ) ?;
542
-
543
- if origin_id_hex. len ( ) != 8 {
544
- return Err ( DescriptorKeyParseError (
545
- "Master fingerprint should be 8 characters long" ,
546
- ) ) ;
547
- }
548
- let parent_fingerprint = bip32:: Fingerprint :: from_hex ( origin_id_hex) . map_err ( |_| {
549
- DescriptorKeyParseError ( "Malformed master fingerprint, expected 8 hex chars" )
550
- } ) ?;
551
- let origin_path = raw_origin
552
- . map ( bip32:: ChildNumber :: from_str)
553
- . collect :: < Result < bip32:: DerivationPath , bip32:: Error > > ( )
554
- . map_err ( |_| {
555
- DescriptorKeyParseError ( "Error while parsing master derivation path" )
556
- } ) ?;
557
-
558
- let key = parts
559
- . next ( )
560
- . ok_or ( DescriptorKeyParseError ( "No key after origin." ) ) ?;
561
-
562
- if parts. next ( ) . is_some ( ) {
563
- Err ( DescriptorKeyParseError (
564
- "Multiple ']' in Descriptor Public Key" ,
565
- ) )
566
- } else {
567
- Ok ( ( key, Some ( ( parent_fingerprint, origin_path) ) ) )
568
- }
546
+ let parent_fingerprint = bip32:: Fingerprint :: from_hex ( origin_id_hex) . map_err ( |_| {
547
+ DescriptorKeyParseError ( "Malformed master fingerprint, expected 8 hex chars" )
548
+ } ) ?;
549
+ let origin_path = raw_origin
550
+ . map ( bip32:: ChildNumber :: from_str)
551
+ . collect :: < Result < bip32:: DerivationPath , bip32:: Error > > ( )
552
+ . map_err ( |_| DescriptorKeyParseError ( "Error while parsing master derivation path" ) ) ?;
553
+
554
+ let key = parts
555
+ . next ( )
556
+ . ok_or ( DescriptorKeyParseError ( "No key after origin." ) ) ?;
557
+
558
+ if parts. next ( ) . is_some ( ) {
559
+ Err ( DescriptorKeyParseError (
560
+ "Multiple ']' in Descriptor Public Key" ,
561
+ ) )
569
562
} else {
570
- Ok ( ( s , None ) )
563
+ Ok ( ( key , Some ( ( parent_fingerprint , origin_path ) ) ) )
571
564
}
565
+ } else {
566
+ Ok ( ( s, None ) )
572
567
}
568
+ }
573
569
570
+ impl < K : InnerXKey > DescriptorXKey < K > {
574
571
/// Parse an extended key concatenated to a derivation path.
575
572
fn parse_xkey_deriv (
576
573
key_deriv : & str ,
0 commit comments