Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 1c6d9a5

Browse files
committed
Added v2 host function for ecdsa_verify
1 parent c653284 commit 1c6d9a5

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

primitives/core/src/ecdsa.rs

+31-6
Original file line numberDiff line numberDiff line change
@@ -382,10 +382,7 @@ impl From<(libsecp256k1::Signature, libsecp256k1::RecoveryId)> for Signature {
382382
impl<'a> TryFrom<&'a Signature> for (libsecp256k1::Signature, libsecp256k1::RecoveryId) {
383383
type Error = ();
384384
fn try_from(x: &'a Signature) -> Result<(libsecp256k1::Signature, libsecp256k1::RecoveryId), Self::Error> {
385-
Ok((
386-
libsecp256k1::Signature::parse_overflowing_slice(&x.0[0..64]).expect("hardcoded to 64 bytes; qed"),
387-
libsecp256k1::RecoveryId::parse(x.0[64]).map_err(|_| ())?,
388-
))
385+
parse_signature(&x.0).map_err(|_| ())
389386
}
390387
}
391388

@@ -511,8 +508,10 @@ impl TraitPair for Pair {
511508
fn verify_weak<P: AsRef<[u8]>, M: AsRef<[u8]>>(sig: &[u8], message: M, pubkey: P) -> bool {
512509
let message = libsecp256k1::Message::parse(&blake2_256(message.as_ref()));
513510
if sig.len() != 65 { return false }
514-
let ri = match libsecp256k1::RecoveryId::parse(sig[64]) { Ok(x) => x, _ => return false };
515-
let sig = match libsecp256k1::Signature::parse_overflowing_slice(&sig[0..64]) { Ok(x) => x, _ => return false };
511+
let (sig, ri) = match parse_signature(&sig) {
512+
Ok(sigri) => sigri,
513+
_ => return false,
514+
};
516515
match libsecp256k1::recover(&message, &sig, &ri) {
517516
Ok(actual) => pubkey.as_ref() == &actual.serialize()[1..],
518517
_ => false,
@@ -565,6 +564,32 @@ impl Pair {
565564
_ => false,
566565
}
567566
}
567+
568+
/// Verify a signature on a message. Returns true if the signature is good.
569+
/// Parses Signature using parse_overflowing_slice
570+
pub fn verify_deprecated<M: AsRef<[u8]>>(sig: &Signature, message: M, pubkey: &Public) -> bool {
571+
let message = libsecp256k1::Message::parse(&blake2_256(message.as_ref()));
572+
let (sig, ri) = match parse_signature_deprecated(&sig.0) {
573+
Ok(sigri) => sigri,
574+
_ => return false
575+
};
576+
match libsecp256k1::recover(&message, &sig, &ri) {
577+
Ok(actual) => pubkey.0[..] == actual.serialize_compressed()[..],
578+
_ => false,
579+
}
580+
}
581+
}
582+
583+
fn parse_signature(x: &[u8]) -> Result<(libsecp256k1::Signature, libsecp256k1::RecoveryId), libsecp256k1::Error> {
584+
let sig = libsecp256k1::Signature::parse_standard_slice(&x[0..64])?;
585+
let ri = libsecp256k1::RecoveryId::parse(x[64])?;
586+
Ok((sig, ri))
587+
}
588+
589+
fn parse_signature_deprecated(x: &[u8]) -> Result<(libsecp256k1::Signature, libsecp256k1::RecoveryId), libsecp256k1::Error> {
590+
let sig = libsecp256k1::Signature::parse_overflowing_slice(&x[0..64])?;
591+
let ri = libsecp256k1::RecoveryId::parse(x[64])?;
592+
Ok((sig, ri))
568593
}
569594

570595
impl CryptoType for Public {

primitives/io/src/lib.rs

+12
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,18 @@ pub trait Crypto {
740740
/// Verify `ecdsa` signature.
741741
///
742742
/// Returns `true` when the verification was successful.
743+
fn ecdsa_verify(
744+
sig: &ecdsa::Signature,
745+
msg: &[u8],
746+
pub_key: &ecdsa::Public,
747+
) -> bool {
748+
ecdsa::Pair::verify_deprecated(sig, msg, pub_key)
749+
}
750+
751+
/// Verify `ecdsa` signature.
752+
///
753+
/// Returns `true` when the verification was successful.
754+
#[version(2)]
743755
fn ecdsa_verify(
744756
sig: &ecdsa::Signature,
745757
msg: &[u8],

0 commit comments

Comments
 (0)