extern crate alloc;
use alloc::string::{String, ToString};
use der::asn1::ObjectIdentifier;
use der::Decode;
use x509_cert::name::Name;
use x509_cert::Certificate;
use crate::types::EfiTime;
const OID_CN: ObjectIdentifier = ObjectIdentifier::new_unwrap("2.5.4.3");
pub struct CertInfo {
pub subject: String,
pub subject_cn: Option<String>,
pub issuer: String,
pub issuer_cn: Option<String>,
pub not_before: EfiTime,
pub not_after: EfiTime,
}
impl CertInfo {
fn attr(name: &Name, oid: &ObjectIdentifier) -> Option<String> {
for attr in name.0.iter() {
if attr.0.iter().any(|x| x.oid == *oid) {
return Some(attr.to_string());
}
}
None
}
pub fn new_from_der(der: &[u8]) -> Option<Self> {
let cert = Certificate::from_der(der).ok()?;
let subject = cert.tbs_certificate.subject;
let issuer = cert.tbs_certificate.issuer;
let not_before = cert.tbs_certificate.validity.not_before.to_date_time();
let not_after = cert.tbs_certificate.validity.not_after.to_date_time();
let info = Self {
subject: subject.to_string(),
subject_cn: Self::attr(&subject, &OID_CN),
issuer: issuer.to_string(),
issuer_cn: Self::attr(&issuer, &OID_CN),
not_before: EfiTime::from(¬_before),
not_after: EfiTime::from(¬_after),
};
Some(info)
}
}