#include <windows.h> #include <wincrypt.h> #include "vmime/vmime.hpp" #include "utilities.h" using namespace vmime::security::cert; vmime::shared_ptr<defaultCertificateVerifier> windows_root_certs_verifier(void) { vmime::shared_ptr<defaultCertificateVerifier> vrf = vmime::make_shared<defaultCertificateVerifier>(); std::vector<vmime::shared_ptr<X509Certificate>> root_certs; vmime::shared_ptr<vmime::security::cert::X509Certificate> cert; HCERTSTORE store; PCCERT_CONTEXT context; store = CertOpenSystemStore(0, "ROOT"); if (store == NULL) FAIL(MSG_NO_ROOT_CA_STORE); context = NULL; while (true) { context = CertEnumCertificatesInStore(store, context); if (context == NULL) break; cert = vmime::security::cert::X509Certificate::import (context->pbCertEncoded, context->cbCertEncoded); if (cert) root_certs.push_back(cert); } CertCloseStore(store, 0); vrf->setX509RootCAs(root_certs); return vrf; }