Skip to content

Commit 213426d

Browse files
author
Danny van Heumen
committed
dsa: implement Signer and Verifier using SHA-256 as default
1 parent ace98c8 commit 213426d

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

dsa/src/signing_key.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use pkcs8::{
1414
use rand::{CryptoRng, RngCore};
1515
use signature::{
1616
hazmat::{PrehashSigner, RandomizedPrehashSigner},
17-
DigestSigner, RandomizedDigestSigner,
17+
DigestSigner, RandomizedDigestSigner, Signer,
1818
};
1919
use zeroize::{Zeroize, Zeroizing};
2020

@@ -95,6 +95,13 @@ impl SigningKey {
9595
}
9696
}
9797

98+
impl Signer<Signature> for SigningKey {
99+
fn try_sign(&self, msg: &[u8]) -> Result<Signature, signature::Error> {
100+
let digest = sha2::Sha256::new_with_prefix(msg);
101+
self.try_sign_digest(digest)
102+
}
103+
}
104+
98105
impl PrehashSigner<Signature> for SigningKey {
99106
fn sign_prehash(&self, prehash: &[u8]) -> Result<Signature, signature::Error> {
100107
let k_kinv = crate::generate::secret_number_rfc6979::<sha2::Sha256>(self, prehash);

dsa/src/verifying_key.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use pkcs8::{
1111
der::{asn1::UIntRef, AnyRef, Decode, Encode},
1212
spki, AlgorithmIdentifier, DecodePublicKey, EncodePublicKey, SubjectPublicKeyInfo,
1313
};
14-
use signature::{hazmat::PrehashVerifier, DigestVerifier};
14+
use signature::{hazmat::PrehashVerifier, DigestVerifier, Verifier};
1515

1616
/// DSA public key.
1717
#[derive(Clone, PartialEq, PartialOrd)]
@@ -75,6 +75,12 @@ impl VerifyingKey {
7575
}
7676
}
7777

78+
impl Verifier<Signature> for VerifyingKey {
79+
fn verify(&self, msg: &[u8], signature: &Signature) -> Result<(), signature::Error> {
80+
self.verify_digest(sha2::Sha256::new_with_prefix(msg), signature)
81+
}
82+
}
83+
7884
impl PrehashVerifier<Signature> for VerifyingKey {
7985
fn verify_prehash(
8086
&self,

dsa/tests/signature.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use pkcs8::der::{Decode, Encode};
66
use rand::{CryptoRng, RngCore, SeedableRng};
77
use rand_chacha::ChaCha8Rng;
88
use sha2::Sha256;
9-
use signature::{DigestVerifier, RandomizedDigestSigner};
9+
use signature::{DigestVerifier, RandomizedDigestSigner, hazmat::{PrehashSigner, PrehashVerifier}, Signer, Verifier};
1010

1111
/// Seed used for the ChaCha8 RNG
1212
const SEED: u64 = 0x2103_1949;
@@ -87,3 +87,24 @@ fn verify_signature() {
8787
.verify_digest(Sha256::new().chain_update(MESSAGE), &signature)
8888
.is_ok());
8989
}
90+
91+
#[test]
92+
fn signer_verifier_signature() {
93+
let signing_key = generate_deterministic_keypair();
94+
let verifying_key = signing_key.verifying_key();
95+
let message = b"Hello world! This is the message signed as part of the testing process.";
96+
97+
// construct signature manually and by `Signer` defaults. Ensure results are identical.
98+
let manual_digest = Sha256::new_with_prefix(message).finalize();
99+
let manual_signature = signing_key.sign_prehash(&manual_digest).unwrap();
100+
let signer_signature = signing_key.sign(message);
101+
verifying_key.verify(message, &manual_signature).unwrap();
102+
verifying_key.verify(message, &signer_signature).unwrap();
103+
assert_eq!(manual_signature, signer_signature);
104+
105+
// verify signature manually and by `Verifier` defaults. Ensure signatures can be applied interchangeably.
106+
verifying_key.verify_prehash(&manual_digest, &manual_signature).unwrap();
107+
verifying_key.verify_prehash(&manual_digest, &signer_signature).unwrap();
108+
verifying_key.verify(message, &manual_signature).unwrap();
109+
verifying_key.verify(message, &signer_signature).unwrap();
110+
}

0 commit comments

Comments
 (0)