Skip to content

Commit d161766

Browse files
committed
Upgrade to secp256k1 v0.23.0
We recently released a new version of `rust-secp256k1`, upgrade to use it.
1 parent 07692bb commit d161766

File tree

7 files changed

+29
-27
lines changed

7 files changed

+29
-27
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ rustdoc-args = ["--cfg", "docsrs"]
3636
[dependencies]
3737
bech32 = { version = "0.8.1", default-features = false }
3838
bitcoin_hashes = { version = "0.10.0", default-features = false }
39-
secp256k1 = { version = "0.22.0", default-features = false }
39+
secp256k1 = { version = "0.23.0", default-features = false }
4040
core2 = { version = "0.3.0", optional = true, default-features = false }
4141

4242
base64 = { version = "0.13.0", optional = true }
@@ -48,7 +48,7 @@ hashbrown = { version = "0.8", optional = true }
4848
[dev-dependencies]
4949
serde_json = "<1.0.45"
5050
serde_test = "1"
51-
secp256k1 = { version = "0.22.0", features = [ "recovery", "rand-std" ] }
51+
secp256k1 = { version = "0.23.0", features = [ "recovery", "rand-std" ] }
5252
bincode = "1.3.1"
5353

5454
[[example]]

src/consensus/encode.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ mod tests {
11261126

11271127
data.clear();
11281128
data64.clear();
1129-
let len = thread_rng().gen_range(1, 256);
1129+
let len = thread_rng().gen_range(1..256);
11301130
data.resize(len, 0u8);
11311131
data64.resize(len, 0u64);
11321132
let mut arr33 = [0u8; 33];

src/util/bip32.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -600,15 +600,15 @@ impl ExtendedPrivKey {
600600

601601
hmac_engine.input(&endian::u32_to_array_be(u32::from(i)));
602602
let hmac_result: Hmac<sha512::Hash> = Hmac::from_engine(hmac_engine);
603-
let mut sk = secp256k1::SecretKey::from_slice(&hmac_result[..32])?;
604-
sk.add_assign(&self.private_key[..])?;
603+
let sk = secp256k1::SecretKey::from_slice(&hmac_result[..32]).expect("statistically impossible to hit");
604+
let tweaked = sk.add_tweak(&self.private_key.into()).expect("statistically impossible to hit");
605605

606606
Ok(ExtendedPrivKey {
607607
network: self.network,
608608
depth: self.depth + 1,
609609
parent_fingerprint: self.fingerprint(secp),
610610
child_number: i,
611-
private_key: sk,
611+
private_key: tweaked,
612612
chain_code: ChainCode::from(&hmac_result[32..])
613613
})
614614
}
@@ -741,15 +741,14 @@ impl ExtendedPubKey {
741741
i: ChildNumber,
742742
) -> Result<ExtendedPubKey, Error> {
743743
let (sk, chain_code) = self.ckd_pub_tweak(i)?;
744-
let mut pk = self.public_key;
745-
pk.add_exp_assign(secp, &sk[..])?;
744+
let tweaked = self.public_key.add_exp_tweak(secp, &sk.into())?;
746745

747746
Ok(ExtendedPubKey {
748747
network: self.network,
749748
depth: self.depth + 1,
750749
parent_fingerprint: self.fingerprint(),
751750
child_number: i,
752-
public_key: pk,
751+
public_key: tweaked,
753752
chain_code,
754753
})
755754
}

src/util/merkleblock.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ mod tests {
727727
impl PartialMerkleTree {
728728
/// Flip one bit in one of the hashes - this should break the authentication
729729
fn damage(&mut self, rng: &mut ThreadRng) {
730-
let n = rng.gen_range(0, self.hashes.len());
730+
let n = rng.gen_range(0..self.hashes.len());
731731
let bit = rng.gen::<u8>();
732732
let hashes = &mut self.hashes;
733733
let mut hash = hashes[n].into_inner();

src/util/schnorr.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use core::fmt;
2222
use crate::prelude::*;
2323

2424
use secp256k1::{self, Secp256k1, Verification, constants};
25-
use crate::hashes::Hash;
2625
use crate::util::taproot::{TapBranchHash, TapTweakHash};
2726
use crate::SchnorrSighashType;
2827

@@ -111,11 +110,10 @@ impl TapTweak for UntweakedPublicKey {
111110
/// # Returns
112111
/// The tweaked key and its parity.
113112
fn tap_tweak<C: Verification>(self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> (TweakedPublicKey, secp256k1::Parity) {
114-
let tweak_value = TapTweakHash::from_key_and_tweak(self, merkle_root).into_inner();
115-
let mut output_key = self;
116-
let parity = output_key.tweak_add_assign(secp, &tweak_value).expect("Tap tweak failed");
113+
let tweak = TapTweakHash::from_key_and_tweak(self, merkle_root).to_scalar();
114+
let (output_key, parity) = self.add_tweak(secp, &tweak).expect("Tap tweak failed");
117115

118-
debug_assert!(self.tweak_add_check(secp, &output_key, parity, tweak_value));
116+
debug_assert!(self.tweak_add_check(secp, &output_key, parity, tweak));
119117
(TweakedPublicKey(output_key), parity)
120118
}
121119

@@ -140,11 +138,11 @@ impl TapTweak for UntweakedKeyPair {
140138
///
141139
/// # Returns
142140
/// The tweaked key and its parity.
143-
fn tap_tweak<C: Verification>(mut self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> TweakedKeyPair {
144-
let pubkey = crate::XOnlyPublicKey::from_keypair(&self);
145-
let tweak_value = TapTweakHash::from_key_and_tweak(pubkey, merkle_root).into_inner();
146-
self.tweak_add_assign(secp, &tweak_value).expect("Tap tweak failed");
147-
TweakedKeyPair(self)
141+
fn tap_tweak<C: Verification>(self, secp: &Secp256k1<C>, merkle_root: Option<TapBranchHash>) -> TweakedKeyPair {
142+
let (pubkey, _parity) = crate::XOnlyPublicKey::from_keypair(&self);
143+
let tweak = TapTweakHash::from_key_and_tweak(pubkey, merkle_root).to_scalar();
144+
let tweaked = self.add_xonly_tweak(secp, &tweak).expect("Tap tweak failed");
145+
TweakedKeyPair(tweaked)
148146
}
149147

150148
fn dangerous_assume_tweaked(self) -> TweakedKeyPair {

src/util/sighash.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,11 +1137,10 @@ mod tests {
11371137
};
11381138

11391139
// tests
1140-
let keypair = secp256k1::KeyPair::from_secret_key(secp, internal_priv_key);
1141-
let internal_key = XOnlyPublicKey::from_keypair(&keypair);
1140+
let keypair = secp256k1::KeyPair::from_secret_key(secp, &internal_priv_key);
1141+
let (internal_key, _parity) = XOnlyPublicKey::from_keypair(&keypair);
11421142
let tweak = TapTweakHash::from_key_and_tweak(internal_key, merkle_root);
1143-
let mut tweaked_keypair = keypair;
1144-
tweaked_keypair.tweak_add_assign(secp, &tweak).unwrap();
1143+
let tweaked_keypair = keypair.add_xonly_tweak(secp, &tweak.to_scalar()).unwrap();
11451144
let mut sig_msg = Vec::new();
11461145
cache.taproot_encode_signing_data_to(
11471146
&mut sig_msg,

src/util/taproot.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
1919
use crate::prelude::*;
2020
use crate::io;
21-
use secp256k1::{self, Secp256k1};
21+
use secp256k1::{self, Secp256k1, Scalar};
2222

2323
use core::convert::TryFrom;
2424
use core::fmt;
@@ -90,6 +90,12 @@ impl TapTweakHash {
9090
}
9191
TapTweakHash::from_engine(eng)
9292
}
93+
94+
/// Converts a `TapTweakHash` into a `Scalar` ready for use with key tweaking API.
95+
pub fn to_scalar(&self) -> Scalar {
96+
// This is statistically extremely unlikely to panic.
97+
Scalar::from_be_bytes(self.into_inner()).expect("hash value greater than curve order")
98+
}
9399
}
94100

95101
impl TapLeafHash {
@@ -847,12 +853,12 @@ impl ControlBlock {
847853
);
848854
}
849855
// compute the taptweak
850-
let tweak = TapTweakHash::from_key_and_tweak(self.internal_key, Some(curr_hash));
856+
let tweak = TapTweakHash::from_key_and_tweak(self.internal_key, Some(curr_hash)).to_scalar();
851857
self.internal_key.tweak_add_check(
852858
secp,
853859
&output_key,
854860
self.output_key_parity,
855-
tweak.into_inner(),
861+
tweak,
856862
)
857863
}
858864
}

0 commit comments

Comments
 (0)