Skip to content

Commit 923fe6f

Browse files
authored
Update to signature::DigestSigner/Verifier changes (#1064)
Companion PR to RustCrypto/traits#2004
1 parent 2cd53cf commit 923fe6f

File tree

14 files changed

+274
-69
lines changed

14 files changed

+274
-69
lines changed

Cargo.lock

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ lms-signature = { path = "./lms" }
2525
ml-dsa = { path = "./ml-dsa" }
2626
rfc6979 = { path = "./rfc6979" }
2727
slh-dsa = { path = "./slh-dsa" }
28+
29+
# https://github.com/RustCrypto/traits/pull/2004
30+
signature = { git = "https://github.com/RustCrypto/traits", rev = "77c001c5abdfea97c7710173c196c76253490734" }

dsa/examples/sign.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ fn main() {
1111
let signing_key = SigningKey::generate(&mut rng, components);
1212
let verifying_key = signing_key.verifying_key();
1313

14-
let signature = signing_key
15-
.sign_digest_with_rng(&mut rand::rng(), Sha1::new().chain_update(b"hello world"));
14+
let signature = signing_key.sign_digest_with_rng(&mut rand::rng(), |digest: &mut Sha1| {
15+
digest.update(b"hello world")
16+
});
1617

1718
let signing_key_bytes = signing_key.to_pkcs8_pem(LineEnding::LF).unwrap();
1819
let verifying_key_bytes = verifying_key.to_public_key_pem(LineEnding::LF).unwrap();

dsa/src/signing_key.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crypto_bigint::{
1313
BoxedUint, NonZero, Resize,
1414
modular::{BoxedMontyForm, BoxedMontyParams},
1515
};
16-
use digest::{Digest, FixedOutputReset, block_api::BlockSizeUser};
16+
use digest::{Digest, FixedOutputReset, Update, block_api::BlockSizeUser};
1717
use signature::{
1818
DigestSigner, MultipartSigner, RandomizedDigestSigner, Signer,
1919
hazmat::{PrehashSigner, RandomizedPrehashSigner},
@@ -157,9 +157,10 @@ impl Signer<Signature> for SigningKey {
157157

158158
impl MultipartSigner<Signature> for SigningKey {
159159
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<Signature, signature::Error> {
160-
let mut digest = sha2::Sha256::new();
161-
msg.iter().for_each(|slice| digest.update(slice));
162-
self.try_sign_digest(digest)
160+
self.try_sign_digest(|digest: &mut sha2::Sha256| {
161+
msg.iter().for_each(|slice| Digest::update(digest, slice));
162+
Ok(())
163+
})
163164
}
164165
}
165166

@@ -191,7 +192,12 @@ impl<D> DigestSigner<D, Signature> for SigningKey
191192
where
192193
D: Digest + BlockSizeUser + FixedOutputReset,
193194
{
194-
fn try_sign_digest(&self, digest: D) -> Result<Signature, signature::Error> {
195+
fn try_sign_digest<F: Fn(&mut D) -> Result<(), signature::Error>>(
196+
&self,
197+
f: F,
198+
) -> Result<Signature, signature::Error> {
199+
let mut digest = D::new();
200+
f(&mut digest)?;
195201
let hash = digest.finalize_fixed();
196202
let ks = crate::generate::secret_number_rfc6979::<D>(self, &hash)?;
197203

@@ -201,15 +207,20 @@ where
201207

202208
impl<D> RandomizedDigestSigner<D, Signature> for SigningKey
203209
where
204-
D: Digest,
210+
D: Digest + Update,
205211
{
206-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
212+
fn try_sign_digest_with_rng<
213+
R: TryCryptoRng + ?Sized,
214+
F: Fn(&mut D) -> Result<(), signature::Error>,
215+
>(
207216
&self,
208217
rng: &mut R,
209-
digest: D,
218+
f: F,
210219
) -> Result<Signature, signature::Error> {
211220
let ks = crate::generate::secret_number(rng, self.verifying_key().components())?
212221
.ok_or_else(signature::Error::new)?;
222+
let mut digest = D::new();
223+
f(&mut digest)?;
213224
let hash = digest.finalize();
214225

215226
self.sign_prehashed(ks, &hash)

dsa/src/verifying_key.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crypto_bigint::{
88
BoxedUint, NonZero, Resize,
99
modular::{BoxedMontyForm, BoxedMontyParams},
1010
};
11-
use digest::Digest;
11+
use digest::{Digest, Update};
1212
use signature::{DigestVerifier, MultipartVerifier, Verifier, hazmat::PrehashVerifier};
1313

1414
#[cfg(feature = "pkcs8")]
@@ -124,9 +124,13 @@ impl MultipartVerifier<Signature> for VerifyingKey {
124124
msg: &[&[u8]],
125125
signature: &Signature,
126126
) -> Result<(), signature::Error> {
127-
let mut digest = sha2::Sha256::new();
128-
msg.iter().for_each(|slice| digest.update(slice));
129-
self.verify_digest(digest, signature)
127+
self.verify_digest(
128+
|digest: &mut sha2::Sha256| {
129+
msg.iter().for_each(|slice| Digest::update(digest, slice));
130+
Ok(())
131+
},
132+
signature,
133+
)
130134
}
131135
}
132136

@@ -146,9 +150,15 @@ impl PrehashVerifier<Signature> for VerifyingKey {
146150

147151
impl<D> DigestVerifier<D, Signature> for VerifyingKey
148152
where
149-
D: Digest,
153+
D: Digest + Update,
150154
{
151-
fn verify_digest(&self, digest: D, signature: &Signature) -> Result<(), signature::Error> {
155+
fn verify_digest<F: Fn(&mut D) -> Result<(), signature::Error>>(
156+
&self,
157+
f: F,
158+
signature: &Signature,
159+
) -> Result<(), signature::Error> {
160+
let mut digest = D::new();
161+
f(&mut digest)?;
152162
let hash = digest.finalize();
153163

154164
let is_valid = self

dsa/tests/deterministic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ fn generate_signature<D>(signing_key: SigningKey, data: &[u8]) -> Signature
102102
where
103103
D: Digest + BlockSizeUser + FixedOutputReset,
104104
{
105-
signing_key.sign_digest(<D as Digest>::new().chain_update(data))
105+
signing_key.sign_digest(|digest: &mut D| Digest::update(digest, data))
106106
}
107107

108108
/// Generate a signature using the 1024-bit DSA key

dsa/tests/signature.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,10 @@ fn decode_encode_signature() {
7171
#[test]
7272
fn sign_message() {
7373
let signing_key = generate_deterministic_keypair();
74-
let generated_signature =
75-
signing_key.sign_digest_with_rng(&mut seeded_csprng(), Sha256::new().chain_update(MESSAGE));
74+
let generated_signature = signing_key
75+
.sign_digest_with_rng(&mut seeded_csprng(), |digest: &mut Sha256| {
76+
digest.update(MESSAGE)
77+
});
7678

7779
let expected_signature =
7880
Signature::from_der(MESSAGE_SIGNATURE_CRATE_ASN1).expect("Failed to decode signature");
@@ -90,7 +92,13 @@ fn verify_signature() {
9092

9193
assert!(
9294
verifying_key
93-
.verify_digest(Sha256::new().chain_update(MESSAGE), &signature)
95+
.verify_digest(
96+
|digest: &mut Sha256| {
97+
digest.update(MESSAGE);
98+
Ok(())
99+
},
100+
&signature
101+
)
94102
.is_ok()
95103
);
96104
}
@@ -160,6 +168,12 @@ fn verify_signature_precision() {
160168
let signature = Signature::from_der(&asn1)
161169
.expect("Failed to parse ASN.1 representation of the test signature");
162170

163-
let _ = verifying_key.verify_digest(Sha256::new().chain_update(MESSAGE), &signature);
171+
let _ = verifying_key.verify_digest(
172+
|digest: &mut Sha256| {
173+
digest.update(MESSAGE);
174+
Ok(())
175+
},
176+
&signature,
177+
);
164178
}
165179
}

dsa/tests/signing_key.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,20 @@ fn sign_and_verify() {
4949
let signing_key = generate_keypair();
5050
let verifying_key = signing_key.verifying_key();
5151

52-
let signature =
53-
signing_key.sign_digest_with_rng(&mut rand::thread_rng(), Sha1::new().chain_update(DATA));
52+
let signature = signing_key
53+
.sign_digest_with_rng(&mut rand::thread_rng(), |digest: &mut Sha1| {
54+
digest.update(DATA)
55+
});
5456

5557
assert!(
5658
verifying_key
57-
.verify_digest(Sha1::new().chain_update(DATA), &signature)
59+
.verify_digest(
60+
|digest: &mut Sha1| {
61+
digest.update(DATA);
62+
Ok(())
63+
},
64+
&signature
65+
)
5866
.is_ok()
5967
);
6068
}

ecdsa/src/recovery.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use {
88
elliptic_curve::{FieldBytes, subtle::CtOption},
99
signature::{
1010
DigestSigner, MultipartSigner, RandomizedDigestSigner, Signer,
11-
digest::FixedOutput,
11+
digest::{FixedOutput, Update},
1212
hazmat::{PrehashSigner, RandomizedPrehashSigner},
1313
rand_core::TryCryptoRng,
1414
},
@@ -229,12 +229,17 @@ where
229229
impl<C, D> DigestSigner<D, (Signature<C>, RecoveryId)> for SigningKey<C>
230230
where
231231
C: EcdsaCurve + CurveArithmetic + DigestAlgorithm,
232-
D: Digest,
232+
D: Digest + Update,
233233
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
234234
SignatureSize<C>: ArraySize,
235235
{
236-
fn try_sign_digest(&self, msg_digest: D) -> Result<(Signature<C>, RecoveryId)> {
237-
self.sign_digest_recoverable(msg_digest)
236+
fn try_sign_digest<F: Fn(&mut D) -> Result<()>>(
237+
&self,
238+
f: F,
239+
) -> Result<(Signature<C>, RecoveryId)> {
240+
let mut digest = D::new();
241+
f(&mut digest)?;
242+
self.sign_digest_recoverable(digest)
238243
}
239244
}
240245

@@ -262,12 +267,14 @@ where
262267
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
263268
SignatureSize<C>: ArraySize,
264269
{
265-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
270+
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized, F: Fn(&mut D) -> Result<()>>(
266271
&self,
267272
rng: &mut R,
268-
msg_digest: D,
273+
f: F,
269274
) -> Result<(Signature<C>, RecoveryId)> {
270-
self.sign_prehash_with_rng(rng, &msg_digest.finalize_fixed())
275+
let mut digest = D::new();
276+
f(&mut digest)?;
277+
self.sign_prehash_with_rng(rng, &digest.finalize_fixed())
271278
}
272279
}
273280

@@ -304,7 +311,8 @@ where
304311
{
305312
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<(Signature<C>, RecoveryId)> {
306313
let mut digest = C::Digest::new();
307-
msg.iter().for_each(|slice| digest.update(slice));
314+
msg.iter()
315+
.for_each(|slice| Digest::update(&mut digest, slice));
308316
self.sign_digest_recoverable(digest)
309317
}
310318
}

ecdsa/src/signing.rs

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,10 @@ where
145145
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
146146
SignatureSize<C>: ArraySize,
147147
{
148-
fn try_sign_digest(&self, msg_digest: D) -> Result<Signature<C>> {
149-
self.sign_prehash(&msg_digest.finalize_fixed())
148+
fn try_sign_digest<F: Fn(&mut D) -> Result<()>>(&self, f: F) -> Result<Signature<C>> {
149+
let mut digest = D::new();
150+
f(&mut digest)?;
151+
self.sign_prehash(&digest.finalize_fixed())
150152
}
151153
}
152154

@@ -188,9 +190,10 @@ where
188190
SignatureSize<C>: ArraySize,
189191
{
190192
fn try_multipart_sign(&self, msg: &[&[u8]]) -> core::result::Result<Signature<C>, Error> {
191-
let mut digest = C::Digest::new();
192-
msg.iter().for_each(|slice| digest.update(slice));
193-
self.try_sign_digest(digest)
193+
self.try_sign_digest(|digest: &mut C::Digest| {
194+
msg.iter().for_each(|slice| digest.update(slice));
195+
Ok(())
196+
})
194197
}
195198
}
196199

@@ -201,12 +204,14 @@ where
201204
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
202205
SignatureSize<C>: ArraySize,
203206
{
204-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
207+
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized, F: Fn(&mut D) -> Result<()>>(
205208
&self,
206209
rng: &mut R,
207-
msg_digest: D,
210+
f: F,
208211
) -> Result<Signature<C>> {
209-
self.sign_prehash_with_rng(rng, &msg_digest.finalize_fixed())
212+
let mut digest = D::new();
213+
f(&mut digest)?;
214+
self.sign_prehash_with_rng(rng, &digest.finalize_fixed())
210215
}
211216
}
212217

@@ -264,9 +269,10 @@ where
264269
rng: &mut R,
265270
msg: &[&[u8]],
266271
) -> Result<Signature<C>> {
267-
let mut digest = C::Digest::new();
268-
msg.iter().for_each(|slice| digest.update(slice));
269-
self.try_sign_digest_with_rng(rng, digest)
272+
self.try_sign_digest_with_rng(rng, |digest: &mut C::Digest| {
273+
msg.iter().for_each(|slice| digest.update(slice));
274+
Ok(())
275+
})
270276
}
271277
}
272278

@@ -277,8 +283,8 @@ where
277283
Scalar<C>: Invert<Output = CtOption<Scalar<C>>>,
278284
SignatureSize<C>: ArraySize,
279285
{
280-
fn try_sign_digest(&self, msg_digest: D) -> Result<SignatureWithOid<C>> {
281-
let signature: Signature<C> = self.try_sign_digest(msg_digest)?;
286+
fn try_sign_digest<F: Fn(&mut D) -> Result<()>>(&self, f: F) -> Result<SignatureWithOid<C>> {
287+
let signature: Signature<C> = self.try_sign_digest(f)?;
282288
let oid = ecdsa_oid_for_digest(D::OID).ok_or_else(Error::new)?;
283289
SignatureWithOid::new(signature, oid)
284290
}
@@ -304,9 +310,10 @@ where
304310
SignatureSize<C>: ArraySize,
305311
{
306312
fn try_multipart_sign(&self, msg: &[&[u8]]) -> Result<SignatureWithOid<C>> {
307-
let mut digest = C::Digest::new();
308-
msg.iter().for_each(|slice| digest.update(slice));
309-
self.try_sign_digest(digest)
313+
self.try_sign_digest(|digest: &mut C::Digest| {
314+
msg.iter().for_each(|slice| digest.update(slice));
315+
Ok(())
316+
})
310317
}
311318
}
312319

@@ -348,12 +355,12 @@ where
348355
der::MaxSize<C>: ArraySize,
349356
<FieldBytesSize<C> as Add>::Output: Add<der::MaxOverhead> + ArraySize,
350357
{
351-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
358+
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized, F: Fn(&mut D) -> Result<()>>(
352359
&self,
353360
rng: &mut R,
354-
msg_digest: D,
361+
f: F,
355362
) -> Result<der::Signature<C>> {
356-
RandomizedDigestSigner::<D, Signature<C>>::try_sign_digest_with_rng(self, rng, msg_digest)
363+
RandomizedDigestSigner::<D, Signature<C>>::try_sign_digest_with_rng(self, rng, f)
357364
.map(Into::into)
358365
}
359366
}
@@ -387,8 +394,8 @@ where
387394
der::MaxSize<C>: ArraySize,
388395
<FieldBytesSize<C> as Add>::Output: Add<der::MaxOverhead> + ArraySize,
389396
{
390-
fn try_sign_digest(&self, msg_digest: D) -> Result<der::Signature<C>> {
391-
DigestSigner::<D, Signature<C>>::try_sign_digest(self, msg_digest).map(Into::into)
397+
fn try_sign_digest<F: Fn(&mut D) -> Result<()>>(&self, f: F) -> Result<der::Signature<C>> {
398+
DigestSigner::<D, Signature<C>>::try_sign_digest(self, f).map(Into::into)
392399
}
393400
}
394401

0 commit comments

Comments
 (0)