diff options
Diffstat (limited to 'CA_store.cpp')
-rw-r--r-- | CA_store.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/CA_store.cpp b/CA_store.cpp new file mode 100644 index 0000000..3bf7be3 --- /dev/null +++ b/CA_store.cpp @@ -0,0 +1,40 @@ +#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; +} |