use std::os::raw::c_long;
use std::ptr;
use crate::error::{last_error, Error, Result};
pub(super) fn parse_x509(der: &[u8]) -> Result<*mut aws_lc_sys::X509> {
if der.is_empty() {
return Err(Error::Init(
"DER-encoded certificate must not be empty".into(),
));
}
let len = c_long::try_from(der.len()).map_err(|_| {
Error::Init("DER-encoded certificate exceeds the maximum supported length".into())
})?;
let mut p = der.as_ptr();
let cert = unsafe { aws_lc_sys::d2i_X509(ptr::null_mut(), ptr::from_mut(&mut p), len) };
if cert.is_null() {
return Err(Error::Init(format!("d2i_X509: {}", last_error())));
}
Ok(cert)
}
pub(super) fn parse_private_key(der: &[u8]) -> Result<*mut aws_lc_sys::EVP_PKEY> {
if der.is_empty() {
return Err(Error::Init(
"DER-encoded private key must not be empty".into(),
));
}
let len = c_long::try_from(der.len()).map_err(|_| {
Error::Init("DER-encoded private key exceeds the maximum supported length".into())
})?;
let mut p = der.as_ptr();
let key =
unsafe { aws_lc_sys::d2i_AutoPrivateKey(ptr::null_mut(), ptr::from_mut(&mut p), len) };
if key.is_null() {
return Err(Error::Init(format!("d2i_AutoPrivateKey: {}", last_error())));
}
Ok(key)
}