pe-sign 0.1.8

pe-sign is a cross-platform tool developed in Rust, designed for parsing and verifying digital signatures in PE files. It provides a simple command-line interface that supports extracting certificates, verifying digital signatures, calculating Authenticode digests, and printing certificate information.
Documentation
use std::fmt::Display;

use der::oid::{db::rfc5280::ID_CE_POLICY_MAPPINGS, AssociatedOid, ObjectIdentifier};

use crate::utils::{IndentString, VecInto};

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PolicyMappings(pub Vec<PolicyMapping>);

impl AssociatedOid for PolicyMappings {
    const OID: ObjectIdentifier = ID_CE_POLICY_MAPPINGS;
}

impl From<x509_cert::ext::pkix::PolicyMappings> for PolicyMappings {
    fn from(value: x509_cert::ext::pkix::PolicyMappings) -> Self {
        Self(value.0.vec_into())
    }
}

impl Display for PolicyMappings {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        writeln!(f, "Policy Mappings:")?;
        write!(
            f,
            "{}",
            self.0
                .iter()
                .map(|v| v.to_string())
                .collect::<Vec<String>>()
                .join("\n")
                .indent(4)
        )
    }
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PolicyMapping {
    pub issuer_domain_policy: String,
    pub subject_domain_policy: String,
}

impl From<x509_cert::ext::pkix::PolicyMapping> for PolicyMapping {
    fn from(value: x509_cert::ext::pkix::PolicyMapping) -> Self {
        Self {
            issuer_domain_policy: value.issuer_domain_policy.to_string(),
            subject_domain_policy: value.subject_domain_policy.to_string(),
        }
    }
}

impl Display for PolicyMapping {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "Policy:{} -> Mapped to: {}",
            self.issuer_domain_policy, self.subject_domain_policy
        )
    }
}