aws_lc_rs/rsa/
encryption.rs1pub(super) mod oaep;
5pub(super) mod pkcs1;
6
7use super::key::{generate_rsa_key, validate_rsa_key};
8use super::{encoding, KeySize};
9use crate::aws_lc::{EVP_PKEY, EVP_PKEY_RSA};
10use crate::encoding::{AsDer, Pkcs8V1Der, PublicKeyX509Der};
11use crate::error::{KeyRejected, Unspecified};
12use crate::pkcs8::Version;
13use crate::ptr::LcPtr;
14use core::fmt::Debug;
15
16#[allow(clippy::module_name_repetitions)]
18#[derive(Debug, Clone, Copy, PartialEq)]
19#[non_exhaustive]
20pub enum EncryptionAlgorithmId {
21 OaepSha1Mgf1sha1,
23
24 OaepSha256Mgf1sha256,
26
27 OaepSha384Mgf1sha384,
29
30 OaepSha512Mgf1sha512,
32}
33
34pub struct PrivateDecryptingKey(LcPtr<EVP_PKEY>);
36
37unsafe impl Send for PrivateDecryptingKey {}
44unsafe impl Sync for PrivateDecryptingKey {}
45
46impl PrivateDecryptingKey {
47 fn new(evp_pkey: LcPtr<EVP_PKEY>) -> Result<Self, KeyRejected> {
48 Self::validate_key(&evp_pkey)?;
49 Ok(Self(evp_pkey))
50 }
51
52 fn validate_key(key: &LcPtr<EVP_PKEY>) -> Result<(), KeyRejected> {
53 validate_rsa_key(key)
54 }
55
56 pub fn generate(size: KeySize) -> Result<Self, Unspecified> {
67 let key = generate_rsa_key(size.bits())?;
68 Ok(Self::new(key)?)
69 }
70
71 #[cfg(feature = "fips")]
85 #[deprecated(
86 since = "1.12.3",
87 note = "Equivalent to `PrivateDecryptingKey::generate`; use that instead."
88 )]
89 pub fn generate_fips(size: KeySize) -> Result<Self, Unspecified> {
90 Self::generate(size)
91 }
92
93 pub fn from_pkcs8(pkcs8: &[u8]) -> Result<Self, KeyRejected> {
101 let key = LcPtr::<EVP_PKEY>::parse_rfc5208_private_key(pkcs8, EVP_PKEY_RSA)?;
102 Self::new(key)
103 }
104
105 #[cfg(feature = "fips")]
107 #[must_use]
108 pub fn is_valid_fips_key(&self) -> bool {
109 super::key::is_valid_fips_key(&self.0)
110 }
111
112 #[must_use]
114 pub fn key_size_bytes(&self) -> usize {
115 self.0.as_const().signature_size_bytes()
116 }
117
118 #[must_use]
120 pub fn key_size_bits(&self) -> usize {
121 self.0.as_const().key_size_bits()
122 }
123
124 #[must_use]
126 #[allow(clippy::missing_panics_doc)]
127 pub fn public_key(&self) -> PublicEncryptingKey {
128 PublicEncryptingKey::new(self.0.clone()).expect(
129 "PublicEncryptingKey key size to be supported by PrivateDecryptingKey key sizes",
130 )
131 }
132}
133
134impl Debug for PrivateDecryptingKey {
135 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
136 f.debug_tuple("PrivateDecryptingKey").finish()
137 }
138}
139
140impl AsDer<Pkcs8V1Der<'static>> for PrivateDecryptingKey {
141 fn as_der(&self) -> Result<Pkcs8V1Der<'static>, Unspecified> {
142 Ok(Pkcs8V1Der::new(
143 self.0.as_const().marshal_rfc5208_private_key(Version::V1)?,
144 ))
145 }
146}
147
148impl Clone for PrivateDecryptingKey {
149 fn clone(&self) -> Self {
150 Self(self.0.clone())
151 }
152}
153
154pub struct PublicEncryptingKey(LcPtr<EVP_PKEY>);
156
157unsafe impl Send for PublicEncryptingKey {}
159unsafe impl Sync for PublicEncryptingKey {}
160
161impl PublicEncryptingKey {
162 pub(crate) fn new(evp_pkey: LcPtr<EVP_PKEY>) -> Result<Self, KeyRejected> {
163 Self::validate_key(&evp_pkey)?;
164 Ok(Self(evp_pkey))
165 }
166
167 fn validate_key(key: &LcPtr<EVP_PKEY>) -> Result<(), KeyRejected> {
168 validate_rsa_key(key)
169 }
170
171 pub fn from_der(value: &[u8]) -> Result<Self, KeyRejected> {
177 let key = encoding::rfc5280::decode_public_key_der(value)?;
178 Self::new(key)
179 }
180
181 #[must_use]
183 pub fn key_size_bytes(&self) -> usize {
184 self.0.as_const().signature_size_bytes()
185 }
186
187 #[must_use]
189 pub fn key_size_bits(&self) -> usize {
190 self.0.as_const().key_size_bits()
191 }
192}
193
194impl Debug for PublicEncryptingKey {
195 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
196 f.debug_tuple("PublicEncryptingKey").finish()
197 }
198}
199
200impl Clone for PublicEncryptingKey {
201 fn clone(&self) -> Self {
202 Self(self.0.clone())
203 }
204}
205
206impl AsDer<PublicKeyX509Der<'static>> for PublicEncryptingKey {
207 fn as_der(&self) -> Result<PublicKeyX509Der<'static>, Unspecified> {
212 encoding::rfc5280::encode_public_key_der(&self.0)
213 }
214}