use pki_types::CertificateDer;
use security_framework::trust_settings::{Domain, TrustSettings, TrustSettingsForCertificate};
use std::collections::HashMap;
use std::io::{Error, ErrorKind};
pub fn load_native_certs() -> Result<Vec<CertificateDer<'static>>, Error> {
let mut all_certs = HashMap::new();
for domain in &[Domain::User, Domain::Admin, Domain::System] {
let ts = TrustSettings::new(*domain);
let iter = ts
.iter()
.map_err(|err| Error::new(ErrorKind::Other, err))?;
for cert in iter {
let der = cert.to_der();
let trusted = ts
.tls_trust_settings_for_certificate(&cert)
.map_err(|err| Error::new(ErrorKind::Other, err))?
.unwrap_or(TrustSettingsForCertificate::TrustRoot);
all_certs.entry(der).or_insert(trusted);
}
}
let mut certs = Vec::new();
for (der, trusted) in all_certs.drain() {
use TrustSettingsForCertificate::*;
if let TrustRoot | TrustAsRoot = trusted {
certs.push(CertificateDer::from(der));
}
}
Ok(certs)
}