Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dsa: expose signing and verifying of prehashed hash value #558

Merged
merged 11 commits into from
Oct 22, 2022
4 changes: 2 additions & 2 deletions dsa/Cargo.toml
Original file line number Diff line number Diff line change
@@ -22,12 +22,12 @@ opaque-debug = "0.3"
pkcs8 = { version = "0.9", default-features = false, features = ["alloc"] }
rand = { version = "0.8", default-features = false }
rfc6979 = { version = "0.3", path = "../rfc6979" }
signature = { version = ">= 1.5, < 1.7", default-features = false, features = ["digest-preview", "rand-preview"] }
sha2 = { version = "0.10", default-features = false }
signature = { version = ">= 1.6.4, < 1.7", default-features = false, features = ["digest-preview", "rand-preview", "hazmat-preview"] }
zeroize = { version = "1.5", default-features = false }

[dev-dependencies]
pkcs8 = { version = "0.9", default-features = false, features = ["pem"] }
rand = "0.8"
rand_chacha = "0.3"
sha1 = "0.10"
sha2 = "0.10"
31 changes: 29 additions & 2 deletions dsa/src/signing_key.rs
Original file line number Diff line number Diff line change
@@ -12,7 +12,10 @@ use pkcs8::{
AlgorithmIdentifier, DecodePrivateKey, EncodePrivateKey, PrivateKeyInfo, SecretDocument,
};
use rand::{CryptoRng, RngCore};
use signature::{DigestSigner, RandomizedDigestSigner};
use signature::{
hazmat::{PrehashSigner, RandomizedPrehashSigner},
DigestSigner, RandomizedDigestSigner,
};
use zeroize::{Zeroize, Zeroizing};

/// DSA private key.
@@ -74,7 +77,7 @@ impl SigningKey {

let r = g.modpow(&k, p) % q;

let n = (q.bits() / 8) as usize;
let n = q.bits() / 8;
let block_size = hash.len(); // Hash function output size

let z_len = min(n, block_size);
@@ -92,6 +95,30 @@ impl SigningKey {
}
}

impl PrehashSigner<Signature> for SigningKey {
fn sign_prehash(&self, prehash: &[u8]) -> Result<Signature, signature::Error> {
let k_kinv = crate::generate::secret_number_rfc6979::<sha2::Sha256>(self, prehash);
self.sign_prehashed(k_kinv, prehash)
.ok_or_else(signature::Error::new)
}
}

impl RandomizedPrehashSigner<Signature> for SigningKey {
fn sign_prehash_with_rng(
&self,
mut rng: impl CryptoRng + RngCore,
prehash: &[u8],
) -> Result<Signature, signature::Error> {
let components = self.verifying_key.components();
if let Some(k_kinv) = crate::generate::secret_number(&mut rng, components) {
self.sign_prehashed(k_kinv, prehash)
.ok_or_else(signature::Error::new)
} else {
Err(signature::Error::new())
}
}
}

impl<D> DigestSigner<D, Signature> for SigningKey
where
D: Digest + BlockSizeUser + FixedOutputReset,
16 changes: 15 additions & 1 deletion dsa/src/verifying_key.rs
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ use pkcs8::{
der::{asn1::UIntRef, AnyRef, Decode, Encode},
spki, AlgorithmIdentifier, DecodePublicKey, EncodePublicKey, SubjectPublicKeyInfo,
};
use signature::DigestVerifier;
use signature::{hazmat::PrehashVerifier, DigestVerifier};

/// DSA public key.
#[derive(Clone, PartialEq, PartialOrd)]
@@ -75,6 +75,20 @@ impl VerifyingKey {
}
}

impl PrehashVerifier<Signature> for VerifyingKey {
fn verify_prehash(
&self,
prehash: &[u8],
signature: &Signature,
) -> Result<(), signature::Error> {
if let Some(true) = self.verify_prehashed(prehash, signature) {
Ok(())
} else {
Err(signature::Error::new())
}
}
}

impl<D> DigestVerifier<D, Signature> for VerifyingKey
where
D: Digest,