luct-core 0.1.0

Core types and parsers for certificate transparency
Documentation
use const_oid::ObjectIdentifier;
use itertools::Itertools;
use x509_cert::{
    der::asn1::{PrintableString, Utf8StringRef},
    name::RdnSequence,
};

pub(crate) mod append_vec;
pub(crate) mod base64;
pub(crate) mod codec;
pub(crate) mod codec_vec;
pub(crate) mod u24;

pub(crate) fn hex_with_colons(data: &[u8]) -> String {
    hex::encode_upper(data)
        .chars()
        .chunks(2)
        .into_iter()
        .map(|mut chunk| format!("{}{}", chunk.next().unwrap(), chunk.next().unwrap()))
        .join(":")
}

pub(crate) fn extract_oid_from_rdn(
    sequence: &RdnSequence,
    oid: ObjectIdentifier,
) -> Option<String> {
    let attr = sequence
        .0
        .iter()
        .flat_map(|inner| inner.0.iter())
        .find(|val| val.oid == oid)?;

    if let Ok(string) = attr.value.decode_as::<PrintableString>() {
        return Some(string.as_str().to_string());
    }

    if let Ok(string) = attr.value.decode_as::<Utf8StringRef>() {
        return Some(string.as_str().to_string());
    }

    None
}