@@ -25,11 +25,11 @@ use core::{fmt, str::FromStr, default::Default};
25
25
26
26
use hash_types:: XpubIdentifier ;
27
27
use hashes:: { sha512, Hash , HashEngine , Hmac , HmacEngine } ;
28
- use secp256k1:: { self , Secp256k1 } ;
28
+ use secp256k1:: { self , Secp256k1 , XOnlyPublicKey } ;
29
29
30
30
use network:: constants:: Network ;
31
31
use util:: { base58, endian} ;
32
- use util:: key;
32
+ use util:: { key, ecdsa , schnorr } ;
33
33
use io:: Write ;
34
34
35
35
/// A chain code
@@ -527,6 +527,21 @@ impl ExtendedPrivKey {
527
527
} )
528
528
}
529
529
530
+ /// Constructs ECDSA compressed private key matching internal secret key representation.
531
+ pub fn to_priv ( & self ) -> ecdsa:: PrivateKey {
532
+ ecdsa:: PrivateKey {
533
+ compressed : true ,
534
+ network : self . network ,
535
+ key : self . private_key
536
+ }
537
+ }
538
+
539
+ /// Constructs BIP340 keypair for Schnorr signatures and Taproot use matching the internal
540
+ /// secret key representation.
541
+ pub fn to_keypair < C : secp256k1:: Signing > ( & self , secp : & Secp256k1 < C > ) -> schnorr:: KeyPair {
542
+ schnorr:: KeyPair :: from_seckey_slice ( secp, & self . private_key [ ..] ) . expect ( "BIP32 internal private key representation is broken" )
543
+ }
544
+
530
545
/// Attempts to derive an extended private key from a path.
531
546
///
532
547
/// The `path` argument can be both of type `DerivationPath` or `Vec<ChildNumber>`.
@@ -616,7 +631,7 @@ impl ExtendedPrivKey {
616
631
617
632
/// Returns the HASH160 of the public key belonging to the xpriv
618
633
pub fn identifier < C : secp256k1:: Signing > ( & self , secp : & Secp256k1 < C > ) -> XpubIdentifier {
619
- ExtendedPubKey :: from_private ( secp, self ) . identifier ( )
634
+ ExtendedPubKey :: from_priv ( secp, self ) . identifier ( )
620
635
}
621
636
622
637
/// Returns the first four bytes of the identifier
@@ -627,7 +642,13 @@ impl ExtendedPrivKey {
627
642
628
643
impl ExtendedPubKey {
629
644
/// Derives a public key from a private key
645
+ #[ deprecated( since = "0.28.0" , note = "use ExtendedPubKey::from_priv" ) ]
630
646
pub fn from_private < C : secp256k1:: Signing > ( secp : & Secp256k1 < C > , sk : & ExtendedPrivKey ) -> ExtendedPubKey {
647
+ ExtendedPubKey :: from_priv ( secp, sk)
648
+ }
649
+
650
+ /// Derives a public key from a private key
651
+ pub fn from_priv < C : secp256k1:: Signing > ( secp : & Secp256k1 < C > , sk : & ExtendedPrivKey ) -> ExtendedPubKey {
631
652
ExtendedPubKey {
632
653
network : sk. network ,
633
654
depth : sk. depth ,
@@ -638,6 +659,20 @@ impl ExtendedPubKey {
638
659
}
639
660
}
640
661
662
+ /// Constructs ECDSA compressed public key matching internal public key representation.
663
+ pub fn to_pub ( & self ) -> ecdsa:: PublicKey {
664
+ ecdsa:: PublicKey {
665
+ compressed : true ,
666
+ key : self . public_key
667
+ }
668
+ }
669
+
670
+ /// Constructs BIP340 x-only public key for BIP-340 signatures and Taproot use matching
671
+ /// the internal public key representation.
672
+ pub fn to_x_only_pub ( & self ) -> XOnlyPublicKey {
673
+ XOnlyPublicKey :: from ( self . public_key )
674
+ }
675
+
641
676
/// Attempts to derive an extended public key from a path.
642
677
///
643
678
/// The `path` argument can be both of type `DerivationPath` or `Vec<ChildNumber>`.
@@ -869,7 +904,7 @@ mod tests {
869
904
expected_pk : & str ) {
870
905
871
906
let mut sk = ExtendedPrivKey :: new_master ( network, seed) . unwrap ( ) ;
872
- let mut pk = ExtendedPubKey :: from_private ( secp, & sk) ;
907
+ let mut pk = ExtendedPubKey :: from_priv ( secp, & sk) ;
873
908
874
909
// Check derivation convenience method for ExtendedPrivKey
875
910
assert_eq ! (
@@ -897,15 +932,15 @@ mod tests {
897
932
match num {
898
933
Normal { ..} => {
899
934
let pk2 = pk. ckd_pub ( secp, num) . unwrap ( ) ;
900
- pk = ExtendedPubKey :: from_private ( secp, & sk) ;
935
+ pk = ExtendedPubKey :: from_priv ( secp, & sk) ;
901
936
assert_eq ! ( pk, pk2) ;
902
937
}
903
938
Hardened { ..} => {
904
939
assert_eq ! (
905
940
pk. ckd_pub( secp, num) ,
906
941
Err ( Error :: CannotDeriveFromHardenedKey )
907
942
) ;
908
- pk = ExtendedPubKey :: from_private ( secp, & sk) ;
943
+ pk = ExtendedPubKey :: from_priv ( secp, & sk) ;
909
944
}
910
945
}
911
946
}
0 commit comments