Skip to content

Commit 0cd2049

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 0cd2049

File tree

3 files changed

+68
-95
lines changed

3 files changed

+68
-95
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: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rand_core::{CryptoRng, RngCore};
99
use signature::hazmat::{PrehashSigner, PrehashVerifier};
1010
use signature::{
1111
DigestSigner, DigestVerifier, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding,
12-
Signer, Verifier,
12+
Signer, Verifier, Keypair,
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,17 @@ 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> where D: Digest {
456+
fn clone(&self) -> Self {
457+
Self {
458+
inner: self.inner.clone(),
459+
prefix: self.prefix.clone(),
460+
phantom: Default::default(),
461+
}
462+
}
463+
}
464+
458465
impl<D> VerifyingKey<D>
459466
where
460467
D: Digest,
@@ -508,27 +515,14 @@ where
508515
}
509516
}
510517

511-
impl<D> From<SigningKey<D>> for VerifyingKey<D>
512-
where
513-
D: Digest,
518+
impl<D> Keypair for SigningKey<D>
519+
where D: Digest,
514520
{
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>
525-
where
526-
D: Digest,
527-
{
528-
fn from(key: &SigningKey<D>) -> Self {
529-
Self {
530-
inner: key.key().into(),
531-
prefix: key.prefix(),
521+
type VerifyingKey = VerifyingKey<D>;
522+
fn verifying_key(&self) -> Self::VerifyingKey {
523+
VerifyingKey {
524+
inner: self.inner.to_public_key(),
525+
prefix: self.prefix(),
532526
phantom: Default::default(),
533527
}
534528
}
@@ -968,7 +962,7 @@ mod tests {
968962
let sig = signing_key.sign_prehash(msg).expect("Failure during sign");
969963
assert_eq!(sig.as_ref(), expected_sig);
970964

971-
let verifying_key: VerifyingKey<_> = (&signing_key).into();
965+
let verifying_key = signing_key.verifying_key();
972966
verifying_key
973967
.verify_prehash(msg, &Signature::from_bytes(&expected_sig.into_boxed_slice()).unwrap())
974968
.expect("failed to verify");

src/pss.rs

Lines changed: 43 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use rand_core::{CryptoRng, RngCore};
1010
use signature::hazmat::{PrehashVerifier, RandomizedPrehashSigner};
1111
use signature::{
1212
DigestVerifier, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding, Verifier,
13+
Keypair,
1314
};
1415
use subtle::ConstantTimeEq;
1516

@@ -526,10 +527,6 @@ impl<D> SigningKey<D>
526527
where
527528
D: Digest,
528529
{
529-
pub(crate) fn key(&self) -> &RsaPrivateKey {
530-
&self.inner
531-
}
532-
533530
pub fn new(key: RsaPrivateKey) -> Self {
534531
Self {
535532
inner: key,
@@ -574,6 +571,18 @@ where
574571
}
575572
}
576573

574+
impl<D> Keypair for SigningKey<D>
575+
where 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,18 @@ where
697702
}
698703
}
699704

705+
impl<D> Keypair for BlindedSigningKey<D>
706+
where D: Digest,
707+
{
708+
type VerifyingKey = VerifyingKey<D>;
709+
fn verifying_key(&self) -> Self::VerifyingKey {
710+
VerifyingKey {
711+
inner: self.inner.to_public_key(),
712+
phantom: Default::default(),
713+
}
714+
}
715+
}
716+
700717
impl<D> RandomizedSigner<Signature> for BlindedSigningKey<D>
701718
where
702719
D: Digest + FixedOutputReset,
@@ -758,7 +775,7 @@ where
758775
}
759776
}
760777

761-
#[derive(Debug, Clone)]
778+
#[derive(Debug)]
762779
pub struct VerifyingKey<D>
763780
where
764781
D: Digest,
@@ -767,6 +784,16 @@ where
767784
phantom: PhantomData<D>,
768785
}
769786

787+
/* Implemented manually so we don't have to bind D with Clone */
788+
impl<D> Clone for VerifyingKey<D> where D: Digest {
789+
fn clone(&self) -> Self {
790+
Self {
791+
inner: self.inner.clone(),
792+
phantom: Default::default(),
793+
}
794+
}
795+
}
796+
770797
impl<D> VerifyingKey<D>
771798
where
772799
D: Digest,
@@ -797,54 +824,6 @@ where
797824
}
798825
}
799826

800-
impl<D> From<SigningKey<D>> for VerifyingKey<D>
801-
where
802-
D: Digest,
803-
{
804-
fn from(key: SigningKey<D>) -> Self {
805-
Self {
806-
inner: key.key().into(),
807-
phantom: Default::default(),
808-
}
809-
}
810-
}
811-
812-
impl<D> From<&SigningKey<D>> for VerifyingKey<D>
813-
where
814-
D: Digest,
815-
{
816-
fn from(key: &SigningKey<D>) -> Self {
817-
Self {
818-
inner: key.key().into(),
819-
phantom: Default::default(),
820-
}
821-
}
822-
}
823-
824-
impl<D> From<BlindedSigningKey<D>> for VerifyingKey<D>
825-
where
826-
D: Digest,
827-
{
828-
fn from(key: BlindedSigningKey<D>) -> Self {
829-
Self {
830-
inner: key.key().into(),
831-
phantom: Default::default(),
832-
}
833-
}
834-
}
835-
836-
impl<D> From<&BlindedSigningKey<D>> for VerifyingKey<D>
837-
where
838-
D: Digest,
839-
{
840-
fn from(key: &BlindedSigningKey<D>) -> Self {
841-
Self {
842-
inner: key.key().into(),
843-
phantom: Default::default(),
844-
}
845-
}
846-
}
847-
848827
impl<D> Verifier<Signature> for VerifyingKey<D>
849828
where
850829
D: Digest + FixedOutputReset,
@@ -905,7 +884,7 @@ mod test {
905884
use sha1::{Digest, Sha1};
906885
#[cfg(feature = "hazmat")]
907886
use signature::hazmat::{PrehashVerifier, RandomizedPrehashSigner};
908-
use signature::{DigestVerifier, RandomizedDigestSigner, RandomizedSigner, Verifier};
887+
use signature::{DigestVerifier, RandomizedDigestSigner, RandomizedSigner, Verifier, Keypair};
909888

910889
fn get_private_key() -> RsaPrivateKey {
911890
// In order to generate new test vectors you'll need the PEM form of this key:
@@ -1089,7 +1068,7 @@ mod test {
10891068
let tests = ["test\n"];
10901069
let mut rng = ChaCha8Rng::from_seed([42; 32]);
10911070
let signing_key = SigningKey::<Sha1>::new(priv_key);
1092-
let verifying_key = VerifyingKey::from(&signing_key);
1071+
let verifying_key = signing_key.verifying_key();
10931072

10941073
for test in &tests {
10951074
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
@@ -1106,7 +1085,7 @@ mod test {
11061085
let tests = ["test\n"];
11071086
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11081087
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1109-
let verifying_key = VerifyingKey::from(&signing_key);
1088+
let verifying_key = signing_key.verifying_key();
11101089

11111090
for test in &tests {
11121091
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
@@ -1123,7 +1102,7 @@ mod test {
11231102
let tests = ["test\n"];
11241103
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11251104
let signing_key = SigningKey::new(priv_key);
1126-
let verifying_key = VerifyingKey::from(&signing_key);
1105+
let verifying_key = signing_key.verifying_key();
11271106

11281107
for test in &tests {
11291108
let mut digest = Sha1::new();
@@ -1145,7 +1124,7 @@ mod test {
11451124
let tests = ["test\n"];
11461125
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11471126
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1148-
let verifying_key = VerifyingKey::from(&signing_key);
1127+
let verifying_key = signing_key.verifying_key();
11491128

11501129
for test in &tests {
11511130
let mut digest = Sha1::new();
@@ -1206,7 +1185,7 @@ mod test {
12061185
let tests = [Sha1::digest("test\n")];
12071186
let mut rng = ChaCha8Rng::from_seed([42; 32]);
12081187
let signing_key = SigningKey::<Sha1>::new(priv_key);
1209-
let verifying_key = VerifyingKey::from(&signing_key);
1188+
let verifying_key = signing_key.verifying_key();
12101189

12111190
for test in &tests {
12121191
let sig = signing_key
@@ -1226,7 +1205,7 @@ mod test {
12261205
let tests = [Sha1::digest("test\n")];
12271206
let mut rng = ChaCha8Rng::from_seed([42; 32]);
12281207
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1229-
let verifying_key = VerifyingKey::from(&signing_key);
1208+
let verifying_key = signing_key.verifying_key();
12301209

12311210
for test in &tests {
12321211
let sig = signing_key

0 commit comments

Comments
 (0)