On Wed Jul 09, 2025 at 10:42:09AM +0200, Theo Buehler wrote:
> messagelib only does DKIM verification and uses OPENSSL_DECODER_CTX
> for deserializing an RSA public key and another bit of trivially
> replaceable API to get the RSA e.
> 
> The below diff replaces this with "legacy" API, bumps the major of
> KPim6MessageViewer and links it against libcrypto - no ssl in sight
> here.
> 
> It's slightly more intrusive than I would like it to be, but so be it.
> I disabled the test but it could be patched in a similar way.

Will do it.

> 
> I'll of course happily help if this gets in the way of updates.
> 
> I only build tested this, but I did verify that the code successfully
> parses the test key in an equivalent C program.

Tested with a pile of KDE PAM apps without any issues. I'm not
sure if I've hit this exact use-case but it doesn't make the PAM
situation any better or worse.

Thanks a lot, OK rsadowski

> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/x11/kde-applications/messagelib/Makefile,v
> diff -u -p -r1.31 Makefile
> --- Makefile  13 Mar 2025 16:15:21 -0000      1.31
> +++ Makefile  9 Jul 2025 08:06:57 -0000
> @@ -2,10 +2,12 @@ COMMENT =   KDE PIM messaging library
>  DISTNAME =   messagelib-${VERSION}
>  CATEGORIES = devel
>  
> +REVISION =   0
> +
>  SHARED_LIBS +=       KPim6MessageComposer      2.0 # 0.0
>  SHARED_LIBS +=       KPim6MessageCore          2.0 # 0.0
>  SHARED_LIBS +=       KPim6MessageList          2.0 # 0.0
> -SHARED_LIBS +=       KPim6MessageViewer        2.0 # 0.0
> +SHARED_LIBS +=       KPim6MessageViewer        3.0 # 0.0
>  SHARED_LIBS +=       KPim6MimeTreeParser       2.0 # 0.0
>  SHARED_LIBS +=       KPim6TemplateParser       1.0 # 0.0
>  SHARED_LIBS +=       KPim6WebEngineViewer      2.0 # 0.0
> @@ -29,10 +31,9 @@ WANTLIB += KPim6Mime KPim6PimCommon KPim
>  WANTLIB += Qt6Core Qt6DBus Qt6Gui Qt6Network Qt6OpenGL Qt6Positioning
>  WANTLIB += Qt6PrintSupport Qt6Qml Qt6QmlMeta Qt6QmlModels Qt6QmlWorkerScript
>  WANTLIB += Qt6Quick Qt6WebChannel Qt6WebEngineCore Qt6WebEngineWidgets
> -WANTLIB += Qt6Widgets Qt6Xml assuan gpgme gpgmepp m qgpgmeqt6
> +WANTLIB += Qt6Widgets Qt6Xml assuan crypto gpgme gpgmepp m qgpgmeqt6
>  
>  WANTLIB += lib/inotify/inotify
> -WANTLIB += lib/eopenssl33/crypto lib/eopenssl33/ssl
>  
>  MODKDE_TRANSLATIONS = yes
>  MODKF5_L10N_CONFLICT = yes
> @@ -91,13 +92,8 @@ LIB_DEPENDS =      devel/kf6/karchive \
>               x11/qt6/qtwebchannel \
>               x11/qt6/qtwebengine
>  
> -LIB_DEPENDS +=       security/openssl/3.3
> -
>  TEST_IS_INTERACTIVE =        X11
>  
> -CONFIGURE_ENV        = OPENSSL_ROOT_DIR=${LOCALBASE}/lib/eopenssl33
> -
> -CXXFLAGS =   -I${LOCALBASE}/include/inotify/ 
> -I${LOCALBASE}/include/eopenssl33
> -LDFLAGS =    -L${LOCALBASE}/lib/eopenssl33 
> -Wl,-rpath,${LOCALBASE}/lib/eopenssl33
> +CXXFLAGS =   -I${LOCALBASE}/include/inotify/
>  
>  .include <bsd.port.mk>
> Index: patches/patch-messageviewer_src_CMakeLists_txt
> ===================================================================
> RCS file: patches/patch-messageviewer_src_CMakeLists_txt
> diff -N patches/patch-messageviewer_src_CMakeLists_txt
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-messageviewer_src_CMakeLists_txt    9 Jul 2025 07:55:10 
> -0000
> @@ -0,0 +1,12 @@
> +Index: messageviewer/src/CMakeLists.txt
> +--- messageviewer/src/CMakeLists.txt.orig
> ++++ messageviewer/src/CMakeLists.txt
> +@@ -425,7 +425,7 @@ target_link_libraries(KPim6MessageViewer
> +     Qt::PrintSupport
> +     KF6::Notifications
> +     KF6::TextAddonsWidgets
> +-    OpenSSL::SSL
> ++    crypto
> + )
> + 
> + if(TARGET KF6::TextEditTextToSpeech)
> Index: patches/patch-messageviewer_src_dkim-verify_CMakeLists_txt
> ===================================================================
> RCS file: patches/patch-messageviewer_src_dkim-verify_CMakeLists_txt
> diff -N patches/patch-messageviewer_src_dkim-verify_CMakeLists_txt
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-messageviewer_src_dkim-verify_CMakeLists_txt        9 Jul 
> 2025 07:21:49 -0000
> @@ -0,0 +1,10 @@
> +Index: messageviewer/src/dkim-verify/CMakeLists.txt
> +--- messageviewer/src/dkim-verify/CMakeLists.txt.orig
> ++++ messageviewer/src/dkim-verify/CMakeLists.txt
> +@@ -1,5 +1,5 @@
> + # SPDX-License-Identifier: CC0-1.0
> + # SPDX-FileCopyrightText: none
> + if(BUILD_TESTING)
> +-    add_subdirectory(autotests)
> ++    #add_subdirectory(autotests)
> + endif()
> Index: patches/patch-messageviewer_src_dkim-verify_dkimchecksignaturejob_cpp
> ===================================================================
> RCS file: 
> patches/patch-messageviewer_src_dkim-verify_dkimchecksignaturejob_cpp
> diff -N patches/patch-messageviewer_src_dkim-verify_dkimchecksignaturejob_cpp
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-messageviewer_src_dkim-verify_dkimchecksignaturejob_cpp     
> 9 Jul 2025 08:33:43 -0000
> @@ -0,0 +1,58 @@
> +Index: messageviewer/src/dkim-verify/dkimchecksignaturejob.cpp
> +--- messageviewer/src/dkim-verify/dkimchecksignaturejob.cpp.orig
> ++++ messageviewer/src/dkim-verify/dkimchecksignaturejob.cpp
> +@@ -19,8 +19,12 @@
> + #include <QRegularExpression>
> + 
> + #include <openssl/bn.h>
> ++#ifdef LIBRESSL_VERSION_NUMBER
> ++#include <openssl/x509.h>
> ++#else
> + #include <openssl/core_names.h>
> + #include <openssl/decoder.h>
> ++#endif
> + #include <openssl/err.h>
> + #include <openssl/evp.h>
> + #include <openssl/rsa.h>
> +@@ -510,6 +514,7 @@ using EVPPKeyPtr = std::unique_ptr<EVP_PKEY, decltype(
> + EVPPKeyPtr loadRSAPublicKey(const QByteArray &der)
> + {
> +     EVP_PKEY *pubKey = nullptr;
> ++#ifndef LIBRESSL_VERSION_NUMBER
> +     std::unique_ptr<OSSL_DECODER_CTX, decltype(&OSSL_DECODER_CTX_free)> 
> decoderCtx(
> +         OSSL_DECODER_CTX_new_for_pkey(&pubKey, "DER", nullptr, "RSA", 
> EVP_PKEY_PUBLIC_KEY, nullptr, nullptr),
> +         OSSL_DECODER_CTX_free);
> +@@ -517,10 +522,16 @@ EVPPKeyPtr loadRSAPublicKey(const QByteArray &der)
> +         qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Failed to create 
> OSSL_DECODER_CTX";
> +         return {nullptr, EVP_PKEY_free};
> +     }
> ++#endif
> + 
> +     const auto rawDer = QByteArray::fromBase64(der);
> ++#ifdef LIBRESSL_VERSION_NUMBER
> ++    const unsigned char *p = reinterpret_cast<const unsigned char 
> *>(rawDer.constData());
> ++    if ((pubKey = d2i_PUBKEY(nullptr, &p, rawDer.size())) == nullptr) {    
> ++#else
> +     std::unique_ptr<BIO, decltype(&BIO_free)> 
> pubKeyBio(BIO_new_mem_buf(rawDer.constData(), rawDer.size()), BIO_free);
> +     if (!OSSL_DECODER_from_bio(decoderCtx.get(), pubKeyBio.get())) {
> ++#endif
> +         // No need to free pubKey, it's initialized by this function only 
> on success
> +         qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Failed to decode 
> public key:" << ERR_error_string(ERR_get_error(), nullptr);
> +         return {nullptr, EVP_PKEY_free};
> +@@ -575,11 +586,16 @@ std::optional<bool> doVerifySignature(EVP_PKEY *key, c
> + 
> + uint64_t getKeyE(EVP_PKEY *key)
> + {
> ++#ifdef LIBRESSL_VERSION_NUMBER
> ++    const RSA *rsa = EVP_PKEY_get0_RSA(key);
> ++    return BN_get_word(RSA_get0_e(rsa));
> ++#else
> +     BIGNUM *bne = nullptr;
> +     EVP_PKEY_get_bn_param(key, OSSL_PKEY_PARAM_RSA_E, &bne);
> +     const uint64_t size = BN_get_word(bne);
> +     BN_free(bne);
> +     return size;
> ++#endif
> + }
> + 
> + void DKIMCheckSignatureJob::verifyRSASignature()
> 

Reply via email to