From d60b89112606df822f5bc3c2e00ff66fd2787ce0 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Tue, 20 Jun 2023 05:10:32 +1000 Subject: [PATCH] Add a verify function to PublicKey Expose signature verification functionality for schnorr signatures on the `XOnlyPublicKey` type. --- src/key.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/key.rs b/src/key.rs index c7559c754..0eb747e55 100644 --- a/src/key.rs +++ b/src/key.rs @@ -12,12 +12,10 @@ use serde::ser::SerializeTuple; use crate::ffi::types::c_uint; use crate::ffi::{self, CPtr}; -#[cfg(all(feature = "global-context", feature = "rand-std"))] -use crate::schnorr; use crate::Error::{self, InvalidPublicKey, InvalidPublicKeySum, InvalidSecretKey}; -use crate::{constants, from_hex, Scalar, Secp256k1, Signing, Verification}; +use crate::{constants, from_hex, schnorr, Message, Scalar, Secp256k1, Signing, Verification}; #[cfg(feature = "global-context")] -use crate::{ecdsa, Message, SECP256K1}; +use crate::{ecdsa, SECP256K1}; #[cfg(feature = "bitcoin_hashes")] use crate::{hashes, ThirtyTwoByteHash}; @@ -1316,6 +1314,16 @@ impl XOnlyPublicKey { pub fn public_key(&self, parity: Parity) -> PublicKey { PublicKey::from_x_only_public_key(*self, parity) } + + /// Checks that `sig` is a valid schnorr signature for `msg` using this public key. + pub fn verify( + &self, + secp: &Secp256k1, + msg: &Message, + sig: &schnorr::Signature, + ) -> Result<(), Error> { + secp.verify_schnorr(sig, msg, self) + } } /// Represents the parity passed between FFI function calls.