mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 08:51:09 +00:00
RUSTSEC-2021-0076 bump libsecp256k1 (#9391)
* RUSTSEC-2021-0076 bump libsecp256k1 libsecp256k1 allows overflowing signatures https://rustsec.org/advisories/RUSTSEC-2021-0076 Changes were made to conform to libsecp256k1 version differences. Closes #9356 * parse_standard_slice() -> parse_overflowing_slice() * Added v2 host function for ecdsa_verify * Add feature tag over helpers * Added ecdsa_verify v2 to test runner * PR feedback - Spaces -> tabs - renamed two helper functions * Fixed imports after rebasing * Bump rest of libsecp256k1 (and libp2p) libp2p also uses libsecp256k1 so it is required to be bumped too, along with all the version difference changes. * Add version2 for ecdsa pubkey recovery * libp2p rebase master fixes * Fix test panic when non Behaviour event is returned * Update bin/node/browser-testing/Cargo.toml * Update primitives/core/src/ecdsa.rs * Update primitives/core/src/ecdsa.rs * Update Cargo.lock Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -718,6 +718,14 @@ pub trait Crypto {
|
||||
/// Verify `ecdsa` signature.
|
||||
///
|
||||
/// Returns `true` when the verification was successful.
|
||||
fn ecdsa_verify(sig: &ecdsa::Signature, msg: &[u8], pub_key: &ecdsa::Public) -> bool {
|
||||
ecdsa::Pair::verify_deprecated(sig, msg, pub_key)
|
||||
}
|
||||
|
||||
/// Verify `ecdsa` signature.
|
||||
///
|
||||
/// Returns `true` when the verification was successful.
|
||||
#[version(2)]
|
||||
fn ecdsa_verify(sig: &ecdsa::Signature, msg: &[u8], pub_key: &ecdsa::Public) -> bool {
|
||||
ecdsa::Pair::verify(sig, msg, pub_key)
|
||||
}
|
||||
@@ -752,12 +760,38 @@ pub trait Crypto {
|
||||
sig: &[u8; 65],
|
||||
msg: &[u8; 32],
|
||||
) -> Result<[u8; 64], EcdsaVerifyError> {
|
||||
let rs =
|
||||
secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?;
|
||||
let v =
|
||||
secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8)
|
||||
.map_err(|_| EcdsaVerifyError::BadV)?;
|
||||
let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v)
|
||||
let rs = libsecp256k1::Signature::parse_overflowing_slice(&sig[0..64])
|
||||
.map_err(|_| EcdsaVerifyError::BadRS)?;
|
||||
let v = libsecp256k1::RecoveryId::parse(
|
||||
if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8
|
||||
)
|
||||
.map_err(|_| EcdsaVerifyError::BadV)?;
|
||||
let pubkey = libsecp256k1::recover(&libsecp256k1::Message::parse(msg), &rs, &v)
|
||||
.map_err(|_| EcdsaVerifyError::BadSignature)?;
|
||||
let mut res = [0u8; 64];
|
||||
res.copy_from_slice(&pubkey.serialize()[1..65]);
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
/// Verify and recover a SECP256k1 ECDSA signature.
|
||||
///
|
||||
/// - `sig` is passed in RSV format. V should be either `0/1` or `27/28`.
|
||||
/// - `msg` is the blake2-256 hash of the message.
|
||||
///
|
||||
/// Returns `Err` if the signature is bad, otherwise the 64-byte pubkey
|
||||
/// (doesn't include the 0x04 prefix).
|
||||
#[version(2)]
|
||||
fn secp256k1_ecdsa_recover(
|
||||
sig: &[u8; 65],
|
||||
msg: &[u8; 32],
|
||||
) -> Result<[u8; 64], EcdsaVerifyError> {
|
||||
let rs = libsecp256k1::Signature::parse_standard_slice(&sig[0..64])
|
||||
.map_err(|_| EcdsaVerifyError::BadRS)?;
|
||||
let v = libsecp256k1::RecoveryId::parse(
|
||||
if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8
|
||||
)
|
||||
.map_err(|_| EcdsaVerifyError::BadV)?;
|
||||
let pubkey = libsecp256k1::recover(&libsecp256k1::Message::parse(msg), &rs, &v)
|
||||
.map_err(|_| EcdsaVerifyError::BadSignature)?;
|
||||
let mut res = [0u8; 64];
|
||||
res.copy_from_slice(&pubkey.serialize()[1..65]);
|
||||
@@ -774,12 +808,35 @@ pub trait Crypto {
|
||||
sig: &[u8; 65],
|
||||
msg: &[u8; 32],
|
||||
) -> Result<[u8; 33], EcdsaVerifyError> {
|
||||
let rs =
|
||||
secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?;
|
||||
let v =
|
||||
secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8)
|
||||
.map_err(|_| EcdsaVerifyError::BadV)?;
|
||||
let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v)
|
||||
let rs = libsecp256k1::Signature::parse_overflowing_slice(&sig[0..64])
|
||||
.map_err(|_| EcdsaVerifyError::BadRS)?;
|
||||
let v = libsecp256k1::RecoveryId::parse(
|
||||
if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8
|
||||
)
|
||||
.map_err(|_| EcdsaVerifyError::BadV)?;
|
||||
let pubkey = libsecp256k1::recover(&libsecp256k1::Message::parse(msg), &rs, &v)
|
||||
.map_err(|_| EcdsaVerifyError::BadSignature)?;
|
||||
Ok(pubkey.serialize_compressed())
|
||||
}
|
||||
|
||||
/// Verify and recover a SECP256k1 ECDSA signature.
|
||||
///
|
||||
/// - `sig` is passed in RSV format. V should be either `0/1` or `27/28`.
|
||||
/// - `msg` is the blake2-256 hash of the message.
|
||||
///
|
||||
/// Returns `Err` if the signature is bad, otherwise the 33-byte compressed pubkey.
|
||||
#[version(2)]
|
||||
fn secp256k1_ecdsa_recover_compressed(
|
||||
sig: &[u8; 65],
|
||||
msg: &[u8; 32],
|
||||
) -> Result<[u8; 33], EcdsaVerifyError> {
|
||||
let rs = libsecp256k1::Signature::parse_standard_slice(&sig[0..64])
|
||||
.map_err(|_| EcdsaVerifyError::BadRS)?;
|
||||
let v = libsecp256k1::RecoveryId::parse(
|
||||
if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8
|
||||
)
|
||||
.map_err(|_| EcdsaVerifyError::BadV)?;
|
||||
let pubkey = libsecp256k1::recover(&libsecp256k1::Message::parse(msg), &rs, &v)
|
||||
.map_err(|_| EcdsaVerifyError::BadSignature)?;
|
||||
Ok(pubkey.serialize_compressed())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user