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