Skip to content

Commit dbd7c4b

Browse files
authored
Bump signature to v3.0.0-rc.4 (#579)
This brings `*DigestSigner`/`*DigestVerifier` changes introduced in RustCrypto/traits#2004
1 parent aae21cb commit dbd7c4b

File tree

9 files changed

+114
-60
lines changed

9 files changed

+114
-60
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ crypto-bigint = { version = "0.7.0-rc.6", default-features = false, features = [
1818
crypto-primes = { version = "0.7.0-pre.2", default-features = false }
1919
digest = { version = "0.11.0-rc.1", default-features = false, features = ["alloc", "oid"] }
2020
rand_core = { version = "0.9", default-features = false }
21-
signature = { version = "3.0.0-rc.3", default-features = false, features = ["alloc", "digest", "rand_core"] }
21+
signature = { version = "3.0.0-rc.4", default-features = false, features = ["alloc", "digest", "rand_core"] }
2222
subtle = { version = "2.6.1", default-features = false }
2323
zeroize = { version = "1.5", features = ["alloc"] }
2424

src/pkcs1v15.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -533,16 +533,16 @@ mod tests {
533533
for (text, expected) in &tests {
534534
let mut digest = Sha1::new();
535535
digest.update(text.as_bytes());
536-
let out = signing_key.sign_digest(digest).to_bytes();
536+
let out = signing_key
537+
.sign_digest(|digest: &mut Sha1| digest.update(text.as_bytes()))
538+
.to_bytes();
537539
assert_ne!(out.as_ref(), text.as_bytes());
538540
assert_ne!(out.as_ref(), &Sha1::digest(text.as_bytes()).to_vec());
539541
assert_eq!(out.as_ref(), expected);
540542

541543
let mut rng = ChaCha8Rng::from_seed([42; 32]);
542-
let mut digest = Sha1::new();
543-
digest.update(text.as_bytes());
544544
let out2 = signing_key
545-
.sign_digest_with_rng(&mut rng, digest)
545+
.sign_digest_with_rng(&mut rng, |digest: &mut Sha1| digest.update(text.as_bytes()))
546546
.to_bytes();
547547
assert_eq!(out2.as_ref(), expected);
548548
}
@@ -650,10 +650,13 @@ mod tests {
650650
let verifying_key = VerifyingKey::new(pub_key);
651651

652652
for (text, sig, expected) in &tests {
653-
let mut digest = Sha1::new();
654-
digest.update(text.as_bytes());
655-
let result =
656-
verifying_key.verify_digest(digest, &Signature::try_from(sig.as_slice()).unwrap());
653+
let result = verifying_key.verify_digest(
654+
|digest: &mut Sha1| {
655+
digest.update(text.as_bytes());
656+
Ok(())
657+
},
658+
&Signature::try_from(sig.as_slice()).unwrap(),
659+
);
657660
match expected {
658661
true => result.expect("failed to verify"),
659662
false => {

src/pkcs1v15/signing_key.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::{dummy_rng::DummyRng, Result, RsaPrivateKey};
33
use alloc::vec::Vec;
44
use const_oid::AssociatedOid;
55
use core::marker::PhantomData;
6-
use digest::Digest;
6+
use digest::{Digest, FixedOutput, HashMarker, Update};
77
use rand_core::{CryptoRng, TryCryptoRng};
88
use signature::{
99
hazmat::PrehashSigner, DigestSigner, Keypair, MultipartSigner, RandomizedDigestSigner,
@@ -95,10 +95,15 @@ where
9595

9696
impl<D> DigestSigner<D, Signature> for SigningKey<D>
9797
where
98-
D: Digest,
98+
D: Default + FixedOutput + HashMarker + Update,
9999
{
100-
fn try_sign_digest(&self, digest: D) -> signature::Result<Signature> {
101-
sign::<DummyRng>(None, &self.inner, &self.prefix, &digest.finalize())?
100+
fn try_sign_digest<F: Fn(&mut D) -> signature::Result<()>>(
101+
&self,
102+
f: F,
103+
) -> signature::Result<Signature> {
104+
let mut digest = D::default();
105+
f(&mut digest)?;
106+
sign::<DummyRng>(None, &self.inner, &self.prefix, &digest.finalize_fixed())?
102107
.as_slice()
103108
.try_into()
104109
}
@@ -117,16 +122,26 @@ where
117122

118123
impl<D> RandomizedDigestSigner<D, Signature> for SigningKey<D>
119124
where
120-
D: Digest,
125+
D: Default + FixedOutput + HashMarker + Update,
121126
{
122-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
127+
fn try_sign_digest_with_rng<
128+
R: TryCryptoRng + ?Sized,
129+
F: Fn(&mut D) -> signature::Result<()>,
130+
>(
123131
&self,
124132
rng: &mut R,
125-
digest: D,
133+
f: F,
126134
) -> signature::Result<Signature> {
127-
sign(Some(rng), &self.inner, &self.prefix, &digest.finalize())?
128-
.as_slice()
129-
.try_into()
135+
let mut digest = D::default();
136+
f(&mut digest)?;
137+
sign(
138+
Some(rng),
139+
&self.inner,
140+
&self.prefix,
141+
&digest.finalize_fixed(),
142+
)?
143+
.as_slice()
144+
.try_into()
130145
}
131146
}
132147

src/pkcs1v15/verifying_key.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::RsaPublicKey;
33
use alloc::vec::Vec;
44
use const_oid::AssociatedOid;
55
use core::marker::PhantomData;
6-
use digest::Digest;
6+
use digest::{Digest, FixedOutput, HashMarker, Update};
77
use signature::{hazmat::PrehashVerifier, DigestVerifier, Verifier};
88

99
#[cfg(feature = "encoding")]
@@ -71,13 +71,19 @@ where
7171

7272
impl<D> DigestVerifier<D, Signature> for VerifyingKey<D>
7373
where
74-
D: Digest,
74+
D: Default + FixedOutput + HashMarker + Update,
7575
{
76-
fn verify_digest(&self, digest: D, signature: &Signature) -> signature::Result<()> {
76+
fn verify_digest<F: Fn(&mut D) -> signature::Result<()>>(
77+
&self,
78+
f: F,
79+
signature: &Signature,
80+
) -> signature::Result<()> {
81+
let mut digest = D::default();
82+
f(&mut digest)?;
7783
verify(
7884
&self.inner,
7985
&self.prefix,
80-
&digest.finalize(),
86+
&digest.finalize_fixed(),
8187
&signature.inner,
8288
)
8389
.map_err(|e| e.into())

src/pss.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -398,10 +398,13 @@ tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
398398
let verifying_key = VerifyingKey::new(pub_key);
399399

400400
for (text, sig, expected) in &tests {
401-
let mut digest = Sha1::new();
402-
digest.update(text.as_bytes());
403-
let result =
404-
verifying_key.verify_digest(digest, &Signature::try_from(sig.as_slice()).unwrap());
401+
let result = verifying_key.verify_digest(
402+
|digest: &mut Sha1| {
403+
digest.update(text.as_bytes());
404+
Ok(())
405+
},
406+
&Signature::try_from(sig.as_slice()).unwrap(),
407+
);
405408
match expected {
406409
true => result.expect("failed to verify"),
407410
false => {
@@ -495,14 +498,17 @@ tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
495498
let verifying_key = signing_key.verifying_key();
496499

497500
for test in &tests {
498-
let mut digest = Sha1::new();
499-
digest.update(test.as_bytes());
500-
let sig = signing_key.sign_digest_with_rng(&mut rng, digest);
501+
let sig = signing_key
502+
.sign_digest_with_rng(&mut rng, |digest: &mut Sha1| digest.update(test.as_bytes()));
501503

502-
let mut digest = Sha1::new();
503-
digest.update(test.as_bytes());
504504
verifying_key
505-
.verify_digest(digest, &sig)
505+
.verify_digest(
506+
|digest: &mut Sha1| {
507+
digest.update(test.as_bytes());
508+
Ok(())
509+
},
510+
&sig,
511+
)
506512
.expect("failed to verify");
507513
}
508514
}
@@ -517,14 +523,17 @@ tAboUGBxTDq3ZroNism3DaMIbKPyYrAqhKov1h5V
517523
let verifying_key = signing_key.verifying_key();
518524

519525
for test in &tests {
520-
let mut digest = Sha1::new();
521-
digest.update(test.as_bytes());
522-
let sig = signing_key.sign_digest_with_rng(&mut rng, digest);
526+
let sig = signing_key
527+
.sign_digest_with_rng(&mut rng, |digest: &mut Sha1| digest.update(test.as_bytes()));
523528

524-
let mut digest = Sha1::new();
525-
digest.update(test.as_bytes());
526529
verifying_key
527-
.verify_digest(digest, &sig)
530+
.verify_digest(
531+
|digest: &mut Sha1| {
532+
digest.update(test.as_bytes());
533+
Ok(())
534+
},
535+
&sig,
536+
)
528537
.expect("failed to verify");
529538
}
530539
}

src/pss/blinded_signing_key.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::{sign_digest, Signature, VerifyingKey};
22
use crate::{Result, RsaPrivateKey};
33
use core::marker::PhantomData;
4-
use digest::{Digest, FixedOutputReset};
4+
use digest::{Digest, FixedOutputReset, HashMarker, Update};
55
use rand_core::{CryptoRng, TryCryptoRng};
66
use signature::{
77
hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedMultipartSigner,
@@ -122,13 +122,18 @@ where
122122

123123
impl<D> RandomizedDigestSigner<D, Signature> for BlindedSigningKey<D>
124124
where
125-
D: Digest + FixedOutputReset,
125+
D: Default + FixedOutputReset + HashMarker + Update,
126126
{
127-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
127+
fn try_sign_digest_with_rng<
128+
R: TryCryptoRng + ?Sized,
129+
F: Fn(&mut D) -> signature::Result<()>,
130+
>(
128131
&self,
129132
rng: &mut R,
130-
digest: D,
133+
f: F,
131134
) -> signature::Result<Signature> {
135+
let mut digest = D::default();
136+
f(&mut digest)?;
132137
sign_digest::<_, D>(rng, true, &self.inner, &digest.finalize(), self.salt_len)?
133138
.as_slice()
134139
.try_into()

src/pss/signing_key.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use super::{sign_digest, Signature, VerifyingKey};
22
use crate::{Result, RsaPrivateKey};
33
use core::marker::PhantomData;
4-
use digest::{Digest, FixedOutputReset};
4+
use digest::{Digest, FixedOutputReset, Update};
55
use rand_core::{CryptoRng, TryCryptoRng};
66
use signature::{
77
hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedMultipartSigner,
88
RandomizedSigner,
99
};
1010
use zeroize::ZeroizeOnDrop;
11+
1112
#[cfg(feature = "serde")]
1213
use {
1314
pkcs8::DecodePrivateKey,
@@ -25,6 +26,7 @@ use {
2526
AssociatedAlgorithmIdentifier, DynSignatureAlgorithmIdentifier,
2627
},
2728
};
29+
2830
#[cfg(feature = "os_rng")]
2931
use {
3032
rand_core::OsRng,
@@ -95,13 +97,18 @@ where
9597

9698
impl<D> RandomizedDigestSigner<D, Signature> for SigningKey<D>
9799
where
98-
D: Digest + FixedOutputReset,
100+
D: Digest + FixedOutputReset + Update,
99101
{
100-
fn try_sign_digest_with_rng<R: TryCryptoRng + ?Sized>(
102+
fn try_sign_digest_with_rng<
103+
R: TryCryptoRng + ?Sized,
104+
F: Fn(&mut D) -> signature::Result<()>,
105+
>(
101106
&self,
102107
rng: &mut R,
103-
digest: D,
108+
f: F,
104109
) -> signature::Result<Signature> {
110+
let mut digest = D::new();
111+
f(&mut digest)?;
105112
sign_digest::<_, D>(rng, false, &self.inner, &digest.finalize(), self.salt_len)?
106113
.as_slice()
107114
.try_into()
@@ -110,36 +117,39 @@ where
110117

111118
impl<D> RandomizedSigner<Signature> for SigningKey<D>
112119
where
113-
D: Digest + FixedOutputReset,
120+
D: Digest + FixedOutputReset + Update,
114121
{
115122
fn try_sign_with_rng<R: TryCryptoRng + ?Sized>(
116123
&self,
117124
rng: &mut R,
118125
msg: &[u8],
119126
) -> signature::Result<Signature> {
120-
self.try_sign_digest_with_rng(rng, D::new_with_prefix(msg))
127+
self.try_sign_digest_with_rng(rng, |digest: &mut D| {
128+
Update::update(digest, msg);
129+
Ok(())
130+
})
121131
}
122132
}
123133

124134
impl<D> RandomizedMultipartSigner<Signature> for SigningKey<D>
125135
where
126-
D: Digest + FixedOutputReset,
136+
D: Digest + FixedOutputReset + Update,
127137
{
128138
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
129139
&self,
130140
rng: &mut R,
131141
msg: &[&[u8]],
132142
) -> signature::Result<Signature> {
133-
let mut digest = D::new();
134-
msg.iter()
135-
.for_each(|slice| <D as Digest>::update(&mut digest, slice));
136-
self.try_sign_digest_with_rng(rng, digest)
143+
self.try_sign_digest_with_rng(rng, |digest: &mut D| {
144+
msg.iter().for_each(|slice| Update::update(digest, slice));
145+
Ok(())
146+
})
137147
}
138148
}
139149

140150
impl<D> RandomizedPrehashSigner<Signature> for SigningKey<D>
141151
where
142-
D: Digest + FixedOutputReset,
152+
D: Digest + FixedOutputReset + Update,
143153
{
144154
fn sign_prehash_with_rng<R: TryCryptoRng + ?Sized>(
145155
&self,

src/pss/verifying_key.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::{verify_digest, Signature};
22
use crate::RsaPublicKey;
33
use core::marker::PhantomData;
4-
use digest::{Digest, FixedOutputReset};
4+
use digest::{Digest, FixedOutputReset, Update};
55
use signature::{hazmat::PrehashVerifier, DigestVerifier, Verifier};
66

77
#[cfg(feature = "encoding")]
@@ -72,9 +72,15 @@ where
7272

7373
impl<D> DigestVerifier<D, Signature> for VerifyingKey<D>
7474
where
75-
D: Digest + FixedOutputReset,
75+
D: Digest + FixedOutputReset + Update,
7676
{
77-
fn verify_digest(&self, digest: D, signature: &Signature) -> signature::Result<()> {
77+
fn verify_digest<F: Fn(&mut D) -> signature::Result<()>>(
78+
&self,
79+
f: F,
80+
signature: &Signature,
81+
) -> signature::Result<()> {
82+
let mut digest = D::new();
83+
f(&mut digest)?;
7884
verify_digest::<D>(
7985
&self.inner,
8086
&digest.finalize(),

0 commit comments

Comments
 (0)