use x509_parser::oid_registry::Oid;
use x509_parser::prelude::{FromDer, X509Certificate};
use crate::error::{TrustError, TrustResult};
pub use rcgen::CustomExtension;
pub const LYS_OID_ARC: &[u64] = &[1, 3, 6, 1, 4, 1, 66364];
pub fn encode_extension(oid: &[u64], payload_bytes: impl Into<Vec<u8>>) -> CustomExtension {
let mut extension = CustomExtension::from_oid_content(oid, payload_bytes.into());
extension.set_criticality(false);
extension
}
pub fn decode_extension(cert_der: &[u8], oid: &[u64]) -> TrustResult<Option<Vec<u8>>> {
let (_, certificate) =
X509Certificate::from_der(cert_der).map_err(|e| TrustError::CertificateParsing {
reason: format!("failed to parse certificate DER: {e:?}"),
})?;
let target = Oid::from(oid).map_err(|_err| TrustError::CertificateParsing {
reason: "extension lookup OID is not a well-formed object identifier".to_string(),
})?;
match certificate.tbs_certificate.get_extension_unique(&target) {
Ok(Some(extension)) => Ok(Some(extension.value.to_vec())),
Ok(None) => Ok(None),
Err(e) => Err(TrustError::CertificateParsing {
reason: format!("duplicate or malformed extension for OID lookup: {e}"),
}),
}
}
#[cfg(test)]
#[path = "extensions_tests.rs"]
mod tests;