From b395eaa5cc744b3d8f04705677e58a68b67b0eee Mon Sep 17 00:00:00 2001 From: Christian Hohnstaedt Date: Sat, 9 Mar 2024 23:57:06 +0100 Subject: [PATCH] Close #536: macos include OpenSSL legacy provider Put it into the "PlugIns" directory and load it from there. Show whether the legacy-provider was loaded in the About-Dialog. CmakeLists.txt: Improve OpenSSL Major version detection and replace the foreach() loop in misc/CMakeLists.txt by the simpler list(TRANSFORM ...) --- CMakeLists.txt | 23 +++++++++++++++++++---- lib/main.cpp | 17 ++++++++++++----- misc/CMakeLists.txt | 6 ++---- widgets/MW_help.cpp | 4 ++-- widgets/MainWindow.cpp | 1 + widgets/MainWindow.h | 1 + 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dea66d10..4daaa5ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.16.0) +cmake_minimum_required(VERSION 3.19.0) project(xca DESCRIPTION "X Certificate and Key management" @@ -87,6 +87,11 @@ add_executable(xcadoc ${PROJECT_BINARY_DIR}/local.h) include_directories(${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}) +if (NOT OPENSSL_VERSION) + # Educated guess + set(OPENSSL_VERSION 3.0.0) +endif() + if (APPLE) execute_process(COMMAND brew --prefix OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE BREW_PREFIX ERROR_QUIET) @@ -98,8 +103,10 @@ elseif(WIN32) if (NOT CMAKE_PREFIX_PATH) set(CMAKE_PREFIX_PATH $ENV{UserProfile} $ENV{PROGRAMFILES}/OpenSSL-Win64) endif() - if (NOT OPENSSL_LIBRARY_MAJOR) - set(OPENSSL_LIBRARY_MAJOR 3) # For OpenSSL 1.1.1 use "1_1" + if (OPENSSL_VERSION VERSION_GREATER_EQUAL 3.0.0) + set(OPENSSL_LIBRARY_MAJOR "3") + else() + set(OPENSSL_LIBRARY_MAJOR "1_1") endif() file(TO_CMAKE_PATH $ENV{WINDIR}/system32 SYSTEM32) endif() @@ -119,6 +126,7 @@ get_filename_component(_qt_bin_dir "${qmake_executable}" DIRECTORY) if (NOT OPENSSL_ROOT_DIR) get_filename_component(OPENSSL_ROOT_DIR ${OPENSSL_INCLUDE_DIR} DIRECTORY) endif() +file(TO_CMAKE_PATH ${OPENSSL_ROOT_DIR} OPENSSL_ROOT_DIR) target_link_libraries(xcalib OpenSSL::Crypto @@ -204,6 +212,13 @@ if(APPLE) -always-overwrite ${APPSTORE} COMMENT "Running macdeployqt..." ) + if (OPENSSL_VERSION VERSION_GREATER_EQUAL 3.0.0) + add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD + COMMAND cmake -E copy ${OPENSSL_ROOT_DIR}/lib/ossl-modules/legacy.dylib + $/../PlugIns/ + COMMENT "Install OpenSSL legacy provider" + ) + endif() if (PROVISIONPROFILE) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND cmake -E copy ${PROVISIONPROFILE} @@ -269,7 +284,7 @@ elseif(WIN32) ${OPENSSL_ROOT_DIR}/bin/libcrypto-${OPENSSL_LIBRARY_MAJOR}-x64.dll DESTINATION ${RUNTIME_DEST} ) - if (OPENSSL_LIBRARY_MAJOR EQUAL 3) + if (OPENSSL_VERSION VERSION_GREATER_EQUAL 3.0.0) install(FILES ${OPENSSL_ROOT_DIR}/lib/ossl-modules/legacy.dll DESTINATION ${RUNTIME_DEST}) endif() diff --git a/lib/main.cpp b/lib/main.cpp index 5af31d38..5e12ade3 100644 --- a/lib/main.cpp +++ b/lib/main.cpp @@ -119,13 +119,20 @@ int main(int argc, char *argv[]) } #if (OPENSSL_VERSION_NUMBER >= 0x30000000L) + { + QString path; #if defined(Q_OS_WIN32) - OSSL_PROVIDER_set_default_search_path(NULL, - QCoreApplication::applicationDirPath().toUtf8().data()); - qDebug() << "OSSL_PROVIDER_set_default_search_path" - << QCoreApplication::applicationDirPath(); + path = QCoreApplication::applicationDirPath(); +#elif defined(Q_OS_MACOS) + path = QCoreApplication::applicationDirPath() + "/../PlugIns"; #endif - if (OSSL_PROVIDER_try_load(0, "legacy", 1)) + if (!path.isEmpty()) { + OSSL_PROVIDER_set_default_search_path(NULL, path.toUtf8().data()); + qDebug() << "OSSL_PROVIDER_set_default_search_path" << path; + } + } + MainWindow::legacy_loaded = OSSL_PROVIDER_try_load(0, "legacy", 1); + if (MainWindow::legacy_loaded) qDebug() << "Legacy provider loaded"; else qWarning() << "Legacy provider NOT loaded"; diff --git a/misc/CMakeLists.txt b/misc/CMakeLists.txt index 695da7e6..09088f2c 100644 --- a/misc/CMakeLists.txt +++ b/misc/CMakeLists.txt @@ -14,10 +14,8 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY MACOSX_BUNDLE_INFO_PLIST ${D}/Info.plist) ##### XCA Templates -set(TEMPLATES CA.xca TLS_server.xca TLS_client.xca) -foreach(templ ${TEMPLATES}) - list(APPEND XCA_TEMPLATES ${S}/${templ}) -endforeach() +list(APPEND XCA_TEMPLATES CA.xca TLS_server.xca TLS_client.xca) +list(TRANSFORM XCA_TEMPLATES PREPEND ${S}/) target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${XCA_TEMPLATES}) list(APPEND APP_RESOURCES "${XCA_TEMPLATES}") diff --git a/widgets/MW_help.cpp b/widgets/MW_help.cpp index dc922b5f..867b24a6 100644 --- a/widgets/MW_help.cpp +++ b/widgets/MW_help.cpp @@ -106,7 +106,7 @@ void MainWindow::about() "

Copyright 2001 - 2024 by Christian Hohnstädt\n" "

Version: %3

%1" /* commithash, OpenSSL & Qt Version */ "

https://hohnstaedt.de/xca" - "

Entropy strength: %2" + "

OpenSSL legacy provider%2 loaded" "

" "" "" @@ -120,7 +120,7 @@ void MainWindow::about() "
Installation path:%4
User settings path:%5


Maintained Translations
" "

%8
") .arg(version) - .arg(Entropy::strength()) + .arg(legacy_loaded ? "" : " not") .arg(version_str(true)) .arg(nativeSeparator(QCoreApplication::applicationDirPath())) .arg(nativeSeparator(getUserSettingsDir())) diff --git a/widgets/MainWindow.cpp b/widgets/MainWindow.cpp index fbe6d64b..acaff656 100644 --- a/widgets/MainWindow.cpp +++ b/widgets/MainWindow.cpp @@ -47,6 +47,7 @@ OidResolver *MainWindow::resolver; MainWindow *mainwin; +bool MainWindow::legacy_loaded; void MainWindow::enableTokenMenu(bool enable) { diff --git a/widgets/MainWindow.h b/widgets/MainWindow.h index f1b2a0d3..2ccd0276 100644 --- a/widgets/MainWindow.h +++ b/widgets/MainWindow.h @@ -89,6 +89,7 @@ class MainWindow: public QMainWindow, public Ui::MainWindow void showDatabaseName(); public: + static bool legacy_loaded; int exitApp; QLabel *dbindex; Help *helpdlg;