# HG changeset patch # User Raimund Renkert # Date 1395673610 -3600 # Node ID 52993db093f48860e15a8970665f93f2c3bb4fa8 # Parent f5fa39347366e08361e66f4d48205b17ec3f1b55# Parent 7a8d960d60c986f4394be90ce092d83b5e8b04d6 merged. diff -r f5fa39347366 -r 52993db093f4 cinst/CMakeLists.txt --- a/cinst/CMakeLists.txt Mon Mar 24 16:03:05 2014 +0100 +++ b/cinst/CMakeLists.txt Mon Mar 24 16:06:50 2014 +0100 @@ -5,6 +5,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common) set(CINST_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/windowsstore.c ${CMAKE_CURRENT_SOURCE_DIR}/main.c ) diff -r f5fa39347366 -r 52993db093f4 cinst/main.c --- a/cinst/main.c Mon Mar 24 16:03:05 2014 +0100 +++ b/cinst/main.c Mon Mar 24 16:06:50 2014 +0100 @@ -1,4 +1,6 @@ -/** @brief Main entry point for the cinst process. +/** + * @file main.c + * @brief Main entry point for the cinst process. * * The cinst process may or may not be run with elevated * privileges. When run with elevated privileges this @@ -29,40 +31,10 @@ #include #include -#include - #include "strhelp.h" #include "listutil.h" #include "errorcodes.h" - -#ifdef WIN32 -#include -#include -#endif - -#ifdef WIN32 -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; -} -#endif +#include "windowsstore.h" /* The certificate list + instructions may only be so long as * twice the accepted certificatelist size */ @@ -160,81 +132,6 @@ } */ -#ifdef WIN32 -/** @brief Install certificates into Windows store - * - * @param [in] to_install NULL terminated array of base64 encoded certificates. - * @param [in] user_store set to True if the certificates should be installed - * only for the current user. O for system wide installation. - * @returns 0 on success an errorcode otherwise. - */ -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 - int main() { char **to_install = NULL; char **to_remove = NULL; diff -r f5fa39347366 -r 52993db093f4 cinst/windowsstore.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cinst/windowsstore.c Mon Mar 24 16:06:50 2014 +0100 @@ -0,0 +1,93 @@ +#ifdef WIN32 + +#include +#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 diff -r f5fa39347366 -r 52993db093f4 cinst/windowsstore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cinst/windowsstore.h Mon Mar 24 16:06:50 2014 +0100 @@ -0,0 +1,17 @@ +#ifdef WIN32 +#ifndef WINDOWSSTORE_H +#define WINDOWSSTORE_H + +#include +#include +/** @brief Install certificates into Windows store + * + * @param [in] to_install NULL terminated array of base64 encoded certificates. + * @param [in] user_store set to True if the certificates should be installed + * only for the current user. O for system wide installation. + * @returns 0 on success an errorcode otherwise. + */ +int install_certificates_win(const char **to_install, int user_store) + +#endif // WINDOWSSTORE_H +#endif // WIN32 diff -r f5fa39347366 -r 52993db093f4 common/strhelp.c --- a/common/strhelp.c Mon Mar 24 16:03:05 2014 +0100 +++ b/common/strhelp.c Mon Mar 24 16:06:50 2014 +0100 @@ -1,3 +1,4 @@ +#include #include #include #include @@ -109,7 +110,7 @@ size_t l1 = strlen(s1); size_t l2 = strlen(s2); if ((l1 == l2) && - (strncmp(s1, s2, l1) == 0)) + (strcmp(s1, s2) == 0)) return true; else return false; @@ -123,3 +124,17 @@ else return false; } + +void +str_trim (char **s) +{ + size_t i; + if (*s != NULL) + { + while (isspace(**s)) + (*s)++; + i = strlen(*s); + while (isspace((*s)[--i])) + (*s)[i] = '\0'; + } +} diff -r f5fa39347366 -r 52993db093f4 common/strhelp.h --- a/common/strhelp.h Mon Mar 24 16:03:05 2014 +0100 +++ b/common/strhelp.h Mon Mar 24 16:06:50 2014 +0100 @@ -66,4 +66,13 @@ */ bool str_starts_with (char *s1, char *s2); +/** + * @brief Trims all white space from the start and end of string. + * @details the start of the string is trimmed by setting *s to the + * first non white space character. The end is trimmed by setting the + * first character after the last non white space character to \0. + * @param[inout] s ponter to the string to strip + */ +bool str_trim (char **s); + #endif