diff cinst/windowsstore.c @ 137:4904fe01055d

Factor out windows specific parts
author Andre Heinecke <aheinecke@intevation.de>
date Mon, 24 Mar 2014 14:55:48 +0000
parents
children bd5a5d3e5674
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cinst/windowsstore.c	Mon Mar 24 14:55:48 2014 +0000
@@ -0,0 +1,93 @@
+#ifdef WIN32
+
+#include <polarssl/base64.h>
+#include "windowsstore.h"
+
+static LPWSTR getLastErrorMsg() {
+    LPWSTR bufPtr = NULL;
+    DWORD err = GetLastError();
+    FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                   FORMAT_MESSAGE_FROM_SYSTEM |
+                   FORMAT_MESSAGE_IGNORE_INSERTS,
+                   NULL, err, 0, (LPWSTR)&bufPtr, 0, NULL);
+    if (!bufPtr) {
+        HMODULE hWinhttp = GetModuleHandleW(L"winhttp");
+        if (hWinhttp) {
+            FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                           FORMAT_MESSAGE_FROM_HMODULE |
+                           FORMAT_MESSAGE_IGNORE_INSERTS,
+                           hWinhttp, HRESULT_CODE(err), 0,
+                           (LPWSTR)&bufPtr, 0, NULL);
+        }
+    }
+    if (!bufPtr)
+        printf("Error getting last error\n");
+    return bufPtr;
+}
+
+int install_certificates_win(const char **to_install, int user_store)
+{
+    int i = 0;
+    HCERTSTORE hStore = NULL;
+
+    if (user_store) {
+        // Access user store
+        hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0,
+                               0, CERT_SYSTEM_STORE_CURRENT_USER, L"Root");
+    } else {
+        // Access machine store
+        hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0,
+                               0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root");
+    }
+
+    if (!hStore) {
+        return ERR_STORE_ACCESS_DENIED;
+    }
+
+    while (to_install[i]) {
+        size_t needed_len = 0;
+        size_t cert_len = strnlen(to_install[i], MAX_LINE_LENGTH);
+        int ret = -1;
+        unsigned char *buf;
+
+        /* Check the needed size for the buffer */
+        ret = base64_decode(NULL, &needed_len,
+                            (unsigned char *)to_install[i], cert_len);
+
+        if (ret != 0 && ret != POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL) {
+            return ERR_INVALID_INSTRUCTIONS;
+        }
+
+        buf = xmalloc(needed_len);
+        memset (buf, 0, needed_len);
+
+        ret = base64_decode(buf, &needed_len,
+                            (unsigned char *)to_install[i], cert_len);
+
+        if (ret != 0) {
+            return ERR_INVALID_INSTRUCTIONS;
+        }
+
+        ret = CertAddEncodedCertificateToStore (hStore,
+                                                X509_ASN_ENCODING,
+                                                (PBYTE)buf,
+                                                needed_len,
+                                                CERT_STORE_ADD_ALWAYS,
+                                                NULL);
+
+        if (ret == 0) {
+            LPWSTR error = getLastErrorMsg();
+            if (error) {
+                printf("Failed to add certificate: %S \n", error);
+                LocalFree(error);
+            }
+        }
+        i++;
+        free(buf);
+    }
+    if(hStore) {
+        CertCloseStore(hStore, 0);
+    }
+    return 0;
+}
+#endif // WIN32

http://wald.intevation.org/projects/trustbridge/