rustls_cert_reloadable_resolver/
key_provider.rs

1//! The [`rustls::crypto::KeyProvider`] implementation.
2
3/// A wrapper for [`&'static dyn rustls::crypto::KeyProvider`] that implements
4/// [`rustls::crypto::KeyProvider`].
5#[derive(Debug)]
6pub struct Dyn(pub &'static dyn rustls::crypto::KeyProvider);
7
8impl rustls::crypto::KeyProvider for Dyn {
9    fn load_private_key(
10        &self,
11        key_der: rustls::pki_types::PrivateKeyDer<'static>,
12    ) -> Result<std::sync::Arc<dyn rustls::sign::SigningKey>, rustls::Error> {
13        self.0.load_private_key(key_der)
14    }
15}
16
17/// A wrapper for anything that can borrow [`rustls::crypto::CryptoProvider`] that implements
18/// [`rustls::crypto::KeyProvider`].
19pub struct FromCrypto<T>(pub T)
20where
21    T: std::borrow::Borrow<rustls::crypto::CryptoProvider>;
22
23impl<T> rustls::crypto::KeyProvider for FromCrypto<T>
24where
25    T: std::borrow::Borrow<rustls::crypto::CryptoProvider> + Send + Sync,
26{
27    fn load_private_key(
28        &self,
29        key_der: rustls::pki_types::PrivateKeyDer<'static>,
30    ) -> Result<std::sync::Arc<dyn rustls::sign::SigningKey>, rustls::Error> {
31        let crypto_provider: &rustls::crypto::CryptoProvider = self.0.borrow();
32        crypto_provider.key_provider.load_private_key(key_der)
33    }
34}
35
36impl<T> std::fmt::Debug for FromCrypto<T>
37where
38    T: std::borrow::Borrow<rustls::crypto::CryptoProvider>,
39{
40    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41        let crypto_provider: &rustls::crypto::CryptoProvider = self.0.borrow();
42        f.debug_tuple("FromCrypto").field(crypto_provider).finish()
43    }
44}