From b2aa9097ff0457393672a36d8f7c10c5c154d484 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Sat, 27 Jan 2024 18:32:56 +0100 Subject: [PATCH] feat(dsa): implement `SigningKey::sign_prehashed_rfc6979 Allows to use other digest algorithms. --- dsa/src/signing_key.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dsa/src/signing_key.rs b/dsa/src/signing_key.rs index d471aae5..698f0576 100644 --- a/dsa/src/signing_key.rs +++ b/dsa/src/signing_key.rs @@ -67,6 +67,18 @@ impl SigningKey { &self.x } + /// Try to sign the given message digest deterministically with a prehashed digest. + /// The parameter `D` must match the hash function used to sign the digest. + /// + /// [RFC6979]: https://datatracker.ietf.org/doc/html/rfc6979 + pub fn sign_prehashed_rfc6979(&self, prehash: &[u8]) -> Result + where + D: Digest + BlockSizeUser + FixedOutputReset, + { + let k_kinv = crate::generate::secret_number_rfc6979::(self, prehash); + self.sign_prehashed(k_kinv, prehash) + } + /// Sign some pre-hashed data fn sign_prehashed( &self, @@ -105,6 +117,7 @@ impl Signer for SigningKey { } impl PrehashSigner for SigningKey { + /// Warning: This uses `sha2::Sha256` as the hash function for the digest. If you need to use a different one, use [`SigningKey::sign_prehashed_rfc6979`]. fn sign_prehash(&self, prehash: &[u8]) -> Result { let k_kinv = crate::generate::secret_number_rfc6979::(self, prehash); self.sign_prehashed(k_kinv, prehash)