portable_rustls/crypto/aws_lc_rs/
mod.rs1use alloc::vec::Vec;
2
3pub(crate) use aws_lc_rs as ring_like;
8use pki_types::PrivateKeyDer;
9use webpki::aws_lc_rs as webpki_algs;
10
11use crate::crypto::{CryptoProvider, KeyProvider, SecureRandom, SupportedKxGroup};
12use crate::enums::SignatureScheme;
13use crate::rand::GetRandomFailed;
14use crate::sign::SigningKey;
15use crate::suites::SupportedCipherSuite;
16use crate::sync::Arc;
17use crate::webpki::WebPkiSupportedAlgorithms;
18use crate::{Error, OtherError};
19
20pub mod hpke;
22pub(crate) mod pq;
24pub mod sign;
26
27#[path = "../ring/hash.rs"]
28pub(crate) mod hash;
29#[path = "../ring/hmac.rs"]
30pub(crate) mod hmac;
31#[path = "../ring/kx.rs"]
32pub(crate) mod kx;
33#[path = "../ring/quic.rs"]
34pub(crate) mod quic;
35#[cfg(any(feature = "std", feature = "hashbrown"))]
36pub(crate) mod ticketer;
37#[cfg(feature = "tls12")]
38pub(crate) mod tls12;
39pub(crate) mod tls13;
40
41pub fn default_provider() -> CryptoProvider {
43 CryptoProvider {
44 cipher_suites: DEFAULT_CIPHER_SUITES.to_vec(),
45 kx_groups: default_kx_groups(),
46 signature_verification_algorithms: SUPPORTED_SIG_ALGS,
47 secure_random: &AwsLcRs,
48 key_provider: &AwsLcRs,
49 }
50}
51
52fn default_kx_groups() -> Vec<&'static dyn SupportedKxGroup> {
53 {
58 DEFAULT_KX_GROUPS.to_vec()
59 }
60}
61
62#[derive(Debug)]
63struct AwsLcRs;
64
65impl SecureRandom for AwsLcRs {
66 fn fill(&self, buf: &mut [u8]) -> Result<(), GetRandomFailed> {
67 use ring_like::rand::SecureRandom;
68
69 ring_like::rand::SystemRandom::new()
70 .fill(buf)
71 .map_err(|_| GetRandomFailed)
72 }
73
74 #[cfg(unstable_api_not_supported)] fn fips(&self) -> bool {
76 fips()
77 }
78}
79
80impl KeyProvider for AwsLcRs {
81 fn load_private_key(
82 &self,
83 key_der: PrivateKeyDer<'static>,
84 ) -> Result<Arc<dyn SigningKey>, Error> {
85 sign::any_supported_type(&key_der)
86 }
87
88 #[cfg(unstable_api_not_supported)] fn fips(&self) -> bool {
90 fips()
91 }
92}
93
94pub static DEFAULT_CIPHER_SUITES: &[SupportedCipherSuite] = &[
99 tls13::TLS13_AES_256_GCM_SHA384,
101 tls13::TLS13_AES_128_GCM_SHA256,
102 tls13::TLS13_CHACHA20_POLY1305_SHA256,
104 #[cfg(feature = "tls12")]
106 tls12::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
107 #[cfg(feature = "tls12")]
108 tls12::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
109 #[cfg(feature = "tls12")]
112 tls12::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
113 #[cfg(feature = "tls12")]
114 tls12::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
115 #[cfg(feature = "tls12")]
116 tls12::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
117 #[cfg(feature = "tls12")]
120 tls12::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
121];
122
123pub static ALL_CIPHER_SUITES: &[SupportedCipherSuite] = &[
125 tls13::TLS13_AES_256_GCM_SHA384,
127 tls13::TLS13_AES_128_GCM_SHA256,
128 tls13::TLS13_CHACHA20_POLY1305_SHA256,
129 #[cfg(feature = "tls12")]
131 tls12::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
132 #[cfg(feature = "tls12")]
133 tls12::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
134 #[cfg(feature = "tls12")]
135 tls12::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
136 #[cfg(feature = "tls12")]
137 tls12::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
138 #[cfg(feature = "tls12")]
139 tls12::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
140 #[cfg(feature = "tls12")]
141 tls12::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
142];
143
144pub mod cipher_suite {
146 #[cfg(feature = "tls12")]
147 pub use super::tls12::{
148 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
149 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
150 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
151 };
152 pub use super::tls13::{
153 TLS13_AES_128_GCM_SHA256, TLS13_AES_256_GCM_SHA384, TLS13_CHACHA20_POLY1305_SHA256,
154 };
155}
156
157static SUPPORTED_SIG_ALGS: WebPkiSupportedAlgorithms = WebPkiSupportedAlgorithms {
160 all: &[
161 webpki_algs::ECDSA_P256_SHA256,
162 webpki_algs::ECDSA_P256_SHA384,
163 webpki_algs::ECDSA_P384_SHA256,
164 webpki_algs::ECDSA_P384_SHA384,
165 webpki_algs::ECDSA_P521_SHA256,
166 webpki_algs::ECDSA_P521_SHA384,
167 webpki_algs::ECDSA_P521_SHA512,
168 webpki_algs::ED25519,
169 webpki_algs::RSA_PSS_2048_8192_SHA256_LEGACY_KEY,
170 webpki_algs::RSA_PSS_2048_8192_SHA384_LEGACY_KEY,
171 webpki_algs::RSA_PSS_2048_8192_SHA512_LEGACY_KEY,
172 webpki_algs::RSA_PKCS1_2048_8192_SHA256,
173 webpki_algs::RSA_PKCS1_2048_8192_SHA384,
174 webpki_algs::RSA_PKCS1_2048_8192_SHA512,
175 webpki_algs::RSA_PKCS1_3072_8192_SHA384,
176 ],
177 mapping: &[
178 (
180 SignatureScheme::ECDSA_NISTP384_SHA384,
181 &[
182 webpki_algs::ECDSA_P384_SHA384,
183 webpki_algs::ECDSA_P256_SHA384,
184 webpki_algs::ECDSA_P521_SHA384,
185 ],
186 ),
187 (
188 SignatureScheme::ECDSA_NISTP256_SHA256,
189 &[
190 webpki_algs::ECDSA_P256_SHA256,
191 webpki_algs::ECDSA_P384_SHA256,
192 webpki_algs::ECDSA_P521_SHA256,
193 ],
194 ),
195 (
196 SignatureScheme::ECDSA_NISTP521_SHA512,
197 &[webpki_algs::ECDSA_P521_SHA512],
198 ),
199 (SignatureScheme::ED25519, &[webpki_algs::ED25519]),
200 (
201 SignatureScheme::RSA_PSS_SHA512,
202 &[webpki_algs::RSA_PSS_2048_8192_SHA512_LEGACY_KEY],
203 ),
204 (
205 SignatureScheme::RSA_PSS_SHA384,
206 &[webpki_algs::RSA_PSS_2048_8192_SHA384_LEGACY_KEY],
207 ),
208 (
209 SignatureScheme::RSA_PSS_SHA256,
210 &[webpki_algs::RSA_PSS_2048_8192_SHA256_LEGACY_KEY],
211 ),
212 (
213 SignatureScheme::RSA_PKCS1_SHA512,
214 &[webpki_algs::RSA_PKCS1_2048_8192_SHA512],
215 ),
216 (
217 SignatureScheme::RSA_PKCS1_SHA384,
218 &[webpki_algs::RSA_PKCS1_2048_8192_SHA384],
219 ),
220 (
221 SignatureScheme::RSA_PKCS1_SHA256,
222 &[webpki_algs::RSA_PKCS1_2048_8192_SHA256],
223 ),
224 ],
225};
226
227pub mod kx_group {
232 pub use super::kx::{SECP256R1, SECP384R1, X25519};
233 pub use super::pq::{MLKEM768, X25519MLKEM768};
234}
235
236pub static DEFAULT_KX_GROUPS: &[&dyn SupportedKxGroup] = &[
241 #[cfg(feature = "prefer-post-quantum")]
242 kx_group::X25519MLKEM768,
243 kx_group::X25519,
244 kx_group::SECP256R1,
245 kx_group::SECP384R1,
246 #[cfg(not(feature = "prefer-post-quantum"))]
247 kx_group::X25519MLKEM768,
248];
249
250pub static ALL_KX_GROUPS: &[&dyn SupportedKxGroup] = &[
252 #[cfg(feature = "prefer-post-quantum")]
253 kx_group::X25519MLKEM768,
254 kx_group::X25519,
255 kx_group::SECP256R1,
256 kx_group::SECP384R1,
257 #[cfg(not(feature = "prefer-post-quantum"))]
258 kx_group::X25519MLKEM768,
259 kx_group::MLKEM768,
260];
261
262#[cfg(any(feature = "std", feature = "hashbrown"))]
263pub use ticketer::Ticketer;
264
265mod ring_shim {
267 use super::ring_like;
268 use crate::crypto::SharedSecret;
269
270 pub(super) fn agree_ephemeral(
271 priv_key: ring_like::agreement::EphemeralPrivateKey,
272 peer_key: &ring_like::agreement::UnparsedPublicKey<&[u8]>,
273 ) -> Result<SharedSecret, ()> {
274 ring_like::agreement::agree_ephemeral(priv_key, peer_key, (), |secret| {
275 Ok(SharedSecret::from(secret))
276 })
277 }
278}
279
280#[cfg(unstable_api_not_supported)] pub(super) fn fips() -> bool {
283 aws_lc_rs::try_fips_mode().is_ok()
284}
285
286pub(super) fn unspecified_err(_e: aws_lc_rs::error::Unspecified) -> Error {
287 #[cfg(feature = "std")]
288 {
289 Error::Other(OtherError(Arc::new(_e)))
290 }
291 #[cfg(not(feature = "std"))]
292 {
293 Error::Other(OtherError())
294 }
295}
296
297#[cfg(test)]
298mod tests {
299 #[test]
306 fn default_suites() {
307 assert_eq!(super::DEFAULT_CIPHER_SUITES, super::ALL_CIPHER_SUITES);
308 }
309}