#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct CertificateChainAndPrivateKey
{
pub certificate_chain_file: PathBuf,
pub private_keys_file: PathBuf
}
impl CertificateChainAndPrivateKey
{
#[inline(always)]
pub fn load_certificate_chain_and_private_key(&self) -> Result<(Vec<Certificate>, PrivateKey), CertificateChainAndPrivateKeyError>
{
Ok
(
(
self.load_certificate_chain()?,
self.load_private_key()?,
)
)
}
#[inline(always)]
fn load_certificate_chain(&self) -> Result<Vec<Certificate>, CertificateChainAndPrivateKeyError>
{
use self::CertificateChainAndPrivateKeyError::*;
let file = File::open(&self.certificate_chain_file).map_err(|error| CouldNotOpenCertificateFile(error))?;
let mut reader = BufReader::new(file);
certs(&mut reader).map_err(|_| CouldNotReadClientCertificateFile)
}
fn load_private_key(&self) -> Result<PrivateKey, CertificateChainAndPrivateKeyError>
{
use self::CertificateChainAndPrivateKeyError::*;
let pkcs8_private_keys = pkcs8_private_keys(&mut self.open_private_keys_file()?).map_err(|_| CouldNotReadPkcs8PrivateKey)?;
let rsa_private_keys = rsa_private_keys(&mut self.open_private_keys_file()?).map_err(|_| CouldNotReadRsaPrivateKey)?;
if pkcs8_private_keys.is_empty()
{
if rsa_private_keys.is_empty()
{
Err(ThereIsNeitherAPkcs8OrRsaPrivateKey)
}
else
{
Ok((unsafe { rsa_private_keys.get_unchecked(0) }).clone())
}
}
else
{
Ok((unsafe { pkcs8_private_keys.get_unchecked(0) }).clone())
}
}
#[inline(always)]
fn open_private_keys_file(&self) -> Result<BufReader<File>, CertificateChainAndPrivateKeyError>
{
let file = File::open(&self.private_keys_file).map_err(|error| CertificateChainAndPrivateKeyError::CouldNotOpenPrivateKeysFile(error))?;
Ok(BufReader::new(file))
}
}