Skip to content

Commit e211bef

Browse files
committed
rsa: hook new Signer/Verifier implementations
Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 68fb56a commit e211bef

File tree

4 files changed

+74
-5
lines changed

4 files changed

+74
-5
lines changed

src/key.rs

+17-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use crate::errors::{Error, Result};
1515

1616
use crate::padding::PaddingScheme;
1717
use crate::raw::{DecryptionPrimitive, EncryptionPrimitive};
18+
use crate::signer::{RsaBlindedSigner, RsaSigner};
19+
use crate::verifier::RsaVerifier;
1820
use crate::{oaep, pkcs1v15, pss};
1921

2022
static MIN_PUB_EXPONENT: u64 = 2;
@@ -199,7 +201,7 @@ impl PublicKeyParts for RsaPublicKey {
199201
}
200202
}
201203

202-
impl PublicKey for RsaPublicKey {
204+
impl<'a> PublicKey for RsaPublicKey {
203205
fn encrypt<R: RngCore + CryptoRng>(
204206
&self,
205207
rng: &mut R,
@@ -229,14 +231,18 @@ impl PublicKey for RsaPublicKey {
229231
}
230232
}
231233

232-
impl RsaPublicKey {
234+
impl<'a> RsaPublicKey {
233235
/// Create a new key from its components.
234236
pub fn new(n: BigUint, e: BigUint) -> Result<Self> {
235237
let k = RsaPublicKey { n, e };
236238
check_public(&k)?;
237239

238240
Ok(k)
239241
}
242+
243+
pub fn to_verifier(&'a self, padding: PaddingScheme) -> RsaVerifier<'a> {
244+
RsaVerifier::new(&self, padding)
245+
}
240246
}
241247

242248
impl<'a> PublicKeyParts for &'a RsaPublicKey {
@@ -290,7 +296,7 @@ impl<'a> PublicKeyParts for &'a RsaPrivateKey {
290296

291297
impl<'a> PrivateKey for &'a RsaPrivateKey {}
292298

293-
impl RsaPrivateKey {
299+
impl<'a> RsaPrivateKey {
294300
/// Generate a new Rsa key pair of the given bit size using the passed in `rng`.
295301
pub fn new<R: RngCore + CryptoRng>(rng: &mut R, bit_size: usize) -> Result<RsaPrivateKey> {
296302
generate_multi_prime_key(rng, 2, bit_size)
@@ -547,6 +553,14 @@ impl RsaPrivateKey {
547553
_ => Err(Error::InvalidPaddingScheme),
548554
}
549555
}
556+
557+
pub fn to_signer(&'a self, padding: PaddingScheme) -> RsaSigner<'a> {
558+
RsaSigner::new(&self, padding)
559+
}
560+
561+
pub fn to_blinded_signer(&'a self, padding: PaddingScheme) -> RsaBlindedSigner<'a> {
562+
RsaBlindedSigner::new(&self, padding)
563+
}
550564
}
551565

552566
/// Check that the public key is well formed and has an exponent within acceptable bounds.

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ pub use pkcs8;
182182
pub use self::hash::Hash;
183183
pub use self::key::{PublicKey, PublicKeyParts, RsaPrivateKey, RsaPublicKey};
184184
pub use self::padding::PaddingScheme;
185+
pub use self::rsa_core::RsaSignature;
185186

186187
/// Internal raw RSA functions.
187188
#[cfg(not(feature = "expose-internals"))]

src/pkcs1v15.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,12 @@ mod tests {
224224
use num_traits::Num;
225225
use rand_chacha::{rand_core::SeedableRng, ChaCha8Rng};
226226
use sha1::{Digest, Sha1};
227+
use signature::RandomizedSigner;
228+
use signature::Signer;
229+
use signature::Signature;
230+
use signature::Verifier;
227231

228-
use crate::{Hash, PaddingScheme, PublicKey, PublicKeyParts, RsaPrivateKey, RsaPublicKey};
232+
use crate::{Hash, PaddingScheme, PublicKey, PublicKeyParts, RsaPrivateKey, RsaPublicKey, RsaSignature};
229233

230234
#[test]
231235
fn test_non_zero_bytes() {
@@ -345,6 +349,19 @@ mod tests {
345349
)
346350
.unwrap();
347351
assert_eq!(out2, expected);
352+
353+
let out = priv_key
354+
.to_signer(PaddingScheme::new_pkcs1v15_sign(Some(Hash::SHA1)))
355+
.try_sign(&digest)
356+
.expect("failed to sign");
357+
assert_ne!(out.as_ref(), digest);
358+
assert_eq!(out.as_ref(), expected);
359+
360+
let out2 = priv_key
361+
.to_blinded_signer(PaddingScheme::new_pkcs1v15_sign(Some(Hash::SHA1)))
362+
.try_sign_with_rng(&mut rng, &digest)
363+
.expect("failed to sign");
364+
assert_eq!(out2.as_ref(), expected);
348365
}
349366
}
350367

@@ -371,6 +388,14 @@ mod tests {
371388
sig,
372389
)
373390
.expect("failed to verify");
391+
392+
pub_key
393+
.to_verifier(PaddingScheme::new_pkcs1v15_sign(Some(Hash::SHA1)))
394+
.verify(
395+
&digest,
396+
&RsaSignature::from_bytes(sig).expect("failed to create signature"),
397+
)
398+
.expect("failed to verify");
374399
}
375400
}
376401

src/pss.rs

+30-1
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,16 @@ fn emsa_pss_verify(
239239
#[cfg(test)]
240240
mod test {
241241
use crate::hash::Hash;
242-
use crate::{PaddingScheme, PublicKey, RsaPrivateKey, RsaPublicKey};
242+
use crate::{PaddingScheme, PublicKey, RsaPrivateKey, RsaPublicKey, RsaSignature};
243243

244244
use hex_literal::hex;
245245
use num_bigint::BigUint;
246246
use num_traits::{FromPrimitive, Num};
247247
use rand_chacha::{rand_core::SeedableRng, ChaCha8Rng};
248248
use sha1::{Digest, Sha1};
249+
use signature::RandomizedSigner;
250+
use signature::Signature;
251+
use signature::Verifier;
249252

250253
fn get_private_key() -> RsaPrivateKey {
251254
// In order to generate new test vectors you'll need the PEM form of this key:
@@ -288,6 +291,14 @@ mod test {
288291
pub_key
289292
.verify(PaddingScheme::new_pss::<Sha1>(Hash::SHA1), &digest, sig)
290293
.expect("failed to verify");
294+
295+
pub_key
296+
.to_verifier(PaddingScheme::new_pss::<Sha1>(Hash::SHA1))
297+
.verify(
298+
&digest,
299+
&RsaSignature::from_bytes(sig).expect("failed to create signature"),
300+
)
301+
.expect("failed to verify");
291302
}
292303
}
293304

@@ -311,6 +322,15 @@ mod test {
311322
priv_key
312323
.verify(PaddingScheme::new_pss::<Sha1>(Hash::SHA1), &digest, &sig)
313324
.expect("failed to verify");
325+
326+
let sig = priv_key
327+
.to_signer(PaddingScheme::new_pss::<Sha1>(Hash::SHA1))
328+
.try_sign_with_rng(&mut rng.clone(), &digest)
329+
.expect("failed to sign");
330+
priv_key
331+
.to_verifier(PaddingScheme::new_pss::<Sha1>(Hash::SHA1))
332+
.verify(&digest, &sig)
333+
.expect("failed to verify");
314334
}
315335
}
316336

@@ -334,6 +354,15 @@ mod test {
334354
priv_key
335355
.verify(PaddingScheme::new_pss::<Sha1>(Hash::SHA1), &digest, &sig)
336356
.expect("failed to verify");
357+
358+
let sig = priv_key
359+
.to_blinded_signer(PaddingScheme::new_pss::<Sha1>(Hash::SHA1))
360+
.try_sign_with_rng(&mut rng.clone(), &digest)
361+
.expect("failed to sign");
362+
priv_key
363+
.to_verifier(PaddingScheme::new_pss::<Sha1>(Hash::SHA1))
364+
.verify(&digest, &sig)
365+
.expect("failed to verify");
337366
}
338367
}
339368
}

0 commit comments

Comments
 (0)