pe-sign 0.1.10

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
pub mod constraints;
pub mod crl;
pub mod name;

mod access;
mod authkeyid;
mod extension;
mod keyusage;
mod policymap;

use std::fmt::Display;

pub use access::{AccessDescription, AuthorityInfoAccess, SubjectInfoAccess};
pub use authkeyid::AuthorityKeyIdentifier;
use der::oid::{
    db::rfc5912::{
        ID_CE_INHIBIT_ANY_POLICY, ID_CE_ISSUER_ALT_NAME, ID_CE_SUBJECT_ALT_NAME,
        ID_CE_SUBJECT_DIRECTORY_ATTRIBUTES,
    },
    ObjectIdentifier,
};
pub use extension::{
    CertificatePolicies, Extension, Extensions, SignedCertificateTimestampList,
    SubjectKeyIdentifier,
};
pub use keyusage::{ExtendedKeyUsage, KeyUsage, PrivateKeyUsagePeriod};
pub use policymap::{PolicyMapping, PolicyMappings};

use name::GeneralNames;

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SubjectAltName(pub GeneralNames);

impl AssociatedOid for SubjectAltName {
    const OID: ObjectIdentifier = ID_CE_SUBJECT_ALT_NAME;
}

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

impl Display for SubjectAltName {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        writeln!(f, "Subject Alternative Name:")?;
        write!(f, "{}", self.0.to_string().indent(4))
    }
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct IssuerAltName(pub GeneralNames);

impl AssociatedOid for IssuerAltName {
    const OID: ObjectIdentifier = ID_CE_ISSUER_ALT_NAME;
}

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

impl Display for IssuerAltName {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        writeln!(f, "Issuer Alternative Name:")?;
        write!(f, "{}", self.0.to_string().indent(4))
    }
}

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

impl AssociatedOid for SubjectDirectoryAttributes {
    const OID: ObjectIdentifier = ID_CE_SUBJECT_DIRECTORY_ATTRIBUTES;
}

impl From<x509_cert::ext::pkix::SubjectDirectoryAttributes> for SubjectDirectoryAttributes {
    fn from(value: x509_cert::ext::pkix::SubjectDirectoryAttributes) -> Self {
        Self(value.0.iter().map(|v| v.to_string()).collect())
    }
}

impl Display for SubjectDirectoryAttributes {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Subject Directory Attributes: <Unsupported>")
    }
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct InhibitAnyPolicy(pub u32);

impl AssociatedOid for InhibitAnyPolicy {
    const OID: ObjectIdentifier = ID_CE_INHIBIT_ANY_POLICY;
}

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

impl Display for InhibitAnyPolicy {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "Inhibit Any Policy: {}", self.0)
    }
}

pub use der::oid::AssociatedOid;

use crate::utils::IndentString;