diff --git a/CMakeLists.txt b/CMakeLists.txt index c20ed07c..aad5261a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,8 +67,12 @@ file(GLOB UI_FILES ${CMAKE_AUTOUIC_SEARCH_PATHS}/*.ui) configure_file(local.h.in local.h) ##### Libraries and executables -add_executable(${CMAKE_PROJECT_NAME} img/imgres.qrc ${UI_FILES} ${PROJECT_BINARY_DIR}/local.h) +add_library(xcalib STATIC) +add_executable(${CMAKE_PROJECT_NAME} img/imgres.qrc lib/main.cpp + ${UI_FILES} ${PROJECT_BINARY_DIR}/local.h) add_executable(xcadoc ${PROJECT_BINARY_DIR}/local.h) +add_executable(testxca img/imgres.qrc ${PROJECT_SOURCE_DIR}/lib/test_main.cpp + ${UI_FILES} ${PROJECT_BINARY_DIR}/local.h) include_directories(${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}) @@ -105,16 +109,16 @@ if (NOT OPENSSL_ROOT_DIR) get_filename_component(OPENSSL_ROOT_DIR ${OPENSSL_INCLUDE_DIR} DIRECTORY) endif() -target_link_libraries(${CMAKE_PROJECT_NAME} +target_link_libraries(xcalib OpenSSL::Crypto ${QT}::Widgets ${QT}::Core ${QT}::Sql ${QT}::Help ${ASAN_LIB} ) target_link_libraries(xcadoc - OpenSSL::Crypto - ${QT}::Widgets ${QT}::Core ${QT}::Sql ${QT}::Help - ${ASAN_LIB} + OpenSSL::Crypto ${QT}::Core ${ASAN_LIB} ) +target_link_libraries(${CMAKE_PROJECT_NAME} ${ASAN_LIB} xcalib) +target_link_libraries(testxca ${ASAN_LIB} ${QT}::Test xcalib) if (APPLE) @@ -123,6 +127,9 @@ if (APPLE) target_link_libraries(${CMAKE_PROJECT_NAME} ${IOKIT_LIBRARY} ${COREFOUNDATION_LIBRARY} ) + target_link_libraries(testxca + ${IOKIT_LIBRARY} ${COREFOUNDATION_LIBRARY} + ) set(CMAKE_MACOSX_BUNDLE ON) # Avoid bin/ sub-directory in DMG diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 4aaaae71..0dc9f855 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,7 +1,7 @@ list(APPEND xcadoc_sources arguments.cpp arguments.h xcadoc.cpp) -list(APPEND xca_sources +list(APPEND xcalib_sources BioByteArray.cpp dbhistory.cpp pki_key.cpp BioByteArray.h dbhistory.h pki_key.h Passwd.cpp entropy.cpp pki_lookup.h @@ -13,8 +13,8 @@ asn1int.h headerlist.h pki_pkcs7.cpp asn1time.cpp ipvalidator.h pki_pkcs7.h asn1time.h load_obj.cpp pki_scard.cpp base.h load_obj.h pki_scard.h -builtin_curves.cpp main.cpp pki_temp.cpp -builtin_curves.h main.h pki_temp.h +builtin_curves.cpp pki_temp.cpp +builtin_curves.h pki_temp.h database_model.cpp oid.cpp pki_x509.cpp database_model.h oid.h pki_x509.h db_base.cpp opensc-pkcs11.h pki_x509req.cpp @@ -47,7 +47,7 @@ macro(ExpandSources target) target_sources(${target} PRIVATE ${${target}_sources}) endmacro() -ExpandSources(xca) +ExpandSources(xcalib) ExpandSources(xcadoc) macro(Test name) diff --git a/lib/db_crl.cpp b/lib/db_crl.cpp index 6b34bf1a..810f53ec 100644 --- a/lib/db_crl.cpp +++ b/lib/db_crl.cpp @@ -8,7 +8,6 @@ #include "db_crl.h" #include "db_x509.h" -#include "main.h" #include "exception.h" #include "database_model.h" diff --git a/lib/db_key.cpp b/lib/db_key.cpp index 92f4f548..e0be9aff 100644 --- a/lib/db_key.cpp +++ b/lib/db_key.cpp @@ -11,7 +11,6 @@ #include "pki_scard.h" #include "pki_x509super.h" -#include "main.h" #include "exception.h" #include "pkcs11.h" diff --git a/lib/main.cpp b/lib/main.cpp index 4ed3b467..2ad2401c 100644 --- a/lib/main.cpp +++ b/lib/main.cpp @@ -14,7 +14,6 @@ #include "ui_MainWindow.h" #include "widgets/XcaApplication.h" #include "func.h" -#include "main.h" #include "entropy.h" #include "settings.h" #include "pki_multi.h" @@ -33,7 +32,6 @@ #include char segv_data[1024]; -MainWindow *mainwin = NULL; #if defined(Q_OS_WIN32) static LONG CALLBACK w32_segfault(LPEXCEPTION_POINTERS e) diff --git a/lib/main.h b/lib/main.h deleted file mode 100644 index 3ab5affd..00000000 --- a/lib/main.h +++ /dev/null @@ -1,22 +0,0 @@ -/* vi: set sw=4 ts=4: - * - * Copyright (C) 2001 - 2015 Christian Hohnstaedt. - * - * All rights reserved. - */ - -#ifndef __MAIN_H -#define __MAIN_H - -#include - -class pki_multi; - -class MainWindow; -extern MainWindow *mainwin; - -extern char segv_data[1024]; - -pki_multi *probeAnything(const QString &, int *ret = nullptr); -int exportIndex(const QString &fname, bool hierarchy); -#endif diff --git a/lib/test_main.cpp b/lib/test_main.cpp new file mode 100644 index 00000000..e1e0e97b --- /dev/null +++ b/lib/test_main.cpp @@ -0,0 +1,139 @@ +/* vi: set sw=4 ts=4: + * + * Copyright (C) 2023 Christian Hohnstaedt. + * + * All rights reserved. + */ + +#include +#include +#include +#include +#include +#include + +#include "widgets/MainWindow.h" +#include "ui_MainWindow.h" +#include "widgets/NewKey.h" +#include "ui_NewKey.h" +#include "entropy.h" +#include "pki_evp.h" +#include "debug_info.h" + +char segv_data[1024]; + +class test_main: public QObject +{ + Q_OBJECT + Entropy *entropy {}; + + void openDB(); + + private slots: + void initTestCase(); + void cleanupTestCase(); + void newKey(); +}; + +void test_main::initTestCase() +{ + debug_info::init(); + + entropy = new Entropy; + + Settings.clear(); + initOIDs(); + + mainwin = new MainWindow(); + mainwin->show(); +} + +void test_main::cleanupTestCase() +{ + Database.close(); + delete entropy; + delete mainwin; + pki_export::free_elements(); +} + +void test_main::openDB() +{ + pki_evp::passwd = "pass"; + QString salt = Entropy::makeSalt(); + pki_evp::passHash = pki_evp::sha512passwT(pki_evp::passwd, salt); + Settings["pwhash"] = pki_evp::passHash; + Database.open("testdb.xdb"); +} + +void test_main::newKey() +{ + /* RSA 3012 bit key - Remember as default */ + NewKey *dlg = new NewKey(mainwin, "Alfons"); + dlg->show(); + Q_ASSERT(QTest::qWaitForWindowActive(dlg)); + dlg->keyLength->setEditText("3012 bit"); + QCOMPARE(dlg->rememberDefault->isChecked(), false); + dlg->rememberDefault->setChecked(true); + dlg->accept(); + keyjob job = dlg->getKeyJob(); + QCOMPARE(job.ktype.name, "RSA"); + QCOMPARE(job.size, 3012); + delete dlg; + + /* Remembered RSA:3012 key. Change to EC:secp521r1 */ + dlg = new NewKey(mainwin, "Erwin"); + dlg->show(); + Q_ASSERT(QTest::qWaitForWindowActive(dlg)); + QCOMPARE(dlg->rememberDefault->isChecked(), false); + QCOMPARE(job.toString(), dlg->getKeyJob().toString()); + /* Curve box visible after selecting EC Kex */ + QCOMPARE(dlg->curveBox->isVisible(),false); + QCOMPARE(dlg->curveLabel->isVisible(),false); + dlg->keyType->setCurrentIndex(2); + QCOMPARE(dlg->curveBox->isVisible(),true); + QCOMPARE(dlg->curveLabel->isVisible(),true); + dlg->curveBox->setCurrentIndex(2); + QCOMPARE(dlg->getKeyJob().toString(), "EC:secp521r1"); + /* Select Edwards Curve */ + dlg->keyType->setCurrentIndex(3); + QCOMPARE(dlg->getKeyJob().toString(), "ED25519"); + /* Neither key size nor curve is visible */ + QCOMPARE(dlg->curveBox->isVisible(),false); + QCOMPARE(dlg->curveLabel->isVisible(),false); + QCOMPARE(dlg->keyLength->isVisible(),false); + QCOMPARE(dlg->keySizeLabel->isVisible(),false); + /* Back to EC and previously set curve is set */ + dlg->keyType->setCurrentIndex(2); + QCOMPARE(dlg->getKeyJob().toString(), "EC:secp521r1"); + dlg->accept(); + delete dlg; + + /* Open dialog again and RSA:3012 is remembered */ + dlg = new NewKey(mainwin, "Otto"); + dlg->show(); + Q_ASSERT(QTest::qWaitForWindowActive(dlg)); + QCOMPARE(dlg->rememberDefault->isChecked(), false); + QCOMPARE(job.toString(), dlg->getKeyJob().toString()); + QCOMPARE(dlg->curveBox->isVisible(),false); + QCOMPARE(dlg->curveLabel->isVisible(),false); + /* Select EC and remeber as default */ + dlg->keyType->setCurrentIndex(2); + dlg->curveBox->setCurrentIndex(2); + + QCOMPARE(dlg->curveBox->isVisible(),true); + QCOMPARE(dlg->curveLabel->isVisible(),true); + QCOMPARE(dlg->getKeyJob().toString(), "EC:secp521r1"); + dlg->rememberDefault->setChecked(true); + dlg->accept(); + delete dlg; + + /* Now "EC:secp521r1" is remembered as default */ + dlg = new NewKey(mainwin, "Heini"); + dlg->show(); + Q_ASSERT(QTest::qWaitForWindowActive(dlg)); + QCOMPARE(dlg->getKeyJob().toString(), "EC:secp521r1"); + QCOMPARE(dlg->rememberDefault->isChecked(), false); +} + +QTEST_MAIN(test_main) +#include "test_main.moc" diff --git a/widgets/CMakeLists.txt b/widgets/CMakeLists.txt index a2dbbcbd..2ad20a05 100644 --- a/widgets/CMakeLists.txt +++ b/widgets/CMakeLists.txt @@ -30,4 +30,4 @@ pkcs12EncBox.cpp XcaDetail.cpp ) list(TRANSFORM xca_sources PREPEND ${PROJECT_SOURCE_DIR}/widgets/) -target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${xca_sources}) +target_sources(xcalib PRIVATE ${xca_sources}) diff --git a/widgets/KeyDetail.cpp b/widgets/KeyDetail.cpp index 1d7030b7..311a2eef 100644 --- a/widgets/KeyDetail.cpp +++ b/widgets/KeyDetail.cpp @@ -5,8 +5,6 @@ * All rights reserved. */ - -#include "lib/main.h" #include "lib/pki_evp.h" #include "lib/pki_scard.h" diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index e278c8c9..e0fe0ce2 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -44,7 +44,8 @@ #include "Help.h" #include "OidResolver.h" -OidResolver *MainWindow::resolver = NULL; +OidResolver *MainWindow::resolver; +MainWindow *mainwin; void MainWindow::enableTokenMenu(bool enable) { diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index bf28733d..782374c4 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -12,7 +12,6 @@ #include "lib/oid.h" #include "lib/Passwd.h" -#include "lib/main.h" #include "lib/database_model.h" #include "lib/dbhistory.h" #include "lib/dhgen.h" @@ -31,6 +30,8 @@ class QProgressBar; class DHgen; class Help; +extern MainWindow *mainwin; + class tipMenu : public QMenu { Q_OBJECT diff --git a/widgets/XcaProgressGui.h b/widgets/XcaProgressGui.h index e90f27f5..4b60c87d 100644 --- a/widgets/XcaProgressGui.h +++ b/widgets/XcaProgressGui.h @@ -9,7 +9,6 @@ #define __XCAPROGRESSGUI_H #include "lib/base.h" -#include "lib/main.h" #include "lib/XcaProgress.h" #include