rustls_cng_crypto/signer/
mod.rs

1use rustls::pki_types::PrivateKeyDer;
2use rustls::sign::SigningKey;
3use rustls::Error;
4use std::sync::Arc;
5
6mod ec;
7mod rsa;
8#[cfg(feature = "tls12")]
9pub(crate) use rsa::RSA_SCHEMES;
10
11/// A struct that implements [`rustls::crypto::KeyProvider`].
12#[derive(Debug)]
13pub struct KeyProvider;
14
15impl rustls::crypto::KeyProvider for KeyProvider {
16    fn load_private_key(
17        &self,
18        key_der: PrivateKeyDer<'static>,
19    ) -> Result<Arc<dyn SigningKey>, Error> {
20        any_supported_type(&key_der)
21    }
22
23    fn fips(&self) -> bool {
24        crate::fips::enabled()
25    }
26}
27
28fn any_supported_type(der: &PrivateKeyDer<'_>) -> Result<Arc<dyn SigningKey>, Error> {
29    if let Ok(key) = rsa::RsaSigningKey::new(der) {
30        return Ok(Arc::new(key));
31    }
32    if let Ok(key) = ec::EcKey::new(der) {
33        return Ok(Arc::new(key));
34    }
35    Err(Error::General("Unsupported key type".to_string()))
36}