Skip to content

Commit 1ffef57

Browse files
authored
Implement MultipartSign/Verify (#525)
Implementation of `MultipartSigner` and `MultipartVerifier` added in RustCrypto/traits#1880.
1 parent 40a58a9 commit 1ffef57

File tree

5 files changed

+81
-10
lines changed

5 files changed

+81
-10
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
@@ -19,7 +19,7 @@ subtle = { version = "2.6.1", default-features = false }
1919
digest = { version = "0.11.0-rc.0", default-features = false, features = ["alloc", "oid"] }
2020
pkcs1 = { version = "0.8.0-rc.2", default-features = false, features = ["alloc", "pkcs8"] }
2121
pkcs8 = { version = "0.11.0-rc.4", default-features = false, features = ["alloc"] }
22-
signature = { version = "3.0.0-rc.0", default-features = false, features = ["alloc", "digest", "rand_core"] }
22+
signature = { version = "3.0.0-rc.1", default-features = false, features = ["alloc", "digest", "rand_core"] }
2323
spki = { version = "0.8.0-rc.2", default-features = false, features = ["alloc"] }
2424
zeroize = { version = "1.5", features = ["alloc"] }
2525
crypto-bigint = { version = "0.7.0-pre.4", default-features = false, features = ["zeroize", "alloc"] }

src/pkcs1v15/signing_key.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ use {
1818
};
1919

2020
use signature::{
21-
hazmat::PrehashSigner, DigestSigner, Keypair, RandomizedDigestSigner, RandomizedSigner, Signer,
21+
hazmat::PrehashSigner, DigestSigner, Keypair, MultipartSigner, RandomizedDigestSigner,
22+
RandomizedMultipartSigner, RandomizedSigner, Signer,
2223
};
2324
use zeroize::ZeroizeOnDrop;
2425

@@ -135,7 +136,22 @@ where
135136
rng: &mut R,
136137
msg: &[u8],
137138
) -> signature::Result<Signature> {
138-
sign(Some(rng), &self.inner, &self.prefix, &D::digest(msg))?
139+
self.try_multipart_sign_with_rng(rng, &[msg])
140+
}
141+
}
142+
143+
impl<D> RandomizedMultipartSigner<Signature> for SigningKey<D>
144+
where
145+
D: Digest,
146+
{
147+
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
148+
&self,
149+
rng: &mut R,
150+
msg: &[&[u8]],
151+
) -> signature::Result<Signature> {
152+
let mut digest = D::new();
153+
msg.iter().for_each(|slice| digest.update(slice));
154+
sign(Some(rng), &self.inner, &self.prefix, &digest.finalize())?
139155
.as_slice()
140156
.try_into()
141157
}
@@ -146,7 +162,18 @@ where
146162
D: Digest,
147163
{
148164
fn try_sign(&self, msg: &[u8]) -> signature::Result<Signature> {
149-
sign::<DummyRng>(None, &self.inner, &self.prefix, &D::digest(msg))?
165+
self.try_multipart_sign(&[msg])
166+
}
167+
}
168+
169+
impl<D> MultipartSigner<Signature> for SigningKey<D>
170+
where
171+
D: Digest,
172+
{
173+
fn try_multipart_sign(&self, msg: &[&[u8]]) -> signature::Result<Signature> {
174+
let mut digest = D::new();
175+
msg.iter().for_each(|slice| digest.update(slice));
176+
sign::<DummyRng>(None, &self.inner, &self.prefix, &digest.finalize())?
150177
.as_slice()
151178
.try_into()
152179
}

src/pss/blinded_signing_key.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ use pkcs8::{
1212
};
1313
use rand_core::{CryptoRng, TryCryptoRng};
1414
use signature::{
15-
hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedSigner,
15+
hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedMultipartSigner,
16+
RandomizedSigner,
1617
};
1718
use zeroize::ZeroizeOnDrop;
1819
#[cfg(feature = "serde")]
@@ -93,7 +94,23 @@ where
9394
rng: &mut R,
9495
msg: &[u8],
9596
) -> signature::Result<Signature> {
96-
sign_digest::<_, D>(rng, true, &self.inner, &D::digest(msg), self.salt_len)?
97+
self.try_multipart_sign_with_rng(rng, &[msg])
98+
}
99+
}
100+
101+
impl<D> RandomizedMultipartSigner<Signature> for BlindedSigningKey<D>
102+
where
103+
D: Digest + FixedOutputReset,
104+
{
105+
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
106+
&self,
107+
rng: &mut R,
108+
msg: &[&[u8]],
109+
) -> signature::Result<Signature> {
110+
let mut digest = D::new();
111+
msg.iter()
112+
.for_each(|slice| <D as Digest>::update(&mut digest, slice));
113+
sign_digest::<_, D>(rng, true, &self.inner, &digest.finalize(), self.salt_len)?
97114
.as_slice()
98115
.try_into()
99116
}

src/pss/signing_key.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use pkcs8::{
1313
};
1414
use rand_core::{CryptoRng, TryCryptoRng};
1515
use signature::{
16-
hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedSigner,
16+
hazmat::RandomizedPrehashSigner, Keypair, RandomizedDigestSigner, RandomizedMultipartSigner,
17+
RandomizedSigner,
1718
};
1819
use zeroize::ZeroizeOnDrop;
1920
#[cfg(feature = "serde")]
@@ -25,7 +26,7 @@ use {
2526
#[cfg(feature = "os_rng")]
2627
use {
2728
rand_core::OsRng,
28-
signature::{hazmat::PrehashSigner, Signer},
29+
signature::{hazmat::PrehashSigner, MultipartSigner, Signer},
2930
};
3031

3132
/// Signing key for producing RSASSA-PSS signatures as described in
@@ -118,6 +119,22 @@ where
118119
}
119120
}
120121

122+
impl<D> RandomizedMultipartSigner<Signature> for SigningKey<D>
123+
where
124+
D: Digest + FixedOutputReset,
125+
{
126+
fn try_multipart_sign_with_rng<R: TryCryptoRng + ?Sized>(
127+
&self,
128+
rng: &mut R,
129+
msg: &[&[u8]],
130+
) -> signature::Result<Signature> {
131+
let mut digest = D::new();
132+
msg.iter()
133+
.for_each(|slice| <D as Digest>::update(&mut digest, slice));
134+
self.try_sign_digest_with_rng(rng, digest)
135+
}
136+
}
137+
121138
impl<D> RandomizedPrehashSigner<Signature> for SigningKey<D>
122139
where
123140
D: Digest + FixedOutputReset,
@@ -153,6 +170,16 @@ where
153170
}
154171
}
155172

173+
#[cfg(feature = "os_rng")]
174+
impl<D> MultipartSigner<Signature> for SigningKey<D>
175+
where
176+
D: Digest + FixedOutputReset,
177+
{
178+
fn try_multipart_sign(&self, msg: &[&[u8]]) -> signature::Result<Signature> {
179+
self.try_multipart_sign_with_rng(&mut OsRng, msg)
180+
}
181+
}
182+
156183
//
157184
// Other trait impls
158185
//

0 commit comments

Comments
 (0)