summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Beauzée-Luyssen <hugo@beauzee.fr>2018-12-13 17:31:29 +0100
committerHugo Beauzée-Luyssen <hugo@beauzee.fr>2018-12-19 09:46:43 +0100
commitfd91542eb82c61feeb3b9483afa6ab303b6ef1b7 (patch)
tree80ef0d33b01de54ada60ace386ec692635b323b0
parent62f162f64c23a5e6b872ff8ee540d375b7e27168 (diff)
downloadgnutls-fd91542eb82c61feeb3b9483afa6ab303b6ef1b7.tar.gz
win32: Use CertOpenStore instead of CertOpenSystemStore
CertOpenSystemStore is not available when building for windows store. Both functions are available since windows XP, so there is no compatibility change. CertOpenSystemStore documentation states "Only current user certificates are accessible using this method, not the local machine store." hence we pass CERT_SYSTEM_STORE_CURRENT_USER. We also use the wide chars variants, in the event the ansi ones are silently rejected by windows store applications (which is not documented, but which I strongly suspect) This is equivalent to Wine's implementation of CertOpenSystemStore: https://github.com/wine-mirror/wine/blob/master/dlls/crypt32/store.c#L904
-rw-r--r--lib/system/certs.c4
-rw-r--r--lib/system/keys-win.c8
-rw-r--r--tests/windows/crypt32.c9
3 files changed, 15 insertions, 6 deletions
diff --git a/lib/system/certs.c b/lib/system/certs.c
index 53eb561d00..f9090f1e74 100644
--- a/lib/system/certs.c
+++ b/lib/system/certs.c
@@ -161,9 +161,9 @@ int add_system_trust(gnutls_x509_trust_list_t list, unsigned int tl_flags,
gnutls_datum_t data;
if (i == 0)
- store = CertOpenSystemStore(0, "ROOT");
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER , L"ROOT");
else
- store = CertOpenSystemStore(0, "CA");
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"CA");
if (store == NULL)
return GNUTLS_E_FILE_ERROR;
diff --git a/lib/system/keys-win.c b/lib/system/keys-win.c
index eac511b975..abd3608474 100644
--- a/lib/system/keys-win.c
+++ b/lib/system/keys-win.c
@@ -647,7 +647,7 @@ int _gnutls_privkey_import_system_url(gnutls_privkey_t pkey, const char *url)
blob.cbData = id_size;
blob.pbData = id;
- store = CertOpenSystemStore(0, "MY");
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if (store == NULL) {
gnutls_assert();
ret = GNUTLS_E_FILE_ERROR;
@@ -884,7 +884,7 @@ int _gnutls_x509_crt_import_system_url(gnutls_x509_crt_t crt, const char *url)
blob.cbData = id_size;
blob.pbData = id;
- store = CertOpenSystemStore(0, "MY");
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if (store == NULL) {
gnutls_assert();
ret = GNUTLS_E_FILE_ERROR;
@@ -1132,7 +1132,7 @@ gnutls_system_key_iter_get_info(gnutls_system_key_iter_t * iter,
if (*iter == NULL)
return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
- (*iter)->store = CertOpenSystemStore(0, "MY");
+ (*iter)->store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if ((*iter)->store == NULL) {
gnutls_free(*iter);
*iter = NULL;
@@ -1205,7 +1205,7 @@ int gnutls_system_key_delete(const char *cert_url, const char *key_url)
blob.cbData = id_size;
blob.pbData = id;
- store = CertOpenSystemStore(0, "MY");
+ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if (store != NULL) {
do {
cert = CertFindCertificateInStore(store,
diff --git a/tests/windows/crypt32.c b/tests/windows/crypt32.c
index 11325f7beb..6987f1faf9 100644
--- a/tests/windows/crypt32.c
+++ b/tests/windows/crypt32.c
@@ -57,6 +57,15 @@ HCERTSTORE WINAPI CertOpenSystemStore(
}
__declspec(dllexport)
+HCERTSTORE WINAPI CertOpenStore(
+ LPCSTR lpszStoreProvider, DWORD dwEncodingType,
+ HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags,
+ const void *pvPara)
+{
+ return VALID_PTR;
+}
+
+__declspec(dllexport)
BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
{
assert_int_nequal(hCertStore, VALID_PTR);