src/extract_sign.rs (40 lines of code) (raw):

use pesign::{utils::DisplayBytes, PeSign}; use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Debug)] pub struct CertInfo { pub issuer: String, pub subject: String, pub version: String, pub signature_algorithm: String, pub signature_value: String, } impl CertInfo { pub fn display_info(&self) { println!("Issuer: {}", self.issuer); println!("Subject: {}", self.subject); println!("Version: {}", self.version); println!("Signature Algorithm: {}", self.signature_algorithm); println!("Signature Value: {}", self.signature_value); } } pub fn extract_pe_sign(file_path: &str) -> anyhow::Result<Option<Vec<CertInfo>>> { let ret = PeSign::from_pe_path(file_path)?; let Some(pesign) = ret else { return Ok(None); }; let mut certs = vec![]; for cert in pesign.signed_data.cert_list { let cert_info = CertInfo { issuer: cert.issuer.to_string(), subject: cert.subject.to_string(), version: cert.version.to_string(), signature_algorithm: cert.signature_algorithm.to_string(), signature_value: cert.signature_value.to_bytes_string(), }; certs.push(cert_info); } if certs.is_empty() { return Ok(None); } Ok(Some(certs)) }