use crate::OneIoError;
#[cfg(feature = "rustls")]
pub fn ensure_default_provider() -> Result<(), OneIoError> {
if rustls_sys::crypto::CryptoProvider::get_default().is_some() {
return Ok(());
}
match rustls_sys::crypto::aws_lc_rs::default_provider().install_default() {
Ok(_) => return Ok(()),
Err(_) => {
if rustls_sys::crypto::CryptoProvider::get_default().is_some() {
return Ok(());
}
}
}
match rustls_sys::crypto::ring::default_provider().install_default() {
Ok(_) => Ok(()),
Err(e) => {
if rustls_sys::crypto::CryptoProvider::get_default().is_some() {
return Ok(());
}
Err(OneIoError::NotSupported(format!(
"Failed to install rustls crypto provider: {:?}",
e
)))
}
}
}
#[cfg(not(feature = "rustls"))]
pub fn ensure_default_provider() -> Result<(), OneIoError> {
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_ensure_default_provider() {
let result = ensure_default_provider();
assert!(result.is_ok(), "ensure_default_provider should succeed");
}
#[cfg(feature = "rustls")]
#[test]
fn test_provider_installed() {
ensure_default_provider().unwrap();
assert!(
rustls_sys::crypto::CryptoProvider::get_default().is_some(),
"A crypto provider should be installed"
);
}
}