Skip to content

Commit f8bf19d

Browse files
committed
Remove context from tweaking functions
1 parent 792103b commit f8bf19d

File tree

1 file changed

+71
-52
lines changed

1 file changed

+71
-52
lines changed

src/key/mod.rs

Lines changed: 71 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -307,15 +307,21 @@ impl PublicKey {
307307
///
308308
/// Returns an error if the resulting key would be invalid.
309309
#[inline]
310-
pub fn mul_tweak<C: Verification>(
311-
mut self,
312-
secp: &Secp256k1<C>,
313-
other: &Scalar,
314-
) -> Result<PublicKey, Error> {
310+
pub fn mul_tweak(mut self, other: &Scalar) -> Result<PublicKey, Error> {
311+
// We have no seed here but we want rerandomiziation to happen for `rand` users.
312+
let seed = [0_u8; 32];
315313
unsafe {
316-
if ffi::secp256k1_ec_pubkey_tweak_mul(secp.ctx.as_ptr(), &mut self.0, other.as_c_ptr())
317-
== 1
318-
{
314+
let res = crate::with_global_context(
315+
|secp: &Secp256k1<crate::AllPreallocated>| {
316+
ffi::secp256k1_ec_pubkey_tweak_mul(
317+
secp.ctx.as_ptr(),
318+
&mut self.0,
319+
other.as_c_ptr(),
320+
)
321+
},
322+
Some(&seed),
323+
);
324+
if res == 1 {
319325
Ok(self)
320326
} else {
321327
Err(Error::InvalidTweak)
@@ -649,21 +655,24 @@ impl Keypair {
649655
/// let tweak = Scalar::random();
650656
///
651657
/// let mut keypair = Keypair::new(&secp, &mut rand::rng());
652-
/// let tweaked = keypair.add_xonly_tweak(&secp, &tweak).expect("Improbable to fail with a randomly generated tweak");
658+
/// let tweaked = keypair.add_xonly_tweak(&tweak).expect("Improbable to fail with a randomly generated tweak");
653659
/// # }
654660
/// ```
655661
// TODO: Add checked implementation
656662
#[inline]
657-
pub fn add_xonly_tweak<C: Verification>(
658-
mut self,
659-
secp: &Secp256k1<C>,
660-
tweak: &Scalar,
661-
) -> Result<Keypair, Error> {
663+
pub fn add_xonly_tweak(mut self, tweak: &Scalar) -> Result<Keypair, Error> {
664+
// We have no seed here but we want rerandomiziation to happen for `rand` users.
665+
let seed = [0_u8; 32];
662666
unsafe {
663-
let err = ffi::secp256k1_keypair_xonly_tweak_add(
664-
secp.ctx.as_ptr(),
665-
&mut self.0,
666-
tweak.as_c_ptr(),
667+
let err = crate::with_global_context(
668+
|secp: &Secp256k1<crate::AllPreallocated>| {
669+
ffi::secp256k1_keypair_xonly_tweak_add(
670+
secp.ctx.as_ptr(),
671+
&mut self.0,
672+
tweak.as_c_ptr(),
673+
)
674+
},
675+
Some(&seed),
667676
);
668677
if err != 1 {
669678
return Err(Error::InvalidTweak);
@@ -981,32 +990,40 @@ impl XOnlyPublicKey {
981990
///
982991
/// let mut keypair = Keypair::new(&secp, &mut rand::rng());
983992
/// let (xonly, _parity) = keypair.x_only_public_key();
984-
/// let tweaked = xonly.add_tweak(&secp, &tweak).expect("Improbable to fail with a randomly generated tweak");
993+
/// let tweaked = xonly.add_tweak(&tweak).expect("Improbable to fail with a randomly generated tweak");
985994
/// # }
986995
/// ```
987-
pub fn add_tweak<V: Verification>(
988-
mut self,
989-
secp: &Secp256k1<V>,
990-
tweak: &Scalar,
991-
) -> Result<(XOnlyPublicKey, Parity), Error> {
996+
pub fn add_tweak(mut self, tweak: &Scalar) -> Result<(XOnlyPublicKey, Parity), Error> {
992997
let mut pk_parity = 0;
998+
// We have no seed here but we want rerandomiziation to happen for `rand` users.
999+
let seed = [0_u8; 32];
9931000
unsafe {
9941001
let mut pubkey = ffi::PublicKey::new();
995-
let mut err = ffi::secp256k1_xonly_pubkey_tweak_add(
996-
secp.ctx.as_ptr(),
997-
&mut pubkey,
998-
self.as_c_ptr(),
999-
tweak.as_c_ptr(),
1002+
let mut err = crate::with_global_context(
1003+
|secp: &Secp256k1<crate::AllPreallocated>| {
1004+
ffi::secp256k1_xonly_pubkey_tweak_add(
1005+
secp.ctx.as_ptr(),
1006+
&mut pubkey,
1007+
self.as_c_ptr(),
1008+
tweak.as_c_ptr(),
1009+
)
1010+
},
1011+
Some(&seed),
10001012
);
10011013
if err != 1 {
10021014
return Err(Error::InvalidTweak);
10031015
}
10041016

1005-
err = ffi::secp256k1_xonly_pubkey_from_pubkey(
1006-
secp.ctx.as_ptr(),
1007-
&mut self.0,
1008-
&mut pk_parity,
1009-
&pubkey,
1017+
err = crate::with_global_context(
1018+
|secp: &Secp256k1<crate::AllPreallocated>| {
1019+
ffi::secp256k1_xonly_pubkey_from_pubkey(
1020+
secp.ctx.as_ptr(),
1021+
&mut self.0,
1022+
&mut pk_parity,
1023+
&pubkey,
1024+
)
1025+
},
1026+
Some(&seed),
10101027
);
10111028
if err == 0 {
10121029
return Err(Error::InvalidPublicKey);
@@ -1042,25 +1059,31 @@ impl XOnlyPublicKey {
10421059
/// let mut keypair = Keypair::new(&secp, &mut rand::rng());
10431060
/// let (mut public_key, _) = keypair.x_only_public_key();
10441061
/// let original = public_key;
1045-
/// let (tweaked, parity) = public_key.add_tweak(&secp, &tweak).expect("Improbable to fail with a randomly generated tweak");
1046-
/// assert!(original.tweak_add_check(&secp, &tweaked, parity, tweak));
1062+
/// let (tweaked, parity) = public_key.add_tweak(&tweak).expect("Improbable to fail with a randomly generated tweak");
1063+
/// assert!(original.tweak_add_check(&tweaked, parity, tweak));
10471064
/// # }
10481065
/// ```
1049-
pub fn tweak_add_check<V: Verification>(
1066+
pub fn tweak_add_check(
10501067
&self,
1051-
secp: &Secp256k1<V>,
10521068
tweaked_key: &Self,
10531069
tweaked_parity: Parity,
10541070
tweak: Scalar,
10551071
) -> bool {
10561072
let tweaked_ser = tweaked_key.serialize();
1073+
// We have no seed here but we want rerandomiziation to happen for `rand` users.
1074+
let seed = [0_u8; 32];
10571075
unsafe {
1058-
let err = ffi::secp256k1_xonly_pubkey_tweak_add_check(
1059-
secp.ctx.as_ptr(),
1060-
tweaked_ser.as_c_ptr(),
1061-
tweaked_parity.to_i32(),
1062-
&self.0,
1063-
tweak.as_c_ptr(),
1076+
let err = crate::with_global_context(
1077+
|secp: &Secp256k1<crate::AllPreallocated>| {
1078+
ffi::secp256k1_xonly_pubkey_tweak_add_check(
1079+
secp.ctx.as_ptr(),
1080+
tweaked_ser.as_c_ptr(),
1081+
tweaked_parity.to_i32(),
1082+
&self.0,
1083+
tweak.as_c_ptr(),
1084+
)
1085+
},
1086+
Some(&seed),
10641087
);
10651088

10661089
err == 1
@@ -1690,8 +1713,6 @@ mod test {
16901713
#[test]
16911714
#[cfg(feature = "std")]
16921715
fn tweak_mul_arbitrary_data() {
1693-
let s = Secp256k1::new();
1694-
16951716
let (sk, pk) = crate::test_random_keypair();
16961717
assert_eq!(PublicKey::from_secret_key(&sk), pk); // Sanity check.
16971718

@@ -1700,7 +1721,7 @@ mod test {
17001721

17011722
let tweaked_sk = sk.mul_tweak(&tweak).unwrap();
17021723
assert_ne!(sk, tweaked_sk); // Make sure we did something.
1703-
let tweaked_pk = pk.mul_tweak(&s, &tweak).unwrap();
1724+
let tweaked_pk = pk.mul_tweak(&tweak).unwrap();
17041725
assert_ne!(pk, tweaked_pk);
17051726
assert_eq!(PublicKey::from_secret_key(&tweaked_sk), tweaked_pk);
17061727
}
@@ -1925,24 +1946,22 @@ mod test {
19251946
#[test]
19261947
#[cfg(feature = "std")]
19271948
fn test_tweak_add_then_tweak_add_check() {
1928-
let s = Secp256k1::new();
1929-
19301949
for _ in 0..10 {
19311950
let tweak = Scalar::test_random();
19321951

19331952
let kp = Keypair::test_random();
19341953
let (xonly, _) = XOnlyPublicKey::from_keypair(&kp);
19351954

1936-
let tweaked_kp = kp.add_xonly_tweak(&s, &tweak).expect("keypair tweak add failed");
1955+
let tweaked_kp = kp.add_xonly_tweak(&tweak).expect("keypair tweak add failed");
19371956
let (tweaked_xonly, parity) =
1938-
xonly.add_tweak(&s, &tweak).expect("xonly pubkey tweak failed");
1957+
xonly.add_tweak(&tweak).expect("xonly pubkey tweak failed");
19391958

19401959
let (want_tweaked_xonly, tweaked_kp_parity) = XOnlyPublicKey::from_keypair(&tweaked_kp);
19411960

19421961
assert_eq!(tweaked_xonly, want_tweaked_xonly);
19431962
assert_eq!(parity, tweaked_kp_parity);
19441963

1945-
assert!(xonly.tweak_add_check(&s, &tweaked_xonly, parity, tweak));
1964+
assert!(xonly.tweak_add_check(&tweaked_xonly, parity, tweak));
19461965
}
19471966
}
19481967

0 commit comments

Comments
 (0)