use rustls_pemfile::{certs, ec_private_keys, pkcs8_private_keys, rsa_private_keys};
use std::{
fs::File,
io::{self, BufReader, Cursor, Read},
path::Path,
};
use tokio_rustls::rustls::{Certificate, PrivateKey};
pub fn load_certs(path: &Path) -> io::Result<Vec<Certificate>> {
certs(&mut BufReader::new(File::open(path)?))
.map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "invalid cert"))
.map(|mut certs| certs.drain(..).map(Certificate).collect())
}
pub fn load_keys(path: &Path) -> io::Result<Vec<PrivateKey>> {
let file = &mut BufReader::new(File::open(path)?);
let mut data = Vec::new();
file.read_to_end(&mut data)?;
let mut cursor = Cursor::new(data);
let parsers = [rsa_private_keys, pkcs8_private_keys, ec_private_keys];
for parser in &parsers {
if let Ok(mut key) = parser(&mut cursor) {
if !key.is_empty() {
return Ok(key.drain(..).map(PrivateKey).collect());
}
}
cursor.set_position(0);
}
Err(io::Error::new(io::ErrorKind::InvalidInput, "invalid key"))
}