@@ -367,6 +367,22 @@ impl SecretKey {
367367 let kp = self . keypair ( secp) ;
368368 XOnlyPublicKey :: from_keypair ( & kp)
369369 }
370+
371+ /// Constructor for unit testing.
372+ #[ cfg( test) ]
373+ #[ cfg( all( feature = "rand" , feature = "std" ) ) ]
374+ pub fn test_random ( ) -> Self { Self :: new ( & mut rand:: rng ( ) ) }
375+
376+ /// Constructor for unit testing.
377+ #[ cfg( test) ]
378+ #[ cfg( not( all( feature = "rand" , feature = "std" ) ) ) ]
379+ pub fn test_random ( ) -> Self {
380+ loop {
381+ if let Ok ( ret) = Self :: from_byte_array ( crate :: test_random_32_bytes ( ) ) {
382+ return ret;
383+ }
384+ }
385+ }
370386}
371387
372388#[ cfg( feature = "serde" ) ]
@@ -1036,6 +1052,16 @@ impl Keypair {
10361052 /// [`zeroize`](https://docs.rs/zeroize) crate.
10371053 #[ inline]
10381054 pub fn non_secure_erase ( & mut self ) { self . 0 . non_secure_erase ( ) ; }
1055+
1056+ /// Constructor for unit testing.
1057+ #[ cfg( test) ]
1058+ pub fn test_random ( ) -> Self {
1059+ let sk = SecretKey :: test_random ( ) ;
1060+ crate :: with_global_context (
1061+ |secp : & Secp256k1 < crate :: AllPreallocated > | Self :: from_secret_key ( secp, & sk) ,
1062+ Some ( & sk. secret_bytes ( ) ) ,
1063+ )
1064+ }
10391065}
10401066
10411067impl fmt:: Debug for Keypair {
@@ -1733,11 +1759,8 @@ mod test {
17331759 }
17341760
17351761 #[ test]
1736- #[ cfg( all( feature = "rand" , feature = "std" ) ) ]
17371762 fn keypair_slice_round_trip ( ) {
1738- let s = Secp256k1 :: new ( ) ;
1739-
1740- let ( sk1, pk1) = s. generate_keypair ( & mut rand:: rng ( ) ) ;
1763+ let ( sk1, pk1) = crate :: test_random_keypair ( ) ;
17411764 assert_eq ! ( SecretKey :: from_byte_array( sk1. secret_bytes( ) ) , Ok ( sk1) ) ;
17421765 assert_eq ! ( PublicKey :: from_slice( & pk1. serialize( ) [ ..] ) , Ok ( pk1) ) ;
17431766 assert_eq ! ( PublicKey :: from_slice( & pk1. serialize_uncompressed( ) [ ..] ) , Ok ( pk1) ) ;
@@ -2010,15 +2033,15 @@ mod test {
20102033 }
20112034
20122035 #[ test]
2013- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2036+ #[ cfg( feature = "std" ) ]
20142037 fn tweak_add_arbitrary_data ( ) {
20152038 let s = Secp256k1 :: new ( ) ;
20162039
2017- let ( sk, pk) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2040+ let ( sk, pk) = crate :: test_random_keypair ( ) ;
20182041 assert_eq ! ( PublicKey :: from_secret_key( & s, & sk) , pk) ; // Sanity check.
20192042
20202043 // TODO: This would be better tested with a _lot_ of different tweaks.
2021- let tweak = Scalar :: random ( ) ;
2044+ let tweak = Scalar :: test_random ( ) ;
20222045
20232046 let tweaked_sk = sk. add_tweak ( & tweak) . unwrap ( ) ;
20242047 assert_ne ! ( sk, tweaked_sk) ; // Make sure we did something.
@@ -2029,11 +2052,11 @@ mod test {
20292052 }
20302053
20312054 #[ test]
2032- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2055+ #[ cfg( feature = "std" ) ]
20332056 fn tweak_add_zero ( ) {
20342057 let s = Secp256k1 :: new ( ) ;
20352058
2036- let ( sk, pk) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2059+ let ( sk, pk) = crate :: test_random_keypair ( ) ;
20372060
20382061 let tweak = Scalar :: ZERO ;
20392062
@@ -2044,40 +2067,38 @@ mod test {
20442067 }
20452068
20462069 #[ test]
2047- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2070+ #[ cfg( feature = "std" ) ]
20482071 fn tweak_mul_arbitrary_data ( ) {
20492072 let s = Secp256k1 :: new ( ) ;
20502073
2051- let ( sk, pk) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2074+ let ( sk, pk) = crate :: test_random_keypair ( ) ;
20522075 assert_eq ! ( PublicKey :: from_secret_key( & s, & sk) , pk) ; // Sanity check.
20532076
2054- // TODO: This would be better tested with a _lot_ of different tweaks.
2055- let tweak = Scalar :: random ( ) ;
2056-
2057- let tweaked_sk = sk. mul_tweak ( & tweak) . unwrap ( ) ;
2058- assert_ne ! ( sk, tweaked_sk) ; // Make sure we did something.
2059- let tweaked_pk = pk. mul_tweak ( & s, & tweak) . unwrap ( ) ;
2060- assert_ne ! ( pk, tweaked_pk) ;
2077+ for _ in 0 ..10 {
2078+ let tweak = Scalar :: test_random ( ) ;
20612079
2062- assert_eq ! ( PublicKey :: from_secret_key( & s, & tweaked_sk) , tweaked_pk) ;
2080+ let tweaked_sk = sk. mul_tweak ( & tweak) . unwrap ( ) ;
2081+ assert_ne ! ( sk, tweaked_sk) ; // Make sure we did something.
2082+ let tweaked_pk = pk. mul_tweak ( & s, & tweak) . unwrap ( ) ;
2083+ assert_ne ! ( pk, tweaked_pk) ;
2084+ assert_eq ! ( PublicKey :: from_secret_key( & s, & tweaked_sk) , tweaked_pk) ;
2085+ }
20632086 }
20642087
20652088 #[ test]
2066- #[ cfg( all( feature = "rand" , feature = "std" ) ) ]
20672089 fn tweak_mul_zero ( ) {
2068- let s = Secp256k1 :: new ( ) ;
2069- let ( sk, _) = s. generate_keypair ( & mut rand:: rng ( ) ) ;
2090+ let ( sk, _) = crate :: test_random_keypair ( ) ;
20702091
20712092 let tweak = Scalar :: ZERO ;
20722093 assert ! ( sk. mul_tweak( & tweak) . is_err( ) )
20732094 }
20742095
20752096 #[ test]
2076- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2097+ #[ cfg( feature = "std" ) ]
20772098 fn test_negation ( ) {
20782099 let s = Secp256k1 :: new ( ) ;
20792100
2080- let ( sk, pk) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2101+ let ( sk, pk) = crate :: test_random_keypair ( ) ;
20812102
20822103 assert_eq ! ( PublicKey :: from_secret_key( & s, & sk) , pk) ; // Sanity check.
20832104
@@ -2095,7 +2116,7 @@ mod test {
20952116 }
20962117
20972118 #[ test]
2098- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2119+ #[ cfg( feature = "std" ) ]
20992120 fn pubkey_hash ( ) {
21002121 use std:: collections:: hash_map:: DefaultHasher ;
21012122 use std:: collections:: HashSet ;
@@ -2107,11 +2128,10 @@ mod test {
21072128 s. finish ( )
21082129 }
21092130
2110- let s = Secp256k1 :: new ( ) ;
21112131 let mut set = HashSet :: new ( ) ;
21122132 const COUNT : usize = 1024 ;
21132133 for _ in 0 ..COUNT {
2114- let ( _, pk) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2134+ let ( _, pk) = crate :: test_random_keypair ( ) ;
21152135 let hash = hash ( & pk) ;
21162136 assert ! ( !set. contains( & hash) ) ;
21172137 set. insert ( hash) ;
@@ -2178,12 +2198,12 @@ mod test {
21782198 }
21792199
21802200 #[ test]
2181- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2201+ #[ cfg( feature = "std" ) ]
21822202 fn create_pubkey_combine ( ) {
21832203 let s = Secp256k1 :: new ( ) ;
21842204
2185- let ( sk1, pk1) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2186- let ( sk2, pk2) = s . generate_keypair ( & mut rand :: rng ( ) ) ;
2205+ let ( sk1, pk1) = crate :: test_random_keypair ( ) ;
2206+ let ( sk2, pk2) = crate :: test_random_keypair ( ) ;
21872207
21882208 let sum1 = pk1. combine ( & pk2) ;
21892209 assert ! ( sum1. is_ok( ) ) ;
@@ -2288,15 +2308,14 @@ mod test {
22882308 }
22892309
22902310 #[ test]
2291- #[ cfg( all ( feature = "rand" , feature = " std") ) ]
2311+ #[ cfg( feature = "std" ) ]
22922312 fn test_tweak_add_then_tweak_add_check ( ) {
22932313 let s = Secp256k1 :: new ( ) ;
22942314
2295- // TODO: 10 times is arbitrary, we should test this a _lot_ of times.
22962315 for _ in 0 ..10 {
2297- let tweak = Scalar :: random ( ) ;
2316+ let tweak = Scalar :: test_random ( ) ;
22982317
2299- let kp = Keypair :: new ( & s , & mut rand :: rng ( ) ) ;
2318+ let kp = Keypair :: test_random ( ) ;
23002319 let ( xonly, _) = XOnlyPublicKey :: from_keypair ( & kp) ;
23012320
23022321 let tweaked_kp = kp. add_xonly_tweak ( & s, & tweak) . expect ( "keypair tweak add failed" ) ;
@@ -2548,10 +2567,8 @@ mod test {
25482567 }
25492568
25502569 #[ test]
2551- #[ cfg( all( feature = "rand" , feature = "std" ) ) ]
25522570 fn test_keypair_from_str ( ) {
2553- let ctx = crate :: Secp256k1 :: new ( ) ;
2554- let keypair = Keypair :: new ( & ctx, & mut rand:: rng ( ) ) ;
2571+ let keypair = Keypair :: test_random ( ) ;
25552572 let mut buf = [ 0_u8 ; constants:: SECRET_KEY_SIZE * 2 ] ; // Holds hex digits.
25562573 let s = to_hex ( & keypair. secret_key ( ) . secret_bytes ( ) , & mut buf) . unwrap ( ) ;
25572574 let parsed_key = Keypair :: from_str ( s) . unwrap ( ) ;
0 commit comments