Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dcmtk] The dcmtk[openssl] not actually apply WITH_OPENSSL in windows x64 #38476

Open
zzfzzf1018 opened this issue Apr 30, 2024 · 1 comment
Open
Assignees
Labels
category:port-bug The issue is with a library, which is something the port should already support

Comments

@zzfzzf1018
Copy link

Describe the bug
I use the command to install the dcmtk with openssl feature on

vcpkg install dcmtk[openssl]

Then I write some sample code using dcmtk tls like

...
#include <dcmtk/dcmtls/tlslayer.h>
...
int main(int, char **)
{
...
 DcmTLSTransportLayer::initializeOpenSSL();
...
}

It works well when building and executing in linux environment (in my WSL2 ubuntu), But in windows, I got below errors when build the project

[build] C:\fly_dev_3\cmake_try\4-sample-win\main.cpp(147,5): error C2653: 'DcmTLSTransportLayer': is not a class or namespace name [C:\fly_dev_3\cmake_try\4-sample-win\out\build\Test\MyTest.vcxproj]
[build] C:\fly_dev_3\cmake_try\4-sample-win\main.cpp(147,27): error C3861: 'initializeOpenSSL': identifier not found [C:\fly_dev_3\cmake_try\4-sample-win\out\build\Test\MyTest.vcxproj]

I find that the windows dcmtk package in dcmtk/config/osconfig.h file the WITH_OPENSSL not defined

Seems the feature not truly enabled.

Environment

  • OS: Windows 10
  • Compiler: Visual Studio 2022 X64

To Reproduce
Steps to reproduce the behavior:

  1. ./vcpkg install dcmtk[openssl]
  2. Create a cmake project using the following code
#include <iostream>
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmnet/assoc.h"
#include <dcmtk/dcmnet/dimse.h>
#include <dcmtk/dcmtls/tlslayer.h>
using namespace std;
int opt_acse_timeout = 30;
int main(int, char **)
{
    DcmTLSTransportLayer::initializeOpenSSL(); // initialize OpenSSL library
    T_ASC_Network *net; // network struct, contains DICOM upper layer FSM etc.
    OFCondition cond = ASC_initializeNetwork(NET_REQUESTOR, 0, opt_acse_timeout, &net);
    if (!cond.good())
    {
        return 1;
    }
    T_ASC_Parameters *params; // parameters of association request
    cond = ASC_createAssociationParameters(&params, ASC_DEFAULTMAXPDU);
    if (!cond.good())
    {
        return 1;
    }
    ///////////////////////TLS//////////////////////////
    {
        T_ASC_NetworkRole opt_networkRole = NET_REQUESTOR;
        DcmTLSTransportLayer *tLayer = new DcmTLSTransportLayer(opt_networkRole, OFnullptr, OFFalse);
        auto rootCAFile = "/mnt/c/test/rootCA.cer";
        cond = tLayer->addTrustedCertificateFile(rootCAFile, DcmKeyFileFormat::DCF_Filetype_PEM);
        if (cond.bad())
        {
            return 1;
        }
        // skip cert check
        tLayer->setCRLverification(TCR_noCRL);
        cond = tLayer->setTLSProfile(DcmTLSSecurityProfile::TSP_Profile_BCP_195_RFC_8996);
        if (cond.bad())
        {
            return 1;
        }
        tLayer->setCertificateVerification(DcmCertificateVerification::DCV_requireCertificate);
        cond = ASC_setTransportLayer(net, tLayer, 0);
        if (cond.bad())
        {
            return 1;
        }
        cond = ASC_setTransportLayerType(params, true);
        if (cond.bad())
        {
            return 1;
        }
    }

    // set calling and called AE titles
    ASC_setAPTitles(params, "ECHOSCU", "ANY-SCP", NULL);
    ASC_setPresentationAddresses(params, "172.17.112.1", "172.17.112.1:8889");
    // list of transfer syntaxes, only a single entry here
    const char *ts[] = {UID_LittleEndianImplicitTransferSyntax};
    // add presentation context to association request
    int preId = 1;
    ASC_addPresentationContext(params, preId, UID_VerificationSOPClass, ts, 1);

    // request DICOM association
    T_ASC_Association *assoc;
    cond = ASC_requestAssociation(net, params, &assoc);
    if (!cond.good())
    {
        return 1;
    }
    {
        T_DIMSE_Message msg;
        memset((char *)&msg, 0, sizeof(msg));
        msg.msg.CStoreRQ.MessageID = 1;
        msg.CommandField = DIMSE_C_STORE_RQ;
        msg.msg.CStoreRQ.DataSetType = T_DIMSE_DataSetType::DIMSE_DATASET_PRESENT;
        strcpy(msg.msg.CStoreRQ.AffectedSOPClassUID, "1.2.840.10008.5.1.4.1.1.2"); // 不传文件名会unknown开头
        strcpy(msg.msg.CStoreRQ.AffectedSOPInstanceUID, "1.2.3.4.5");              // 设置受影响的SOP实例UID
        auto dcmFile = "/mnt/c/test/CT.DCM";
        cond = DIMSE_sendMessageUsingFileData(assoc, preId, &msg, NULL, dcmFile, NULL, NULL);
        if (!cond.good())
        {
            return 1;
        }
    }

    cond = ASC_releaseAssociation(assoc); // release association
    if (!cond.good())
    {
        return 1;
    }
    cond = ASC_destroyAssociation(&assoc); // delete assoc structure
    if (!cond.good())
    {
        return 1;
    }
    cond = ASC_dropNetwork(&net); // delete net structure
    if (!cond.good())
    {
        return 1;
    }
}
  1. Build failed, because the macro WITH_OPENSSL not defined, so the tlslayer.h not contain the tls related classes.

Expected behavior
Should build success like in linux env

Failure logs
···
[build] C:\fly_dev_3\cmake_try\4-sample-win\main.cpp(147,5): error C2653: 'DcmTLSTransportLayer': is not a class or namespace name [C:\fly_dev_3\cmake_try\4-sample-win\out\build\Test\MyTest.vcxproj]
[build] C:\fly_dev_3\cmake_try\4-sample-win\main.cpp(147,27): error C3861: 'initializeOpenSSL': identifier not found [C:\fly_dev_3\cmake_try\4-sample-win\out\build\Test\MyTest.vcxproj]
[build] C:\fly_dev_3\cmake_try\4-sample-win\main.cpp(149,5): error C2065: 'DcmTLSTransportLayer': undeclared identifier [C:\fly_dev_3\cmake_try\4-sample-win\out\build\Test\MyTest.vcxproj]
···

Additional context
If I define the WITH_OPENSSL in my code , then build. it will return the LINK error. So I believe the DCMTK not enable the OPENSSL feature in windowsX64

below is the vcpkg list

PS C:\Debug> vcpkg list
boost-uninstall:x64-linux                         1.84.0              Internal vcpkg port used to uninstall Boost
dcmtk:x64-linux                                   3.6.8#3             This DICOM ToolKit (DCMTK) package consists of s...
dcmtk:x64-windows                                 3.6.8#3             This DICOM ToolKit (DCMTK) package consists of s...
dcmtk[openssl]:x64-linux                                              Enable OpenSSL
dcmtk[openssl]:x64-windows                                            Enable OpenSSL
openssl:x64-linux                                 3.3.0               OpenSSL is an open source project that provides ...
openssl:x64-windows                               3.3.0               OpenSSL is an open source project that provides ...
vcpkg-cmake-config:x64-linux                      2022-02-06#1
vcpkg-cmake-config:x64-windows                    2022-02-06#1
vcpkg-cmake-get-vars:x64-linux                    2023-12-31
vcpkg-cmake-get-vars:x64-windows                  2023-12-31
vcpkg-cmake:x64-linux                             2023-05-04
vcpkg-cmake:x64-windows                           2023-05-04
@JonLiu1993 JonLiu1993 self-assigned this Apr 30, 2024
@JonLiu1993 JonLiu1993 added the category:port-bug The issue is with a library, which is something the port should already support label Apr 30, 2024
@JonLiu1993
Copy link
Member

This issue could be reproduced with vcpkg 2024-03-14-7d353e869753e5609a1f1a057df3db8fd356e49d and VS2022 17.9.6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
category:port-bug The issue is with a library, which is something the port should already support
Projects
None yet
Development

No branches or pull requests

2 participants