From f80cf2cb2aa318978da3a6c5df49d82c49344763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?19=E5=B9=B4=E6=A2=A6=E9=86=92?= <3949379+getong@users.noreply.github.com> Date: Sun, 2 Mar 2025 02:04:31 +0800 Subject: [PATCH] update secp256k1 to 0.30.0 --- Cargo-minimal.lock | 13 ++++++++++--- Cargo-recent.lock | 13 ++++++++++--- bitcoin/Cargo.toml | 4 ++-- bitcoin/examples/sign-tx-taproot.rs | 2 +- bitcoin/examples/taproot-psbt.rs | 2 +- bitcoin/src/bip32.rs | 21 +++++++++++++++------ bitcoin/src/crypto/key.rs | 11 +++++++++-- bitcoin/src/crypto/sighash.rs | 3 ++- bitcoin/src/crypto/taproot.rs | 14 ++++++++++---- bitcoin/src/psbt/mod.rs | 8 ++++---- bitcoin/src/psbt/serialize.rs | 5 ++++- bitcoin/src/sign_message.rs | 4 ++-- bitcoin/src/taproot/mod.rs | 6 ++++-- 13 files changed, 74 insertions(+), 32 deletions(-) diff --git a/Cargo-minimal.lock b/Cargo-minimal.lock index 228661483a..83c663c9cd 100644 --- a/Cargo-minimal.lock +++ b/Cargo-minimal.lock @@ -55,7 +55,7 @@ dependencies = [ "bech32", "bincode", "bitcoin-internals", - "bitcoin-io", + "bitcoin-io 0.2.0", "bitcoin-primitives", "bitcoin-units", "bitcoin_hashes 0.16.0", @@ -92,6 +92,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + [[package]] name = "bitcoin-io" version = "0.2.0" @@ -132,6 +138,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ + "bitcoin-io 0.1.3", "hex-conservative 0.2.0", ] @@ -333,9 +340,9 @@ checksum = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" [[package]] name = "secp256k1" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes 0.14.0", "rand", diff --git a/Cargo-recent.lock b/Cargo-recent.lock index 2b4ef7378b..bb8ec5132d 100644 --- a/Cargo-recent.lock +++ b/Cargo-recent.lock @@ -54,7 +54,7 @@ dependencies = [ "bech32", "bincode", "bitcoin-internals", - "bitcoin-io", + "bitcoin-io 0.2.0", "bitcoin-primitives", "bitcoin-units", "bitcoin_hashes 0.16.0", @@ -91,6 +91,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + [[package]] name = "bitcoin-io" version = "0.2.0" @@ -131,6 +137,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ + "bitcoin-io 0.1.3", "hex-conservative 0.2.1", ] @@ -334,9 +341,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "secp256k1" -version = "0.29.1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes 0.14.0", "rand", diff --git a/bitcoin/Cargo.toml b/bitcoin/Cargo.toml index ab765c7e2f..56629a46c9 100644 --- a/bitcoin/Cargo.toml +++ b/bitcoin/Cargo.toml @@ -17,7 +17,7 @@ exclude = ["tests", "contrib"] [features] default = [ "std", "secp-recovery" ] std = ["base58/std", "bech32/std", "hashes/std", "hex/std", "internals/std", "io/std", "primitives/std", "secp256k1/std", "units/std", "bitcoinconsensus?/std"] -rand-std = ["secp256k1/rand-std", "std"] +rand-std = ["secp256k1/rand", "std"] rand = ["secp256k1/rand"] serde = ["dep:serde", "hashes/serde", "internals/serde", "primitives/serde", "secp256k1/serde", "units/serde"] secp-lowmemory = ["secp256k1/lowmemory"] @@ -32,7 +32,7 @@ hex = { package = "hex-conservative", version = "0.3.0", default-features = fals internals = { package = "bitcoin-internals", version = "0.4.0", features = ["alloc"] } io = { package = "bitcoin-io", version = "0.2.0", default-features = false, features = ["alloc", "hashes"] } primitives = { package = "bitcoin-primitives", version = "0.101.0", default-features = false, features = ["alloc"] } -secp256k1 = { version = "0.29.0", default-features = false, features = ["hashes", "alloc"] } +secp256k1 = { version = "0.30.0", default-features = false, features = ["hashes", "alloc", "rand"] } units = { package = "bitcoin-units", version = "0.2.0", default-features = false, features = ["alloc"] } arbitrary = { version = "1.4", optional = true } diff --git a/bitcoin/examples/sign-tx-taproot.rs b/bitcoin/examples/sign-tx-taproot.rs index ade7f2dcfb..df7532cbd8 100644 --- a/bitcoin/examples/sign-tx-taproot.rs +++ b/bitcoin/examples/sign-tx-taproot.rs @@ -71,7 +71,7 @@ fn main() { // Sign the sighash using the secp256k1 library (exported by rust-bitcoin). let tweaked: TweakedKeypair = keypair.tap_tweak(&secp, None); let msg = Message::from(sighash); - let signature = secp.sign_schnorr(&msg, &tweaked.to_inner()); + let signature = secp.sign_schnorr(msg.as_ref(), &tweaked.to_inner()); // Update the witness stack. let signature = bitcoin::taproot::Signature { signature, sighash_type }; diff --git a/bitcoin/examples/taproot-psbt.rs b/bitcoin/examples/taproot-psbt.rs index c312cf3d7a..c5bb6d34ed 100644 --- a/bitcoin/examples/taproot-psbt.rs +++ b/bitcoin/examples/taproot-psbt.rs @@ -749,7 +749,7 @@ fn sign_psbt_taproot( }; let msg = secp256k1::Message::from(hash); - let signature = secp.sign_schnorr(&msg, &keypair); + let signature = secp.sign_schnorr(msg.as_ref(), &keypair); let final_signature = taproot::Signature { signature, sighash_type }; diff --git a/bitcoin/src/bip32.rs b/bitcoin/src/bip32.rs index 832b497ad6..a25ff424dd 100644 --- a/bitcoin/src/bip32.rs +++ b/bitcoin/src/bip32.rs @@ -593,7 +593,9 @@ impl Xpriv { depth: 0, parent_fingerprint: Default::default(), child_number: ChildNumber::ZERO_NORMAL, - private_key: secp256k1::SecretKey::from_slice(&hmac_result.as_ref()[..32])?, + private_key: secp256k1::SecretKey::from_byte_array( + &hmac_result.as_ref()[..32].try_into().expect("Slice should be exactly 32 bytes"), + )?, chain_code: ChainCode::from_hmac(hmac_result), }) } @@ -665,8 +667,10 @@ impl Xpriv { hmac_engine.input(&u32::from(i).to_be_bytes()); let hmac_result: Hmac = Hmac::from_engine(hmac_engine); - let sk = secp256k1::SecretKey::from_slice(&hmac_result.as_ref()[..32]) - .expect("statistically impossible to hit"); + let sk = secp256k1::SecretKey::from_byte_array( + &hmac_result.as_ref()[..32].try_into().expect("statistically impossible to hit"), + ) + .expect("statistically impossible to hit"); let tweaked = sk.add_tweak(&self.private_key.into()).expect("statistically impossible to hit"); @@ -705,7 +709,9 @@ impl Xpriv { chain_code: data[13..45] .try_into() .expect("45 - 13 == 32, which is the ChainCode length"), - private_key: secp256k1::SecretKey::from_slice(&data[46..78])?, + private_key: secp256k1::SecretKey::from_byte_array( + &data[46..78].try_into().expect("Slice should be exactly 32 bytes"), + )?, }) } @@ -812,8 +818,11 @@ impl Xpub { hmac_engine.input(&n.to_be_bytes()); let hmac_result: Hmac = Hmac::from_engine(hmac_engine); - - let private_key = secp256k1::SecretKey::from_slice(&hmac_result.as_ref()[..32])?; + let private_key = secp256k1::SecretKey::from_byte_array( + &hmac_result.as_ref()[..32] + .try_into() + .expect("Slice should be exactly 32 bytes"), + )?; let chain_code = ChainCode::from_hmac(hmac_result); Ok((private_key, chain_code)) } diff --git a/bitcoin/src/crypto/key.rs b/bitcoin/src/crypto/key.rs index 69472b319a..7a045cfb5c 100644 --- a/bitcoin/src/crypto/key.rs +++ b/bitcoin/src/crypto/key.rs @@ -464,7 +464,12 @@ impl PrivateKey { data: &[u8], network: impl Into, ) -> Result { - Ok(PrivateKey::new(secp256k1::SecretKey::from_slice(data)?, network)) + Ok(PrivateKey::new( + secp256k1::SecretKey::from_byte_array( + data[..32].try_into().expect("Slice should be exactly 32 bytes"), + )?, + network, + )) } /// Formats the private key to WIF format. @@ -519,7 +524,9 @@ impl PrivateKey { Ok(PrivateKey { compressed, network, - inner: secp256k1::SecretKey::from_slice(&data[1..33])?, + inner: secp256k1::SecretKey::from_byte_array( + &data[1..33].try_into().expect("Slice should be exactly 32 bytes"), + )?, }) } } diff --git a/bitcoin/src/crypto/sighash.rs b/bitcoin/src/crypto/sighash.rs index e1deed7e27..ad99c3844e 100644 --- a/bitcoin/src/crypto/sighash.rs +++ b/bitcoin/src/crypto/sighash.rs @@ -2027,7 +2027,8 @@ mod tests { .unwrap(); let msg = secp256k1::Message::from(sighash); - let key_spend_sig = secp.sign_schnorr_with_aux_rand(&msg, &tweaked_keypair, &[0u8; 32]); + let key_spend_sig = + secp.sign_schnorr_with_aux_rand(msg.as_ref(), &tweaked_keypair, &[0u8; 32]); assert_eq!(expected.internal_pubkey, internal_key); assert_eq!(expected.tweak, tweak); diff --git a/bitcoin/src/crypto/taproot.rs b/bitcoin/src/crypto/taproot.rs index a0c73309ea..7a19f579ff 100644 --- a/bitcoin/src/crypto/taproot.rs +++ b/bitcoin/src/crypto/taproot.rs @@ -32,13 +32,17 @@ impl Signature { match sl.len() { 64 => { // default type - let signature = secp256k1::schnorr::Signature::from_slice(sl)?; + let signature = secp256k1::schnorr::Signature::from_byte_array( + sl[0..64].try_into().expect("Slice should be exactly 64 bytes"), + ); Ok(Signature { signature, sighash_type: TapSighashType::Default }) } 65 => { let (sighash_type, signature) = sl.split_last().expect("slice len checked == 65"); let sighash_type = TapSighashType::from_consensus_u8(*sighash_type)?; - let signature = secp256k1::schnorr::Signature::from_slice(signature)?; + let signature = secp256k1::schnorr::Signature::from_byte_array( + signature[0..64].try_into().expect("Slice should be exactly 64 bytes"), + ); Ok(Signature { signature, sighash_type }) } len => Err(SigFromSliceError::InvalidSignatureSize(len)), @@ -70,7 +74,7 @@ impl Signature { /// You can get a slice from it using deref coercions or turn it into an iterator. pub fn serialize(self) -> SerializedSignature { let mut buf = [0; serialized_signature::MAX_LEN]; - let ser_sig = self.signature.serialize(); + let ser_sig = self.signature.to_byte_array(); buf[..64].copy_from_slice(&ser_sig); let len = if self.sighash_type == TapSighashType::Default { // default sighash type, don't add extra sighash byte @@ -140,7 +144,9 @@ impl<'a> Arbitrary<'a> for Signature { let arbitrary_bytes: [u8; secp256k1::constants::SCHNORR_SIGNATURE_SIZE] = u.arbitrary()?; Ok(Signature { - signature: secp256k1::schnorr::Signature::from_slice(&arbitrary_bytes).unwrap(), + signature: secp256k1::schnorr::Signature::from_byte_array( + arbitrary_bytes[0..64].try_into().expect("Slice should be exactly 64 bytes"), + ), sighash_type: TapSighashType::arbitrary(u)?, }) } diff --git a/bitcoin/src/psbt/mod.rs b/bitcoin/src/psbt/mod.rs index 2471fc41d5..d7d6c799ff 100644 --- a/bitcoin/src/psbt/mod.rs +++ b/bitcoin/src/psbt/mod.rs @@ -445,9 +445,9 @@ impl Psbt { .to_inner(); #[cfg(feature = "rand-std")] - let signature = secp.sign_schnorr(&msg, &key_pair); + let signature = secp.sign_schnorr(msg.as_ref(), &key_pair); #[cfg(not(feature = "rand-std"))] - let signature = secp.sign_schnorr_no_aux_rand(&msg, &key_pair); + let signature = secp.sign_schnorr_no_aux_rand(msg.as_ref(), &key_pair); let signature = taproot::Signature { signature, sighash_type }; input.tap_key_sig = Some(signature); @@ -472,9 +472,9 @@ impl Psbt { self.sighash_taproot(input_index, cache, Some(lh))?; #[cfg(feature = "rand-std")] - let signature = secp.sign_schnorr(&msg, &key_pair); + let signature = secp.sign_schnorr(msg.as_ref(), &key_pair); #[cfg(not(feature = "rand-std"))] - let signature = secp.sign_schnorr_no_aux_rand(&msg, &key_pair); + let signature = secp.sign_schnorr_no_aux_rand(msg.as_ref(), &key_pair); let signature = taproot::Signature { signature, sighash_type }; input.tap_script_sigs.insert((xonly, lh), signature); diff --git a/bitcoin/src/psbt/serialize.rs b/bitcoin/src/psbt/serialize.rs index 5b505d4b77..26bfc9b320 100644 --- a/bitcoin/src/psbt/serialize.rs +++ b/bitcoin/src/psbt/serialize.rs @@ -260,7 +260,10 @@ impl Serialize for XOnlyPublicKey { impl Deserialize for XOnlyPublicKey { fn deserialize(bytes: &[u8]) -> Result { - XOnlyPublicKey::from_slice(bytes).map_err(|_| Error::InvalidXOnlyPublicKey) + XOnlyPublicKey::from_byte_array( + bytes[..32].try_into().expect("statistically impossible to hit"), + ) + .map_err(|_| Error::InvalidXOnlyPublicKey) } } diff --git a/bitcoin/src/sign_message.rs b/bitcoin/src/sign_message.rs index 045544d5e3..d5f2be8481 100644 --- a/bitcoin/src/sign_message.rs +++ b/bitcoin/src/sign_message.rs @@ -104,7 +104,7 @@ mod message_signing { pub fn serialize(&self) -> [u8; 65] { let (recid, raw) = self.signature.serialize_compact(); let mut serialized = [0u8; 65]; - serialized[0] = recid.to_i32() as u8 + if self.compressed { 31 } else { 27 }; + serialized[0] = i32::from(recid) as u8 + if self.compressed { 31 } else { 27 }; serialized[1..].copy_from_slice(&raw[..]); serialized } @@ -115,7 +115,7 @@ mod message_signing { if bytes[0] < 27 { return Err(secp256k1::Error::InvalidRecoveryId); }; - let recid = RecoveryId::from_i32(((bytes[0] - 27) & 0x03) as i32)?; + let recid = RecoveryId::try_from(((bytes[0] - 27) & 0x03) as i32)?; Ok(MessageSignature { signature: RecoverableSignature::from_compact(&bytes[1..], recid)?, compressed: ((bytes[0] - 27) & 0x04) != 0, diff --git a/bitcoin/src/taproot/mod.rs b/bitcoin/src/taproot/mod.rs index 89fa711dbf..78616db365 100644 --- a/bitcoin/src/taproot/mod.rs +++ b/bitcoin/src/taproot/mod.rs @@ -1168,8 +1168,10 @@ impl ControlBlock { }; let leaf_version = LeafVersion::from_consensus(sl[0] & TAPROOT_LEAF_MASK)?; - let internal_key = UntweakedPublicKey::from_slice(&sl[1..TAPROOT_CONTROL_BASE_SIZE]) - .map_err(TaprootError::InvalidInternalKey)?; + let internal_key = UntweakedPublicKey::from_byte_array( + &sl[1..TAPROOT_CONTROL_BASE_SIZE].try_into().expect("Slice should be exactly 32 bytes"), + ) + .map_err(TaprootError::InvalidInternalKey)?; let merkle_branch = TaprootMerkleBranch::decode(&sl[TAPROOT_CONTROL_BASE_SIZE..])?; Ok(ControlBlock { leaf_version, output_key_parity, internal_key, merkle_branch }) }