Skip to content

Commit c512708

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 3a896c3 commit c512708

File tree

3 files changed

+77
-100
lines changed

3 files changed

+77
-100
lines changed

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@
6060
//! use rsa::RsaPrivateKey;
6161
//! use rsa::pkcs1v15::{SigningKey, VerifyingKey};
6262
//! use sha2::{Digest, Sha256};
63-
//! use signature::{RandomizedSigner, SignatureEncoding, Verifier};
63+
//! use signature::{Keypair, RandomizedSigner, SignatureEncoding, Verifier};
6464
//!
6565
//! let mut rng = rand::thread_rng();
6666
//!
6767
//! let bits = 2048;
6868
//! let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
6969
//! let signing_key = SigningKey::<Sha256>::new_with_prefix(private_key);
70-
//! let verifying_key: VerifyingKey<_> = (&signing_key).into();
70+
//! let verifying_key = signing_key.verifying_key();
7171
//!
7272
//! // Sign
7373
//! let data = b"hello world";
@@ -83,14 +83,14 @@
8383
//! use rsa::RsaPrivateKey;
8484
//! use rsa::pss::{BlindedSigningKey, VerifyingKey};
8585
//! use sha2::{Digest, Sha256};
86-
//! use signature::{RandomizedSigner, SignatureEncoding, Verifier};
86+
//! use signature::{Keypair, RandomizedSigner, SignatureEncoding, Verifier};
8787
//!
8888
//! let mut rng = rand::thread_rng();
8989
//!
9090
//! let bits = 2048;
9191
//! let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
9292
//! let signing_key = BlindedSigningKey::<Sha256>::new(private_key);
93-
//! let verifying_key: VerifyingKey<_> = (&signing_key).into();
93+
//! let verifying_key = signing_key.verifying_key();
9494
//!
9595
//! // Sign
9696
//! let data = b"hello world";

src/pkcs1v15.rs

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use rand_core::{CryptoRng, RngCore};
1212
#[cfg(feature = "hazmat")]
1313
use signature::hazmat::{PrehashSigner, PrehashVerifier};
1414
use signature::{
15-
DigestSigner, DigestVerifier, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding,
16-
Signer, Verifier,
15+
DigestSigner, DigestVerifier, Keypair, RandomizedDigestSigner, RandomizedSigner,
16+
SignatureEncoding, Signer, Verifier,
1717
};
1818
use subtle::{Choice, ConditionallySelectable, ConstantTimeEq};
1919
use zeroize::Zeroizing;
@@ -329,14 +329,6 @@ where
329329
phantom: Default::default(),
330330
}
331331
}
332-
333-
pub(crate) fn key(&self) -> &RsaPrivateKey {
334-
&self.inner
335-
}
336-
337-
pub(crate) fn prefix(&self) -> Vec<u8> {
338-
self.prefix.clone()
339-
}
340332
}
341333

342334
impl<D> From<RsaPrivateKey> for SigningKey<D>
@@ -461,7 +453,7 @@ where
461453
/// Verifying key for PKCS#1 v1.5 signatures as described in [RFC8017 § 8.2].
462454
///
463455
/// [RFC8017 § 8.2]: https://datatracker.ietf.org/doc/html/rfc8017#section-8.2
464-
#[derive(Debug, Clone)]
456+
#[derive(Debug)]
465457
pub struct VerifyingKey<D>
466458
where
467459
D: Digest,
@@ -471,6 +463,20 @@ where
471463
phantom: PhantomData<D>,
472464
}
473465

466+
/* Implemented manually so we don't have to bind D with Clone */
467+
impl<D> Clone for VerifyingKey<D>
468+
where
469+
D: Digest,
470+
{
471+
fn clone(&self) -> Self {
472+
Self {
473+
inner: self.inner.clone(),
474+
prefix: self.prefix.clone(),
475+
phantom: Default::default(),
476+
}
477+
}
478+
}
479+
474480
impl<D> VerifyingKey<D>
475481
where
476482
D: Digest,
@@ -526,27 +532,15 @@ where
526532
}
527533
}
528534

529-
impl<D> From<SigningKey<D>> for VerifyingKey<D>
535+
impl<D> Keypair for SigningKey<D>
530536
where
531537
D: Digest,
532538
{
533-
fn from(key: SigningKey<D>) -> Self {
534-
Self {
535-
inner: key.key().into(),
536-
prefix: key.prefix(),
537-
phantom: Default::default(),
538-
}
539-
}
540-
}
541-
542-
impl<D> From<&SigningKey<D>> for VerifyingKey<D>
543-
where
544-
D: Digest,
545-
{
546-
fn from(key: &SigningKey<D>) -> Self {
547-
Self {
548-
inner: key.key().into(),
549-
prefix: key.prefix(),
539+
type VerifyingKey = VerifyingKey<D>;
540+
fn verifying_key(&self) -> Self::VerifyingKey {
541+
VerifyingKey {
542+
inner: self.inner.to_public_key(),
543+
prefix: self.prefix.clone(),
550544
phantom: Default::default(),
551545
}
552546
}
@@ -559,7 +553,7 @@ where
559553
fn verify(&self, msg: &[u8], signature: &Signature) -> signature::Result<()> {
560554
verify(
561555
&self.inner,
562-
&self.prefix,
556+
&self.prefix.clone(),
563557
&D::digest(msg),
564558
signature.as_ref(),
565559
)
@@ -986,7 +980,7 @@ mod tests {
986980
let sig = signing_key.sign_prehash(msg).expect("Failure during sign");
987981
assert_eq!(sig.as_ref(), expected_sig);
988982

989-
let verifying_key: VerifyingKey<_> = (&signing_key).into();
983+
let verifying_key = signing_key.verifying_key();
990984
verifying_key
991985
.verify_prehash(
992986
msg,

src/pss.rs

Lines changed: 48 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rand_core::{CryptoRng, RngCore};
1616
#[cfg(feature = "hazmat")]
1717
use signature::hazmat::{PrehashVerifier, RandomizedPrehashSigner};
1818
use signature::{
19-
DigestVerifier, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding, Verifier,
19+
DigestVerifier, Keypair, RandomizedDigestSigner, RandomizedSigner, SignatureEncoding, Verifier,
2020
};
2121
use subtle::ConstantTimeEq;
2222

@@ -559,10 +559,6 @@ where
559559
phantom: Default::default(),
560560
}
561561
}
562-
563-
pub(crate) fn key(&self) -> &RsaPrivateKey {
564-
&self.inner
565-
}
566562
}
567563

568564
impl<D> From<RsaPrivateKey> for SigningKey<D>
@@ -592,6 +588,19 @@ where
592588
}
593589
}
594590

591+
impl<D> Keypair for SigningKey<D>
592+
where
593+
D: Digest,
594+
{
595+
type VerifyingKey = VerifyingKey<D>;
596+
fn verifying_key(&self) -> Self::VerifyingKey {
597+
VerifyingKey {
598+
inner: self.inner.to_public_key(),
599+
phantom: Default::default(),
600+
}
601+
}
602+
}
603+
595604
impl<D> RandomizedSigner<Signature> for SigningKey<D>
596605
where
597606
D: Digest + FixedOutputReset,
@@ -688,10 +697,6 @@ where
688697
phantom: Default::default(),
689698
}
690699
}
691-
692-
pub(crate) fn key(&self) -> &RsaPrivateKey {
693-
&self.inner
694-
}
695700
}
696701

697702
impl<D> From<RsaPrivateKey> for BlindedSigningKey<D>
@@ -721,6 +726,19 @@ where
721726
}
722727
}
723728

729+
impl<D> Keypair for BlindedSigningKey<D>
730+
where
731+
D: Digest,
732+
{
733+
type VerifyingKey = VerifyingKey<D>;
734+
fn verifying_key(&self) -> Self::VerifyingKey {
735+
VerifyingKey {
736+
inner: self.inner.to_public_key(),
737+
phantom: Default::default(),
738+
}
739+
}
740+
}
741+
724742
impl<D> RandomizedSigner<Signature> for BlindedSigningKey<D>
725743
where
726744
D: Digest + FixedOutputReset,
@@ -786,7 +804,7 @@ where
786804
/// described in [RFC8017 § 8.1].
787805
///
788806
/// [RFC8017 § 8.1]: https://datatracker.ietf.org/doc/html/rfc8017#section-8.1
789-
#[derive(Debug, Clone)]
807+
#[derive(Debug)]
790808
pub struct VerifyingKey<D>
791809
where
792810
D: Digest,
@@ -795,6 +813,19 @@ where
795813
phantom: PhantomData<D>,
796814
}
797815

816+
/* Implemented manually so we don't have to bind D with Clone */
817+
impl<D> Clone for VerifyingKey<D>
818+
where
819+
D: Digest,
820+
{
821+
fn clone(&self) -> Self {
822+
Self {
823+
inner: self.inner.clone(),
824+
phantom: Default::default(),
825+
}
826+
}
827+
}
828+
798829
impl<D> VerifyingKey<D>
799830
where
800831
D: Digest,
@@ -826,54 +857,6 @@ where
826857
}
827858
}
828859

829-
impl<D> From<SigningKey<D>> for VerifyingKey<D>
830-
where
831-
D: Digest,
832-
{
833-
fn from(key: SigningKey<D>) -> Self {
834-
Self {
835-
inner: key.key().into(),
836-
phantom: Default::default(),
837-
}
838-
}
839-
}
840-
841-
impl<D> From<&SigningKey<D>> for VerifyingKey<D>
842-
where
843-
D: Digest,
844-
{
845-
fn from(key: &SigningKey<D>) -> Self {
846-
Self {
847-
inner: key.key().into(),
848-
phantom: Default::default(),
849-
}
850-
}
851-
}
852-
853-
impl<D> From<BlindedSigningKey<D>> for VerifyingKey<D>
854-
where
855-
D: Digest,
856-
{
857-
fn from(key: BlindedSigningKey<D>) -> Self {
858-
Self {
859-
inner: key.key().into(),
860-
phantom: Default::default(),
861-
}
862-
}
863-
}
864-
865-
impl<D> From<&BlindedSigningKey<D>> for VerifyingKey<D>
866-
where
867-
D: Digest,
868-
{
869-
fn from(key: &BlindedSigningKey<D>) -> Self {
870-
Self {
871-
inner: key.key().into(),
872-
phantom: Default::default(),
873-
}
874-
}
875-
}
876-
877860
impl<D> Verifier<Signature> for VerifyingKey<D>
878861
where
879862
D: Digest + FixedOutputReset,
@@ -934,7 +917,7 @@ mod test {
934917
use sha1::{Digest, Sha1};
935918
#[cfg(feature = "hazmat")]
936919
use signature::hazmat::{PrehashVerifier, RandomizedPrehashSigner};
937-
use signature::{DigestVerifier, RandomizedDigestSigner, RandomizedSigner, Verifier};
920+
use signature::{DigestVerifier, Keypair, RandomizedDigestSigner, RandomizedSigner, Verifier};
938921

939922
fn get_private_key() -> RsaPrivateKey {
940923
// In order to generate new test vectors you'll need the PEM form of this key:
@@ -1118,7 +1101,7 @@ mod test {
11181101
let tests = ["test\n"];
11191102
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11201103
let signing_key = SigningKey::<Sha1>::new(priv_key);
1121-
let verifying_key = VerifyingKey::from(&signing_key);
1104+
let verifying_key = signing_key.verifying_key();
11221105

11231106
for test in &tests {
11241107
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
@@ -1135,7 +1118,7 @@ mod test {
11351118
let tests = ["test\n"];
11361119
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11371120
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1138-
let verifying_key = VerifyingKey::from(&signing_key);
1121+
let verifying_key = signing_key.verifying_key();
11391122

11401123
for test in &tests {
11411124
let sig = signing_key.sign_with_rng(&mut rng, test.as_bytes());
@@ -1152,7 +1135,7 @@ mod test {
11521135
let tests = ["test\n"];
11531136
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11541137
let signing_key = SigningKey::new(priv_key);
1155-
let verifying_key = VerifyingKey::from(&signing_key);
1138+
let verifying_key = signing_key.verifying_key();
11561139

11571140
for test in &tests {
11581141
let mut digest = Sha1::new();
@@ -1174,7 +1157,7 @@ mod test {
11741157
let tests = ["test\n"];
11751158
let mut rng = ChaCha8Rng::from_seed([42; 32]);
11761159
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1177-
let verifying_key = VerifyingKey::from(&signing_key);
1160+
let verifying_key = signing_key.verifying_key();
11781161

11791162
for test in &tests {
11801163
let mut digest = Sha1::new();
@@ -1235,7 +1218,7 @@ mod test {
12351218
let tests = [Sha1::digest("test\n")];
12361219
let mut rng = ChaCha8Rng::from_seed([42; 32]);
12371220
let signing_key = SigningKey::<Sha1>::new(priv_key);
1238-
let verifying_key = VerifyingKey::from(&signing_key);
1221+
let verifying_key = signing_key.verifying_key();
12391222

12401223
for test in &tests {
12411224
let sig = signing_key
@@ -1255,7 +1238,7 @@ mod test {
12551238
let tests = [Sha1::digest("test\n")];
12561239
let mut rng = ChaCha8Rng::from_seed([42; 32]);
12571240
let signing_key = BlindedSigningKey::<Sha1>::new(priv_key);
1258-
let verifying_key = VerifyingKey::from(&signing_key);
1241+
let verifying_key = signing_key.verifying_key();
12591242

12601243
for test in &tests {
12611244
let sig = signing_key

0 commit comments

Comments
 (0)