use std::{fs, io, path::Path};
use itertools::Itertools;
use rustls::pki_types::{CertificateDer, PrivateKeyDer};
pub mod stream;
pub(crate) fn load_certs(filename: impl AsRef<Path>) -> io::Result<Vec<CertificateDer<'static>>> {
let filename = filename.as_ref();
let certfile = fs::File::open(filename).map_err(|e| {
error(format!(
"failed to open {}: {}",
filename.to_string_lossy(),
e
))
})?;
let mut reader = io::BufReader::new(certfile);
let certs = rustls_pemfile::certs(&mut reader)
.try_collect::<_, Vec<_>, _>()
.map_err(|e| error(e.to_string()))?;
if certs.len() < 1 {
return Err(error("Cannot have empty certs.".into()));
}
Ok(certs)
}
pub(crate) fn load_private_key(filename: impl AsRef<Path>) -> io::Result<PrivateKeyDer<'static>> {
let filename = filename.as_ref();
let keyfile = fs::File::open(filename).map_err(|e| {
error(format!(
"failed to open {}: {}",
filename.to_string_lossy(),
e
))
})?;
let mut reader = io::BufReader::new(keyfile);
let key = rustls_pemfile::private_key(&mut reader)?
.ok_or_else(|| error("Missing private key".into()))?;
Ok(key)
}
fn error(err: String) -> io::Error {
io::Error::new(io::ErrorKind::Other, err)
}