| use pki_types::CertificateDer; |
| use schannel::cert_context::ValidUses; |
| use schannel::cert_store::CertStore; |
| |
| use super::CertificateResult; |
| |
| pub fn load_native_certs() -> CertificateResult { |
| let mut result = CertificateResult::default(); |
| let current_user_store = match CertStore::open_current_user("ROOT") { |
| Ok(store) => store, |
| Err(err) => { |
| result.os_error(err.into(), "failed to open current user certificate store"); |
| return result; |
| } |
| }; |
| |
| for cert in current_user_store.certs() { |
| if usable_for_rustls(cert.valid_uses().unwrap()) && cert.is_time_valid().unwrap() { |
| result |
| .certs |
| .push(CertificateDer::from(cert.to_der().to_vec())); |
| } |
| } |
| |
| result |
| } |
| |
| fn usable_for_rustls(uses: ValidUses) -> bool { |
| match uses { |
| ValidUses::All => true, |
| ValidUses::Oids(strs) => strs |
| .iter() |
| .any(|x| x == PKIX_SERVER_AUTH), |
| } |
| } |
| |
| static PKIX_SERVER_AUTH: &str = "1.3.6.1.5.5.7.3.1"; |