From cfacdf46af4c40cdadb211d4bb6c60b83f8d1295 Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Wed, 26 Apr 2023 20:13:32 -0600 Subject: [PATCH] Refactor traits There were several modules that defined traits, including one called `traits`. This consolidates all of them under `traits`, retaining the previous module structure as internal submodules: - `keytraits` => `traits::keys` - `padding` => `traits::padding` - `traits` => `traits::encryption` Additionally this removes the traits that were re-exported at the toplevel, instead re-exporting them all under `traits`. --- src/algorithms/rsa.rs | 2 +- src/encoding.rs | 2 +- src/key.rs | 5 ++- src/lib.rs | 5 +-- src/oaep.rs | 6 ++-- src/pkcs1v15.rs | 6 ++-- src/pss.rs | 4 +-- src/traits.rs | 47 +++++----------------------- src/traits/encryption.rs | 42 +++++++++++++++++++++++++ src/{keytraits.rs => traits/keys.rs} | 0 src/{ => traits}/padding.rs | 0 tests/pkcs1.rs | 3 +- tests/pkcs8.rs | 3 +- 13 files changed, 66 insertions(+), 59 deletions(-) create mode 100644 src/traits/encryption.rs rename src/{keytraits.rs => traits/keys.rs} (100%) rename src/{ => traits}/padding.rs (100%) diff --git a/src/algorithms/rsa.rs b/src/algorithms/rsa.rs index 2fa5d2de..51299e57 100644 --- a/src/algorithms/rsa.rs +++ b/src/algorithms/rsa.rs @@ -8,7 +8,7 @@ use rand_core::CryptoRngCore; use zeroize::Zeroize; use crate::errors::{Error, Result}; -use crate::keytraits::{PrivateKeyParts, PublicKeyParts}; +use crate::traits::{PrivateKeyParts, PublicKeyParts}; /// Raw RSA encryption of m with the public key. No padding is performed. #[inline] diff --git a/src/encoding.rs b/src/encoding.rs index 1a1bc864..bc0fac2c 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -4,7 +4,7 @@ //! `pkcs1` crate's traits for types which impl the `pkcs8` crate's traits. use crate::{ - keytraits::{PrivateKeyParts, PublicKeyParts}, + traits::{PrivateKeyParts, PublicKeyParts}, BigUint, RsaPrivateKey, RsaPublicKey, }; use core::convert::{TryFrom, TryInto}; diff --git a/src/key.rs b/src/key.rs index ef82d3ec..ef01183b 100644 --- a/src/key.rs +++ b/src/key.rs @@ -16,9 +16,8 @@ use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::algorithms::generate::generate_multi_prime_key_with_exp; use crate::dummy_rng::DummyRng; use crate::errors::{Error, Result}; -use crate::keytraits::{CrtValue, PrivateKeyParts, PublicKeyParts}; - -use crate::padding::{PaddingScheme, SignatureScheme}; +use crate::traits::{PaddingScheme, PrivateKeyParts, PublicKeyParts, SignatureScheme}; +use crate::CrtValue; /// Represents the public part of an RSA key. #[derive(Debug, Clone, Hash, PartialEq, Eq)] diff --git a/src/lib.rs b/src/lib.rs index cb03596c..4862d0d4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -224,7 +224,6 @@ pub use signature; mod algorithms; pub mod errors; -mod keytraits; pub mod oaep; pub mod pkcs1v15; pub mod pss; @@ -233,7 +232,6 @@ pub mod traits; mod dummy_rng; mod encoding; mod key; -mod padding; pub use pkcs1; pub use pkcs8; @@ -242,9 +240,8 @@ pub use sha2; pub use crate::{ key::{RsaPrivateKey, RsaPublicKey}, - keytraits::{CrtValue, PrivateKeyParts, PublicKeyParts}, oaep::Oaep, - padding::{PaddingScheme, SignatureScheme}, pkcs1v15::{Pkcs1v15Encrypt, Pkcs1v15Sign}, pss::Pss, + traits::keys::CrtValue, }; diff --git a/src/oaep.rs b/src/oaep.rs index 3941e709..a4c1580c 100644 --- a/src/oaep.rs +++ b/src/oaep.rs @@ -21,9 +21,9 @@ use crate::algorithms::rsa::{rsa_decrypt_and_check, rsa_encrypt}; use crate::dummy_rng::DummyRng; use crate::errors::{Error, Result}; use crate::key::{self, RsaPrivateKey, RsaPublicKey}; -use crate::keytraits::PublicKeyParts; -use crate::padding::PaddingScheme; +use crate::traits::PaddingScheme; use crate::traits::{Decryptor, RandomizedDecryptor, RandomizedEncryptor}; +use crate::traits::PublicKeyParts; /// Encryption and Decryption using [OAEP padding](https://datatracker.ietf.org/doc/html/rfc8017#section-7.1). /// @@ -422,9 +422,9 @@ where #[cfg(test)] mod tests { use crate::key::{RsaPrivateKey, RsaPublicKey}; - use crate::keytraits::PublicKeyParts; use crate::oaep::{DecryptingKey, EncryptingKey, Oaep}; use crate::traits::{Decryptor, RandomizedDecryptor, RandomizedEncryptor}; + use crate::traits::PublicKeyParts; use alloc::string::String; use digest::{Digest, DynDigest, FixedOutputReset}; diff --git a/src/pkcs1v15.rs b/src/pkcs1v15.rs index 0810c86f..18844e13 100644 --- a/src/pkcs1v15.rs +++ b/src/pkcs1v15.rs @@ -32,8 +32,8 @@ use crate::algorithms::rsa::{rsa_decrypt_and_check, rsa_encrypt}; use crate::dummy_rng::DummyRng; use crate::errors::{Error, Result}; use crate::key; -use crate::keytraits::PublicKeyParts; -use crate::padding::{PaddingScheme, SignatureScheme}; +use crate::traits::{PaddingScheme, SignatureScheme}; +use crate::traits::PublicKeyParts; use crate::traits::{Decryptor, EncryptingKeypair, RandomizedDecryptor, RandomizedEncryptor}; use crate::{RsaPrivateKey, RsaPublicKey}; @@ -792,7 +792,7 @@ mod tests { use sha3::Sha3_256; use signature::{RandomizedSigner, Signer, Verifier}; - use crate::{PublicKeyParts, RsaPrivateKey, RsaPublicKey}; + use crate::{traits::PublicKeyParts, RsaPrivateKey, RsaPublicKey}; fn get_private_key() -> RsaPrivateKey { // In order to generate new test vectors you'll need the PEM form of this key: diff --git a/src/pss.rs b/src/pss.rs index 56d2a2b4..e6c7e51c 100644 --- a/src/pss.rs +++ b/src/pss.rs @@ -36,8 +36,8 @@ use crate::algorithms::pad::{uint_to_be_pad, uint_to_zeroizing_be_pad}; use crate::algorithms::pss::*; use crate::algorithms::rsa::{rsa_decrypt_and_check, rsa_encrypt}; use crate::errors::{Error, Result}; -use crate::keytraits::PublicKeyParts; -use crate::padding::SignatureScheme; +use crate::traits::SignatureScheme; +use crate::traits::PublicKeyParts; use crate::{RsaPrivateKey, RsaPublicKey}; #[cfg(feature = "getrandom")] diff --git a/src/traits.rs b/src/traits.rs index 30b67902..d3563d4a 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -1,42 +1,9 @@ -//! Generic traits for message encryption and decryption +//! RSA-related trait definitions. -use alloc::vec::Vec; -use rand_core::CryptoRngCore; +mod encryption; +pub(crate) mod keys; +mod padding; -use crate::errors::Result; - -/// Encrypt the message using provided random source -pub trait RandomizedEncryptor { - /// Encrypt the given message. - fn encrypt_with_rng( - &self, - rng: &mut R, - msg: &[u8], - ) -> Result>; -} - -/// Decrypt the given message -pub trait Decryptor { - /// Decrypt the given message. - fn decrypt(&self, ciphertext: &[u8]) -> Result>; -} - -/// Decrypt the given message using provided random source -pub trait RandomizedDecryptor { - /// Decrypt the given message. - fn decrypt_with_rng( - &self, - rng: &mut R, - ciphertext: &[u8], - ) -> Result>; -} - -/// Encryption keypair with an associated encryption key. -pub trait EncryptingKeypair { - /// Encrypting key type for this keypair. - type EncryptingKey: Clone; - - /// Get the encrypting key which can encrypt messages to be decrypted by - /// the decryption key portion of this keypair. - fn encrypting_key(&self) -> Self::EncryptingKey; -} +pub use encryption::{Decryptor, EncryptingKeypair, RandomizedDecryptor, RandomizedEncryptor}; +pub use keys::{PrivateKeyParts, PublicKeyParts}; +pub use padding::{PaddingScheme, SignatureScheme}; diff --git a/src/traits/encryption.rs b/src/traits/encryption.rs new file mode 100644 index 00000000..e57caed4 --- /dev/null +++ b/src/traits/encryption.rs @@ -0,0 +1,42 @@ +//! Encryption-related traits. + +use alloc::vec::Vec; +use rand_core::CryptoRngCore; + +use crate::errors::Result; + +/// Encrypt the message using provided random source +pub trait RandomizedEncryptor { + /// Encrypt the given message. + fn encrypt_with_rng( + &self, + rng: &mut R, + msg: &[u8], + ) -> Result>; +} + +/// Decrypt the given message +pub trait Decryptor { + /// Decrypt the given message. + fn decrypt(&self, ciphertext: &[u8]) -> Result>; +} + +/// Decrypt the given message using provided random source +pub trait RandomizedDecryptor { + /// Decrypt the given message. + fn decrypt_with_rng( + &self, + rng: &mut R, + ciphertext: &[u8], + ) -> Result>; +} + +/// Encryption keypair with an associated encryption key. +pub trait EncryptingKeypair { + /// Encrypting key type for this keypair. + type EncryptingKey: Clone; + + /// Get the encrypting key which can encrypt messages to be decrypted by + /// the decryption key portion of this keypair. + fn encrypting_key(&self) -> Self::EncryptingKey; +} diff --git a/src/keytraits.rs b/src/traits/keys.rs similarity index 100% rename from src/keytraits.rs rename to src/traits/keys.rs diff --git a/src/padding.rs b/src/traits/padding.rs similarity index 100% rename from src/padding.rs rename to src/traits/padding.rs diff --git a/tests/pkcs1.rs b/tests/pkcs1.rs index 30144351..eff97f6d 100644 --- a/tests/pkcs1.rs +++ b/tests/pkcs1.rs @@ -3,7 +3,8 @@ use hex_literal::hex; use rsa::{ pkcs1::{DecodeRsaPrivateKey, DecodeRsaPublicKey, EncodeRsaPrivateKey, EncodeRsaPublicKey}, - PrivateKeyParts, PublicKeyParts, RsaPrivateKey, RsaPublicKey, + traits::{PrivateKeyParts, PublicKeyParts}, + RsaPrivateKey, RsaPublicKey, }; #[cfg(feature = "pem")] diff --git a/tests/pkcs8.rs b/tests/pkcs8.rs index 44a0f103..07757fba 100644 --- a/tests/pkcs8.rs +++ b/tests/pkcs8.rs @@ -17,7 +17,8 @@ const RSA_2048_PUB_PEM: &str = include_str!("examples/pkcs8/rsa2048-pub.pem"); use hex_literal::hex; use rsa::{ pkcs8::{DecodePrivateKey, DecodePublicKey, EncodePrivateKey, EncodePublicKey}, - PrivateKeyParts, PublicKeyParts, RsaPrivateKey, RsaPublicKey, + traits::{PrivateKeyParts, PublicKeyParts}, + RsaPrivateKey, RsaPublicKey, }; #[cfg(feature = "pem")]