Skip to main content

rsa/pkcs1v15/
encrypting_key.rs

1use super::encrypt;
2use crate::{traits::RandomizedEncryptor, Result, RsaPublicKey};
3use alloc::vec::Vec;
4use rand_core::CryptoRng;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8/// Encryption key for PKCS#1 v1.5 encryption as described in [RFC8017 § 7.2].
9///
10/// [RFC8017 § 7.2]: https://datatracker.ietf.org/doc/html/rfc8017#section-7.2
11#[derive(Debug, Clone, PartialEq)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
13pub struct EncryptingKey {
14    pub(super) inner: RsaPublicKey,
15}
16
17impl EncryptingKey {
18    /// Create a new verifying key from an RSA public key.
19    pub fn new(key: RsaPublicKey) -> Self {
20        Self { inner: key }
21    }
22}
23
24impl RandomizedEncryptor for EncryptingKey {
25    fn encrypt_with_rng<R: CryptoRng + ?Sized>(&self, rng: &mut R, msg: &[u8]) -> Result<Vec<u8>> {
26        encrypt(rng, &self.inner, msg)
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    #[test]
33    #[cfg(all(feature = "hazmat", feature = "serde"))]
34    fn test_serde() {
35        use super::*;
36        use crate::RsaPrivateKey;
37        use rand::rngs::ChaCha8Rng;
38        use rand_core::SeedableRng;
39        use serde_test::{assert_tokens, Configure, Token};
40
41        let mut rng = ChaCha8Rng::from_seed([42; 32]);
42        let priv_key = RsaPrivateKey::new_unchecked(&mut rng, 64).expect("failed to generate key");
43        let encrypting_key = EncryptingKey::new(priv_key.to_public_key());
44
45        let tokens = [
46            Token::Struct {
47                name: "EncryptingKey",
48                len: 1,
49            },
50            Token::Str("inner"),
51            Token::Str(
52                "3024300d06092a864886f70d01010105000313003010020900ab240c3361d02e370203010001",
53            ),
54            Token::StructEnd,
55        ];
56        assert_tokens(&encrypting_key.clone().readable(), &tokens);
57    }
58}