@@ -159,41 +159,44 @@ impl DescriptorXKey<bip32::ExtendedPrivKey> {
159
159
& self ,
160
160
secp : & Secp256k1 < C > ,
161
161
) -> Result < DescriptorXKey < bip32:: ExtendedPubKey > , DescriptorKeyParseError > {
162
- let path_len = ( & self . derivation_path ) . as_ref ( ) . len ( ) ;
163
- let public_suffix_len = ( & self . derivation_path )
162
+ let unhardened = self
163
+ . derivation_path
164
164
. into_iter ( )
165
165
. rev ( )
166
166
. take_while ( |c| c. is_normal ( ) )
167
167
. count ( ) ;
168
+ let last_hardened_idx = self . derivation_path . len ( ) - unhardened;
168
169
169
- let derivation_path = & self . derivation_path [ ( path_len - public_suffix_len ) .. ] ;
170
- let deriv_on_hardened = & self . derivation_path [ .. ( path_len - public_suffix_len ) ] ;
170
+ let hardened_path = & self . derivation_path [ ..last_hardened_idx ] ;
171
+ let unhardened_path = & self . derivation_path [ last_hardened_idx.. ] ;
171
172
172
- let derived_xprv = self
173
+ let xprv = self
173
174
. xkey
174
- . derive_priv ( & secp, & deriv_on_hardened )
175
+ . derive_priv ( & secp, & hardened_path )
175
176
. map_err ( |_| DescriptorKeyParseError ( "Unable to derive the hardened steps" ) ) ?;
176
- let xpub = bip32:: ExtendedPubKey :: from_priv ( & secp, & derived_xprv ) ;
177
+ let xpub = bip32:: ExtendedPubKey :: from_priv ( & secp, & xprv ) ;
177
178
178
179
let origin = match & self . origin {
179
- & Some ( ( fingerprint, ref origin_path) ) => Some ( (
180
- fingerprint,
181
- origin_path
182
- . into_iter ( )
183
- . chain ( deriv_on_hardened. into_iter ( ) )
180
+ Some ( ( fingerprint, path) ) => Some ( (
181
+ * fingerprint,
182
+ path. into_iter ( )
183
+ . chain ( hardened_path. into_iter ( ) )
184
184
. cloned ( )
185
185
. collect ( ) ,
186
186
) ) ,
187
- & None if !deriv_on_hardened. as_ref ( ) . is_empty ( ) => {
188
- Some ( ( self . xkey . fingerprint ( & secp) , deriv_on_hardened. into ( ) ) )
187
+ None => {
188
+ if hardened_path. is_empty ( ) {
189
+ None
190
+ } else {
191
+ Some ( ( self . xkey . fingerprint ( & secp) , hardened_path. into ( ) ) )
192
+ }
189
193
}
190
- _ => self . origin . clone ( ) ,
191
194
} ;
192
195
193
196
Ok ( DescriptorXKey {
194
197
origin,
195
198
xkey : xpub,
196
- derivation_path : derivation_path . into ( ) ,
199
+ derivation_path : unhardened_path . into ( ) ,
197
200
wildcard : self . wildcard ,
198
201
} )
199
202
}
0 commit comments