Skip to content

Commit c28a2c1

Browse files
committed
feat: switch to implementing the Keypair trait
Drop the hand-crafted From traits, replacing them with the implementation of the Keypair trait. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent c6206fd commit c28a2c1

File tree

3 files changed

+80
-96
lines changed

3 files changed

+80
-96
lines changed

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@
5252
//! use rsa::RsaPrivateKey;
5353
//! use rsa::pkcs1v15::{SigningKey, VerifyingKey};
5454
//! use sha2::{Digest, Sha256};
55-
//! use signature::{RandomizedSigner, SignatureEncoding, Verifier};
55+
//! use signature::{Keypair, RandomizedSigner, SignatureEncoding, Verifier};
5656
//!
5757
//! let mut rng = rand::thread_rng();
5858
//!
5959
//! let bits = 2048;
6060
//! let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
6161
//! let signing_key = SigningKey::<Sha256>::new_with_prefix(private_key);
62-
//! let verifying_key: VerifyingKey<_> = (&signing_key).into();
62+
//! let verifying_key = signing_key.verifying_key();
6363
//!
6464
//! // Sign
6565
//! let data = b"hello world";
@@ -75,14 +75,14 @@
7575
//! use rsa::RsaPrivateKey;
7676
//! use rsa::pss::{BlindedSigningKey, VerifyingKey};
7777
//! use sha2::{Digest, Sha256};
78-
//! use signature::{RandomizedSigner, SignatureEncoding, Verifier};
78+
//! use signature::{Keypair, RandomizedSigner, SignatureEncoding, Verifier};
7979
//!
8080
//! let mut rng = rand::thread_rng();
8181
//!
8282
//! let bits = 2048;
8383
//! let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
8484
//! let signing_key = BlindedSigningKey::<Sha256>::new(private_key);
85-
//! let verifying_key: VerifyingKey<_> = (&signing_key).into();
85+
//! let verifying_key = signing_key.verifying_key();
8686
//!
8787
//! // Sign
8888
//! let data = b"hello world";

src/pkcs1v15.rs

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use rand_core::{CryptoRng, RngCore};
88
#[cfg(feature = "hazmat")]
99
use signature::hazmat::{PrehashSigner, PrehashVerifier};
1010
use signature::{
11-
DigestSigner, DigestVerifier, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding,
12-
Signer, Verifier,
11+
DigestSigner, DigestVerifier, Keypair, RandomizedDigestSigner, RandomizedSigner,
12+
SignatureEncoding, Signer, Verifier,
1313
};
1414
use subtle::{Choice, ConditionallySelectable, ConstantTimeEq};
1515
use zeroize::Zeroizing;
@@ -310,10 +310,6 @@ impl<D> SigningKey<D>
310310
where
311311
D: Digest,
312312
{
313-
pub(crate) fn key(&self) -> &RsaPrivateKey {
314-
&self.inner
315-
}
316-
317313
pub(crate) fn prefix(&self) -> Vec<u8> {
318314
self.prefix.clone()
319315
}
@@ -445,7 +441,7 @@ where
445441
}
446442
}
447443

448-
#[derive(Debug, Clone)]
444+
#[derive(Debug)]
449445
pub struct VerifyingKey<D>
450446
where
451447
D: Digest,
@@ -455,6 +451,20 @@ where
455451
phantom: PhantomData<D>,
456452
}
457453

454+
/* Implemented manually so we don't have to bind D with Clone */
455+
impl<D> Clone for VerifyingKey<D>
456+
where
457+
D: Digest,
458+
{
459+
fn clone(&self) -> Self {
460+
Self {
461+
inner: self.inner.clone(),
462+
prefix: self.prefix.clone(),
463+
phantom: Default::default(),
464+
}
465+
}
466+
}
467+
458468
impl<D> VerifyingKey<D>
459469
where
460470
D: Digest,
@@ -508,27 +518,15 @@ where
508518
}
509519
}
510520

511-
impl<D> From<SigningKey<D>> for VerifyingKey<D>
512-
where
513-
D: Digest,
514-
{
515-
fn from(key: SigningKey<D>) -> Self {
516-
Self {
517-
inner: key.key().into(),
518-
prefix: key.prefix(),
519-
phantom: Default::default(),
520-
}
521-
}
522-
}
523-
524-
impl<D> From<&SigningKey<D>> for VerifyingKey<D>
521+
impl<D> Keypair for SigningKey<D>
525522
where
526523
D: Digest,
527524
{
528-
fn from(key: &SigningKey<D>) -> Self {
529-
Self {
530-
inner: key.key().into(),
531-
prefix: key.prefix(),
525+
type VerifyingKey = VerifyingKey<D>;
526+
fn verifying_key(&self) -> Self::VerifyingKey {
527+
VerifyingKey {
528+
inner: self.inner.to_public_key(),
529+
prefix: self.prefix(),
532530
phantom: Default::default(),
533531
}
534532
}
@@ -968,9 +966,12 @@ mod tests {
968966
let sig = signing_key.sign_prehash(msg).expect("Failure during sign");
969967
assert_eq!(sig.as_ref(), expected_sig);
970968

971-
let verifying_key: VerifyingKey<_> = (&signing_key).into();
969+
let verifying_key = signing_key.verifying_key();
972970
verifying_key
973-
.verify_prehash(msg, &Signature::from_bytes(&expected_sig.into_boxed_slice()).unwrap())
971+
.verify_prehash(
972+
msg,
973+
&Signature::from_bytes(&expected_sig.into_boxed_slice()).unwrap(),
974+
)
974975
.expect("failed to verify");
975976
}
976977
}

src/pss.rs

Lines changed: 48 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rand_core::{CryptoRng, RngCore};
99
#[cfg(feature = "hazmat")]
1010
use signature::hazmat::{PrehashVerifier, RandomizedPrehashSigner};
1111
use signature::{
12-
DigestVerifier, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding, Verifier,
12+
DigestVerifier, Keypair, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding, Verifier,
1313
};
1414
use subtle::ConstantTimeEq;
1515

@@ -526,10 +526,6 @@ impl<D> SigningKey<D>
526526
where
527527
D: Digest,
528528
{
529-
pub(crate) fn key(&self) -> &RsaPrivateKey {
530-
&self.inner
531-
}
532-
533529
pub fn new(key: RsaPrivateKey) -> Self {
534530
Self {
535531
inner: key,
@@ -574,6 +570,19 @@ where
574570
}
575571
}
576572

573+
impl<D> Keypair for SigningKey<D>
574+
where
575+
D: Digest,
576+
{
577+
type VerifyingKey = VerifyingKey<D>;
578+
fn verifying_key(&self) -> Self::VerifyingKey {
579+
VerifyingKey {
580+
inner: self.inner.to_public_key(),
581+
phantom: Default::default(),
582+
}
583+
}
584+
}
585+
577586
impl<D> RandomizedSigner<Signature> for SigningKey<D>
578587
where
579588
D: Digest + FixedOutputReset,
@@ -649,10 +658,6 @@ impl<D> BlindedSigningKey<D>
649658
where
650659
D: Digest,
651660
{
652-
pub(crate) fn key(&self) -> &RsaPrivateKey {
653-
&self.inner
654-
}
655-
656661
pub fn new(key: RsaPrivateKey) -> Self {
657662
Self {
658663
inner: key,
@@ -697,6 +702,19 @@ where
697702
}
698703
}
699704

705+
impl<D> Keypair for BlindedSigningKey<D>
706+
where
707+
D: Digest,
708+
{
709+
type VerifyingKey = VerifyingKey<D>;
710+
fn verifying_key(&self) -> Self::VerifyingKey {
711+
VerifyingKey {
712+
inner: self.inner.to_public_key(),
713+
phantom: Default::default(),
714+
}
715+
}
716+
}
717+
700718
impl<D> RandomizedSigner<Signature> for BlindedSigningKey<D>
701719
where
702720
D: Digest + FixedOutputReset,
@@ -758,7 +776,7 @@ where
758776
}
759777
}
760778

761-
#[derive(Debug, Clone)]
779+
#[derive(Debug)]
762780
pub struct VerifyingKey<D>
763781
where
764782
D: Digest,
@@ -767,81 +785,46 @@ where
767785
phantom: PhantomData<D>,
768786
}
769787

770-
impl<D> VerifyingKey<D>
771-
where
772-
D: Digest,
773-
{
774-
pub fn new(key: RsaPublicKey) -> Self {
775-
Self {
776-
inner: key,
777-
phantom: Default::default(),
778-
}
779-
}
780-
}
781-
782-
impl<D> From<RsaPublicKey> for VerifyingKey<D>
783-
where
784-
D: Digest,
785-
{
786-
fn from(key: RsaPublicKey) -> Self {
787-
Self::new(key)
788-
}
789-
}
790-
791-
impl<D> From<VerifyingKey<D>> for RsaPublicKey
792-
where
793-
D: Digest,
794-
{
795-
fn from(key: VerifyingKey<D>) -> Self {
796-
key.inner
797-
}
798-
}
799-
800-
impl<D> From<SigningKey<D>> for VerifyingKey<D>
788+
/* Implemented manually so we don't have to bind D with Clone */
789+
impl<D> Clone for VerifyingKey<D>
801790
where
802791
D: Digest,
803792
{
804-
fn from(key: SigningKey<D>) -> Self {
793+
fn clone(&self) -> Self {
805794
Self {
806-
inner: key.key().into(),
795+
inner: self.inner.clone(),
807796
phantom: Default::default(),
808797
}
809798
}
810799
}
811800

812-
impl<D> From<&SigningKey<D>> for VerifyingKey<D>
801+
impl<D> VerifyingKey<D>
813802
where
814803
D: Digest,
815804
{
816-
fn from(key: &SigningKey<D>) -> Self {
805+
pub fn new(key: RsaPublicKey) -> Self {
817806
Self {
818-
inner: key.key().into(),
807+
inner: key,
819808
phantom: Default::default(),
820809
}
821810
}
822811
}
823812

824-
impl<D> From<BlindedSigningKey<D>> for VerifyingKey<D>
813+
impl<D> From<RsaPublicKey> for VerifyingKey<D>
825814
where
826815
D: Digest,
827816
{
828-
fn from(key: BlindedSigningKey<D>) -> Self {
829-
Self {
830-
inner: key.key().into(),
831-
phantom: Default::default(),
832-
}
817+
fn from(key: RsaPublicKey) -> Self {
818+
Self::new(key)
833819
}
834820
}
835821

836-
impl<D> From<&BlindedSigningKey<D>> for VerifyingKey<D>
822+
impl<D> From<VerifyingKey<D>> for RsaPublicKey
837823
where
838824
D: Digest,
839825
{
840-
fn from(key: &BlindedSigningKey<D>) -> Self {
841-
Self {
842-
inner: key.key().into(),
843-
phantom: Default::default(),
844-
}
826+
fn from(key: VerifyingKey<D>) -> Self {
827+
key.inner
845828
}
846829
}
847830

@@ -905,7 +888,7 @@ mod test {
905888
use sha1::{Digest, Sha1};
906889
#[cfg(feature = "hazmat")]
907890
use signature::hazmat::{PrehashVerifier, RandomizedPrehashSigner};
908-
use signature::{DigestVerifier, RandomizedDigestSigner, RandomizedSigner, Verifier};
891+
use signature::{DigestVerifier, Keypair, RandomizedDigestSigner, RandomizedSigner, Verifier};
909892

910893
fn get_private_key() -> RsaPrivateKey {
911894
// In order to generate new test vectors you'll need the PEM form of this key:
@@ -1089,7 +1072,7 @@ mod test {
10891072
let tests = ["test\n"];
10901073
let mut rng = ChaCha8Rng::from_seed([42; 32]);
10911074
let signing_key = SigningKey::<Sha1>::new(priv_key);
1092-
let verifying_key = VerifyingKey::from(&signing_key);
1075+
let verifying_key = signing_key.verifying_key();
10931076

10941077
for test in &tests {
10951078
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
@@ -1106,7 +1089,7 @@ mod test {
11061089
let tests = ["test\n"];
11071090
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11081091
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1109-
let verifying_key = VerifyingKey::from(&signing_key);
1092+
let verifying_key = signing_key.verifying_key();
11101093

11111094
for test in &tests {
11121095
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
@@ -1123,7 +1106,7 @@ mod test {
11231106
let tests = ["test\n"];
11241107
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11251108
let signing_key = SigningKey::new(priv_key);
1126-
let verifying_key = VerifyingKey::from(&signing_key);
1109+
let verifying_key = signing_key.verifying_key();
11271110

11281111
for test in &tests {
11291112
let mut digest = Sha1::new();
@@ -1145,7 +1128,7 @@ mod test {
11451128
let tests = ["test\n"];
11461129
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11471130
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1148-
let verifying_key = VerifyingKey::from(&signing_key);
1131+
let verifying_key = signing_key.verifying_key();
11491132

11501133
for test in &tests {
11511134
let mut digest = Sha1::new();
@@ -1206,7 +1189,7 @@ mod test {
12061189
let tests = [Sha1::digest("test\n")];
12071190
let mut rng = ChaCha8Rng::from_seed([42; 32]);
12081191
let signing_key = SigningKey::<Sha1>::new(priv_key);
1209-
let verifying_key = VerifyingKey::from(&signing_key);
1192+
let verifying_key = signing_key.verifying_key();
12101193

12111194
for test in &tests {
12121195
let sig = signing_key
@@ -1226,7 +1209,7 @@ mod test {
12261209
let tests = [Sha1::digest("test\n")];
12271210
let mut rng = ChaCha8Rng::from_seed([42; 32]);
12281211
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1229-
let verifying_key = VerifyingKey::from(&signing_key);
1212+
let verifying_key = signing_key.verifying_key();
12301213

12311214
for test in &tests {
12321215
let sig = signing_key

0 commit comments

Comments
 (0)