use crate::error::ConversionError;
use crate::openssl::ParsedPfx;
use openssl::pkcs12::Pkcs12;
use std::fs;
use std::path::Path;
pub struct PfxParser;
impl PfxParser {
pub fn parse_file<P: AsRef<Path>>(
path: P,
password: &str,
) -> Result<ParsedPfx, ConversionError> {
let path = path.as_ref();
if !path.exists() {
return Err(ConversionError::FileNotFound(path.display().to_string()));
}
let pfx_data =
fs::read(path).map_err(|e| ConversionError::FileRead(path.display().to_string(), e))?;
Self::parse_bytes(&pfx_data, password)
}
pub fn parse_bytes(data: &[u8], password: &str) -> Result<ParsedPfx, ConversionError> {
let pkcs12 = Pkcs12::from_der(data).map_err(|e| {
ConversionError::InvalidFormat(format!("Failed to parse PFX structure: {}", e))
})?;
let parsed = pkcs12.parse2(password).map_err(|e| {
if password.is_empty() {
ConversionError::Authentication(format!(
"Failed to parse PFX file: {}. This file may require a password. Use --password option.",
e
))
} else {
ConversionError::Authentication(format!(
"Failed to parse PFX file with provided password: {}",
e
))
}
})?;
Ok(ParsedPfx::from(parsed))
}
}