Skip to content

Commit 65da94d

Browse files
committed
Make pss::Signing/VerifyingKey accept raw message
Change the SigningKey and VerifiyingKey implementations accept raw message rather than pre-hashed message. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent 2fc5e79 commit 65da94d

File tree

2 files changed

+108
-65
lines changed

2 files changed

+108
-65
lines changed

src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,16 @@
8181
//!
8282
//! let bits = 2048;
8383
//! let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
84-
//! let signing_key = BlindedSigningKey::new(private_key, Box::new(Sha256::new()));
85-
//! let verifying_key: VerifyingKey = (&signing_key).into();
84+
//! let signing_key = BlindedSigningKey::<Sha256>::new(private_key);
85+
//! let verifying_key: VerifyingKey<_> = (&signing_key).into();
8686
//!
8787
//! // Sign
8888
//! let data = b"hello world";
89-
//! let digest = Sha256::digest(data).to_vec();
90-
//! let signature = signing_key.sign_with_rng(&mut rng, &digest);
89+
//! let signature = signing_key.sign_with_rng(&mut rng, data);
9190
//! assert_ne!(signature.as_bytes(), data);
9291
//!
9392
//! // Verify
94-
//! verifying_key.verify(&digest, &signature).expect("failed to verify");
93+
//! verifying_key.verify(data, &signature).expect("failed to verify");
9594
//! ```
9695
//!
9796
//! ## PKCS#1 RSA Key Encoding

src/pss.rs

Lines changed: 104 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use alloc::boxed::Box;
21
use alloc::vec;
32
use alloc::vec::Vec;
43

54
use core::fmt::{Debug, Display, Formatter, LowerHex, UpperHex};
6-
use digest::DynDigest;
5+
use core::marker::PhantomData;
6+
use digest::{Digest, DynDigest};
77
use rand_core::{CryptoRng, RngCore};
88
use signature::{RandomizedSigner, Signature as SignSignature, Verifier};
99
use subtle::ConstantTimeEq;
@@ -317,149 +317,196 @@ fn emsa_pss_verify(
317317
}
318318
}
319319

320-
pub struct SigningKey {
320+
pub struct SigningKey<D>
321+
where
322+
D: Digest + DynDigest,
323+
{
321324
inner: RsaPrivateKey,
322325
salt_len: Option<usize>,
323-
digest: Box<dyn DynDigest>,
326+
phantom: PhantomData<D>,
324327
}
325328

326-
impl SigningKey {
329+
impl<D> SigningKey<D>
330+
where
331+
D: Digest + DynDigest,
332+
{
327333
pub(crate) fn key(&self) -> &RsaPrivateKey {
328334
&self.inner
329335
}
330336

331-
pub(crate) fn digest(&self) -> Box<dyn DynDigest> {
332-
self.digest.box_clone()
337+
pub fn new(key: RsaPrivateKey) -> Self {
338+
Self {
339+
inner: key,
340+
salt_len: None,
341+
phantom: Default::default(),
342+
}
333343
}
334344

335-
pub fn new(key: RsaPrivateKey, digest: Box<dyn DynDigest>) -> Self {
345+
pub fn new_with_salt_len(key: RsaPrivateKey, salt_len: usize) -> Self {
336346
Self {
337347
inner: key,
338-
salt_len: None,
339-
digest: digest,
348+
salt_len: Some(salt_len),
349+
phantom: Default::default(),
340350
}
341351
}
342352
}
343353

344-
impl RandomizedSigner<Signature> for SigningKey {
354+
impl<D> RandomizedSigner<Signature> for SigningKey<D>
355+
where
356+
D: Digest + DynDigest,
357+
{
345358
fn try_sign_with_rng(
346359
&self,
347360
mut rng: impl CryptoRng + RngCore,
348-
digest: &[u8],
361+
msg: &[u8],
349362
) -> signature::Result<Signature> {
350363
sign(
351364
&mut rng,
352365
false,
353366
&self.inner,
354-
digest,
367+
&D::digest(msg),
355368
self.salt_len,
356-
self.digest.box_clone().as_mut(),
369+
&mut D::new(),
357370
)
358371
.map(|v| v.into())
359372
.map_err(|e| e.into())
360373
}
361374
}
362375

363-
pub struct BlindedSigningKey {
376+
pub struct BlindedSigningKey<D>
377+
where
378+
D: Digest + DynDigest,
379+
{
364380
inner: RsaPrivateKey,
365381
salt_len: Option<usize>,
366-
digest: Box<dyn DynDigest>,
382+
phantom: PhantomData<D>,
367383
}
368384

369-
impl BlindedSigningKey {
385+
impl<D> BlindedSigningKey<D>
386+
where
387+
D: Digest + DynDigest,
388+
{
370389
pub(crate) fn key(&self) -> &RsaPrivateKey {
371390
&self.inner
372391
}
373392

374-
pub(crate) fn digest(&self) -> Box<dyn DynDigest> {
375-
self.digest.box_clone()
393+
pub fn new(key: RsaPrivateKey) -> Self {
394+
Self {
395+
inner: key,
396+
salt_len: None,
397+
phantom: Default::default(),
398+
}
376399
}
377400

378-
pub fn new(key: RsaPrivateKey, digest: Box<dyn DynDigest>) -> Self {
401+
pub fn new_with_salt_len(key: RsaPrivateKey, salt_len: usize) -> Self {
379402
Self {
380403
inner: key,
381-
salt_len: None,
382-
digest: digest,
404+
salt_len: Some(salt_len),
405+
phantom: Default::default(),
383406
}
384407
}
385408
}
386409

387-
impl RandomizedSigner<Signature> for BlindedSigningKey {
410+
impl<D> RandomizedSigner<Signature> for BlindedSigningKey<D>
411+
where
412+
D: Digest + DynDigest,
413+
{
388414
fn try_sign_with_rng(
389415
&self,
390416
mut rng: impl CryptoRng + RngCore,
391-
digest: &[u8],
417+
msg: &[u8],
392418
) -> signature::Result<Signature> {
393419
sign(
394420
&mut rng,
395421
true,
396422
&self.inner,
397-
digest,
423+
&D::digest(msg),
398424
self.salt_len,
399-
self.digest.box_clone().as_mut(),
425+
&mut D::new(),
400426
)
401427
.map(|v| v.into())
402428
.map_err(|e| e.into())
403429
}
404430
}
405431

406-
pub struct VerifyingKey {
432+
pub struct VerifyingKey<D>
433+
where
434+
D: Digest + DynDigest,
435+
{
407436
inner: RsaPublicKey,
408-
digest: Box<dyn DynDigest>,
437+
phantom: PhantomData<D>,
409438
}
410439

411-
impl VerifyingKey {
412-
pub fn new(key: RsaPublicKey, digest: Box<dyn DynDigest>) -> Self {
440+
impl<D> VerifyingKey<D>
441+
where
442+
D: Digest + DynDigest,
443+
{
444+
pub fn new(key: RsaPublicKey) -> Self {
413445
Self {
414446
inner: key,
415-
digest: digest,
447+
phantom: Default::default(),
416448
}
417449
}
418450
}
419451

420-
impl From<SigningKey> for VerifyingKey {
421-
fn from(key: SigningKey) -> Self {
452+
impl<D> From<SigningKey<D>> for VerifyingKey<D>
453+
where
454+
D: Digest + DynDigest,
455+
{
456+
fn from(key: SigningKey<D>) -> Self {
422457
Self {
423458
inner: key.key().into(),
424-
digest: key.digest(),
459+
phantom: Default::default(),
425460
}
426461
}
427462
}
428463

429-
impl From<&SigningKey> for VerifyingKey {
430-
fn from(key: &SigningKey) -> Self {
464+
impl<D> From<&SigningKey<D>> for VerifyingKey<D>
465+
where
466+
D: Digest + DynDigest,
467+
{
468+
fn from(key: &SigningKey<D>) -> Self {
431469
Self {
432470
inner: key.key().into(),
433-
digest: key.digest(),
471+
phantom: Default::default(),
434472
}
435473
}
436474
}
437475

438-
impl From<BlindedSigningKey> for VerifyingKey {
439-
fn from(key: BlindedSigningKey) -> Self {
476+
impl<D> From<BlindedSigningKey<D>> for VerifyingKey<D>
477+
where
478+
D: Digest + DynDigest,
479+
{
480+
fn from(key: BlindedSigningKey<D>) -> Self {
440481
Self {
441482
inner: key.key().into(),
442-
digest: key.digest(),
483+
phantom: Default::default(),
443484
}
444485
}
445486
}
446487

447-
impl From<&BlindedSigningKey> for VerifyingKey {
448-
fn from(key: &BlindedSigningKey) -> Self {
488+
impl<D> From<&BlindedSigningKey<D>> for VerifyingKey<D>
489+
where
490+
D: Digest + DynDigest,
491+
{
492+
fn from(key: &BlindedSigningKey<D>) -> Self {
449493
Self {
450494
inner: key.key().into(),
451-
digest: key.digest(),
495+
phantom: Default::default(),
452496
}
453497
}
454498
}
455499

456-
impl Verifier<Signature> for VerifyingKey {
500+
impl<D> Verifier<Signature> for VerifyingKey<D>
501+
where
502+
D: Digest + DynDigest,
503+
{
457504
fn verify(&self, msg: &[u8], signature: &Signature) -> signature::Result<()> {
458505
verify(
459506
&self.inner,
460-
msg,
507+
&D::digest(msg),
461508
signature.as_ref(),
462-
self.digest.box_clone().as_mut(),
509+
&mut D::new(),
463510
)
464511
.map_err(|e| e.into())
465512
}
@@ -470,7 +517,6 @@ mod test {
470517
use crate::pss::{BlindedSigningKey, SigningKey, VerifyingKey};
471518
use crate::{PaddingScheme, PublicKey, RsaPrivateKey, RsaPublicKey};
472519

473-
use alloc::boxed::Box;
474520
use hex_literal::hex;
475521
use num_bigint::BigUint;
476522
use num_traits::{FromPrimitive, Num};
@@ -561,11 +607,11 @@ mod test {
561607
),
562608
];
563609
let pub_key: RsaPublicKey = priv_key.into();
564-
let verifying_key: VerifyingKey = VerifyingKey::new(pub_key, Box::new(Sha1::new()));
610+
let verifying_key: VerifyingKey<Sha1> = VerifyingKey::new(pub_key);
565611

566612
for (text, sig, expected) in &tests {
567-
let digest = Sha1::digest(text.as_bytes()).to_vec();
568-
let result = verifying_key.verify(&digest, &Signature::from_bytes(sig).unwrap());
613+
let result =
614+
verifying_key.verify(text.as_bytes(), &Signature::from_bytes(sig).unwrap());
569615
match expected {
570616
true => result.expect("failed to verify"),
571617
false => {
@@ -620,14 +666,13 @@ mod test {
620666

621667
let tests = ["test\n"];
622668
let mut rng = ChaCha8Rng::from_seed([42; 32]);
623-
let signing_key = SigningKey::new(priv_key, Box::new(Sha1::new()));
624-
let verifying_key: VerifyingKey = (&signing_key).into();
669+
let signing_key = SigningKey::<Sha1>::new(priv_key);
670+
let verifying_key = VerifyingKey::from(&signing_key);
625671

626672
for test in &tests {
627-
let digest = Sha1::digest(test.as_bytes()).to_vec();
628-
let sig = signing_key.sign_with_rng(&mut rng, &digest);
673+
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
629674
verifying_key
630-
.verify(&digest, &sig)
675+
.verify(test.as_bytes(), &sig)
631676
.expect("failed to verify");
632677
}
633678
}
@@ -638,14 +683,13 @@ mod test {
638683

639684
let tests = ["test\n"];
640685
let mut rng = ChaCha8Rng::from_seed([42; 32]);
641-
let signing_key = BlindedSigningKey::new(priv_key, Box::new(Sha1::new()));
642-
let verifying_key: VerifyingKey = (&signing_key).into();
686+
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
687+
let verifying_key = VerifyingKey::from(&signing_key);
643688

644689
for test in &tests {
645-
let digest = Sha1::digest(test.as_bytes()).to_vec();
646-
let sig = signing_key.sign_with_rng(&mut rng, &digest);
690+
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
647691
verifying_key
648-
.verify(&digest, &sig)
692+
.verify(test.as_bytes(), &sig)
649693
.expect("failed to verify");
650694
}
651695
}

0 commit comments

Comments
 (0)