diff --git a/src/ecdsa/signer.rs b/src/ecdsa/signer.rs index 102c4e3a..15dd5ac3 100644 --- a/src/ecdsa/signer.rs +++ b/src/ecdsa/signer.rs @@ -7,7 +7,6 @@ use crate::{object, Client}; use ecdsa::{ der, elliptic_curve::{ - consts::{U32, U48}, generic_array::ArrayLength, point::PointCompression, sec1::{self, FromEncodedPoint, ToEncodedPoint}, @@ -122,39 +121,31 @@ where type VerifyingKey = VerifyingKey; } -impl PrehashSigner> for Signer { - /// Compute a fixed-size P-256 ECDSA signature of a digest output. - fn sign_prehash(&self, prehash: &[u8]) -> Result, Error> { - self.sign_prehash_ecdsa(prehash) - } -} - -impl DigestSigner> for Signer -where - D: Digest + Default, -{ - /// Compute a fixed-sized P-256 ECDSA signature of the given digest - fn try_sign_digest(&self, digest: D) -> Result, Error> { - self.sign_prehash(&digest.finalize()) - } -} - -impl PrehashSigner> for Signer { - /// Compute a fixed-size P-384 ECDSA signature of a digest output. - fn sign_prehash(&self, prehash: &[u8]) -> Result, Error> { - self.sign_prehash_ecdsa(prehash) - } -} - -impl DigestSigner> for Signer -where - D: Digest + Default, -{ - /// Compute a fixed-sized P-384 ECDSA signature of the given digest - fn try_sign_digest(&self, digest: D) -> Result, Error> { - self.sign_prehash(&digest.finalize()) - } -} +macro_rules! impl_signer { + ($curve:ty) => { + impl PrehashSigner> for Signer<$curve> { + /// Compute a fixed-size ECDSA signature of a digest output. + fn sign_prehash(&self, prehash: &[u8]) -> Result, Error> { + self.sign_prehash_ecdsa(prehash) + } + } + + impl DigestSigner<<$curve as DigestPrimitive>::Digest, Signature<$curve>> + for Signer<$curve> + { + /// Compute a fixed-sized ECDSA signature of the given digest + fn try_sign_digest( + &self, + digest: <$curve as DigestPrimitive>::Digest, + ) -> Result, Error> { + self.sign_prehash(&digest.finalize()) + } + } + }; +} + +impl_signer!(NistP256); +impl_signer!(NistP384); #[cfg(feature = "secp256k1")] impl PrehashSigner> for Signer { @@ -179,24 +170,28 @@ impl PrehashSigner<(Signature, RecoveryId)> for Signer { } #[cfg(feature = "secp256k1")] -impl DigestSigner> for Signer -where - D: Digest + Default, +impl DigestSigner<::Digest, Signature> + for Signer { /// Compute a fixed-size secp256k1 ECDSA signature of the given digest - fn try_sign_digest(&self, digest: D) -> Result, Error> { + fn try_sign_digest( + &self, + digest: ::Digest, + ) -> Result, Error> { self.sign_prehash(&digest.finalize()) } } #[cfg(feature = "secp256k1")] -impl DigestSigner, RecoveryId)> for Signer -where - D: Digest + Default, +impl DigestSigner<::Digest, (Signature, RecoveryId)> + for Signer { /// Compute a fixed-size secp256k1 ECDSA signature of the given digest along with the recovery /// ID. - fn try_sign_digest(&self, digest: D) -> Result<(Signature, RecoveryId), Error> { + fn try_sign_digest( + &self, + digest: ::Digest, + ) -> Result<(Signature, RecoveryId), Error> { self.sign_prehash(&digest.finalize()) } }