Skip to content

Commit

Permalink
Add global context API
Browse files Browse the repository at this point in the history
Our API often involves a `Secp256k1` parameter, when users enable the
`global-context` feature they must then pass `SECP256K1` into these
functions. This is kind of clunky since the global is by definition
available everywhere.

Make the API more ergonomic for `global-context` builds by adding
various API functions/methods that use the global context implicitly.
  • Loading branch information
tcharding committed Feb 9, 2022
1 parent ecb6261 commit bec8929
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/ecdsa/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ mod recovery;
#[cfg_attr(docsrs, doc(cfg(feature = "recovery")))]
pub use self::recovery::{RecoveryId, RecoverableSignature};

#[cfg(feature = "global-context")]
use SECP256K1;

/// An ECDSA signature
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Signature(pub(crate) ffi::Signature);
Expand Down Expand Up @@ -269,6 +272,13 @@ impl Signature {
}
ret
}

/// Verifies an ECDSA signature for `msg` using `pk` and the global [`SECP256K1`] context.
#[cfg(feature = "global-context")]
#[cfg_attr(docsrs, doc(cfg(feature = "global-context")))]
pub fn verify(&self, msg: &Message, pk: &PublicKey) -> Result<(), Error> {
SECP256K1.verify_ecdsa(msg, self, pk)
}
}

impl CPtr for Signature {
Expand Down
8 changes: 8 additions & 0 deletions src/ecdsa/recovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,14 @@ impl RecoverableSignature {
Signature(ret)
}
}

/// Determines the public key for which this [`Signature`] is valid for `msg`. Requires a
/// verify-capable context.
#[cfg(feature = "global-context")]
#[cfg_attr(docsrs, doc(cfg(feature = "global-context")))]
pub fn recover(&self, msg: &Message) -> Result<key::PublicKey, Error> {
SECP256K1.recover_ecdsa(msg, self)
}
}


Expand Down
19 changes: 19 additions & 0 deletions src/key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ use Verification;
use constants;
use ffi::{self, CPtr};

#[cfg(feature = "global-context")]
use {Message, ecdsa, SECP256K1};
#[cfg(all(feature = "global-context", feature = "rand-std"))]
use schnorr;

/// Secret 256-bit key used as `x` in an ECDSA signature.
///
/// # Examples
Expand Down Expand Up @@ -279,6 +284,13 @@ impl SecretKey {
}
}
}

/// Constructs an ECDSA signature for `msg` using the global [`SECP256K1`] context.
#[cfg(feature = "global-context")]
#[cfg_attr(docsrs, doc(cfg(feature = "global-context")))]
pub fn sign_ecdsa(&self, msg: Message) -> ecdsa::Signature {
SECP256K1.sign_ecdsa(&msg, self)
}
}

#[cfg(feature = "serde")]
Expand Down Expand Up @@ -832,6 +844,13 @@ impl KeyPair {
pub fn public_key(&self) -> XOnlyPublicKey {
XOnlyPublicKey::from_keypair(self)
}

/// Constructs an schnorr signature for `msg` using the global [`SECP256K1`] context.
#[cfg(all(feature = "global-context", feature = "rand-std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "global-context")))]
pub fn sign_schnorr(&self, msg: Message) -> schnorr::Signature {
SECP256K1.sign_schnorr(&msg, self)
}
}

impl From<KeyPair> for SecretKey {
Expand Down
10 changes: 10 additions & 0 deletions src/schnorr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ use ffi::{self, CPtr};
use {constants, Secp256k1};
use {Message, Signing, Verification, KeyPair, XOnlyPublicKey};

#[cfg(all(feature = "global-context", feature = "rand-std"))]
use SECP256K1;

/// Represents a Schnorr signature.
pub struct Signature([u8; constants::SCHNORRSIG_SIGNATURE_SIZE]);
impl_array_newtype!(Signature, u8, constants::SCHNORRSIG_SIGNATURE_SIZE);
Expand Down Expand Up @@ -88,6 +91,13 @@ impl Signature {
_ => Err(Error::InvalidSignature),
}
}

/// Verifies a schnorr signature for `msg` using `pk` and the global [`SECP256K1`] context.
#[cfg(all(feature = "global-context", feature = "rand-std"))]
#[cfg_attr(docsrs, doc(cfg(feature = "global-context")))]
pub fn verify(&self, msg: &Message, pk: &XOnlyPublicKey) -> Result<(), Error> {
SECP256K1.verify_schnorr(self, msg, pk)
}
}

impl<C: Signing> Secp256k1<C> {
Expand Down

0 comments on commit bec8929

Please sign in to comment.