# HG changeset patch # User Andre Heinecke # Date 1403534587 -7200 # Node ID 80d1a80b3e8d5d5818df3977cfb45f56907ddeb9 # Parent 6c090638b2b453d85b14c54d1a6c3eae95acc83c Factor out selftest for better test and reviewability diff -r 6c090638b2b4 -r 80d1a80b3e8d common/CMakeLists.txt --- a/common/CMakeLists.txt Mon Jun 23 15:29:48 2014 +0200 +++ b/common/CMakeLists.txt Mon Jun 23 16:43:07 2014 +0200 @@ -15,6 +15,7 @@ strhelp.c util.c binverify.c + selftest.c ) if(WIN32) diff -r 6c090638b2b4 -r 80d1a80b3e8d common/selftest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/selftest.c Mon Jun 23 16:43:07 2014 +0200 @@ -0,0 +1,46 @@ +#include "selftest.h" +#include "binverify.h" +#include "strhelp.h" +#include "logging.h" + +bool +selftest() +{ +#ifdef WIN32 + wchar_t wPath[MAX_PATH]; + char *utf8path = NULL; + + if (!GetModuleFileNameW (NULL, wPath, MAX_PATH - 1)) + { + PRINTLASTERROR ("Failed to obtain module file name. Path too long?"); + return false; + } + + /* wPath might not be 0 terminated */ + wPath[MAX_PATH - 1] = '\0'; + + utf8path = wchar_to_utf8 (wPath, wcsnlen(wPath, MAX_PATH)); + + if (utf8path == NULL) + { + ERRORPRINTF ("Failed to convert module path to utf-8"); + return false; + } + + if (!verify_binary (utf8path, strlen(utf8path)) != VerifyValid) + { + ERRORPRINTF ("Verification of the binary failed"); + syslog_error_printf ("Integrity check failed."); + xfree(utf8path); + return false; + } + + xfree(utf8path); +#else + if (!verify_binary ("/proc/self/exe", 14) != VerifyValid) + { + syslog_error_printf ("Integrity check failed."); + return false; + } +#endif +} diff -r 6c090638b2b4 -r 80d1a80b3e8d common/selftest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/selftest.h Mon Jun 23 16:43:07 2014 +0200 @@ -0,0 +1,36 @@ +#ifndef COMMON_SELFTEST_H +#define COMMON_SELFTEST_H +/* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik + * Software engineering by Intevation GmbH + * + * This file is Free Software under the GNU GPL (v>=2) + * and comes with ABSOLUTELY NO WARRANTY! + * See LICENSE.txt for details. + */ + +/** @file self test against manipulation + * + * The selftest is intended to detect untargeted manipulation or + * corruption of the executable. Circumvention of the selftest + * by targeted manipulation of the binary can, of course, not + * be detected. + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +/** @brief check that the current process is signed by the correct certificate + * + * Checks that the certificate is signed with a valid signature and the + * builtin public certificate. + * + * @returns true if the selftest is successful. false on error. + */ +bool selftest(); + +#ifdef __cplusplus +} +#endif +#endif // COMMON_SELFTEST_H diff -r 6c090638b2b4 -r 80d1a80b3e8d ui/main.cpp --- a/ui/main.cpp Mon Jun 23 15:29:48 2014 +0200 +++ b/ui/main.cpp Mon Jun 23 16:43:07 2014 +0200 @@ -7,9 +7,8 @@ */ #include "mainwindow.h" #include "processhelp.h" -#include "binverify.h" #include "logging.h" -#include "strhelp.h" +#include "selftest.h" #include #include @@ -40,49 +39,12 @@ int main(int argc, char **argv) { /* First verify integrity even before calling QApplication*/ -#ifdef Q_OS_WIN - { - wchar_t wPath[MAX_PATH]; - char *utf8path = NULL; - - if (!GetModuleFileNameW (NULL, wPath, MAX_PATH - 1)) { - PRINTLASTERROR ("Failed to obtain module file name. Path too long?"); - syslog_error_printf ("Integrity check failed."); - return -1; - } - - /* wPath might not be 0 terminated */ - wPath[MAX_PATH - 1] = '\0'; - - utf8path = wchar_to_utf8 (wPath, wcsnlen(wPath, MAX_PATH)); - - if (utf8path == NULL) { - ERRORPRINTF ("Failed to convert module path to utf-8"); - syslog_error_printf ("Integrity check failed."); - return -1; - } - - if (!verify_binary (utf8path, strlen(utf8path)) != VerifyValid) - { - ERRORPRINTF ("Verification of the binary failed"); - syslog_error_printf ("Integrity check failed."); - xfree(utf8path); -#ifdef RELEASE_BUILD - return -1; -#endif - } - - xfree(utf8path); - } -#else - if (!verify_binary ("/proc/self/exe", 14) != VerifyValid) - { + if (!selftest()) { syslog_error_printf ("Integrity check failed."); #ifdef RELEASE_BUILD return -1; #endif - } -#endif + } QApplication app (argc, argv);