c# 如何使用/crypto/cms/cms_lcl. h和其他头文件安装OpenSSL?

mw3dktmi  于 2023-03-11  发布在  C#
关注(0)|答案(1)|浏览(199)

在我的程序中,我需要使用CMS_ContentInfo结构,该结构在openssl/cms.h中声明,但在/crypto/cms/cms_lcl.c中实现,并且此文件不存在于openssl包含目录中。
首先我使用了libssl-dev软件包(我的发行版是ubuntu),但是当我发现openssl目录下已经没有目录了,我试着从源代码构建openssl。同样的,它仍然没有安装我需要的文件。默认安装不包括/crypto/cms/cms_lcl.c/crypto/cms/cms_lcl.h和其他,我不知道如何安装它而不是复制和粘贴。

4dbbbstv

4dbbbstv1#

我怀疑您并不需要cms_lcl.c本身--正如Andrew Henle所评论的,编译程序所需要的可能是头文件(例如openssl/cms.h)和 * 库 *(例如libcrypto.a)。
您需要cms_lcl.c(等等)的唯一原因是您想将这些文件编译到库中。
假设您只需要编译代码,则需要在代码中包含头文件,例如#include <openssl/cms.h>,并链接到适当的库,例如g++ ... -lcrypto
下面是我使用CMS_ContentInfo编译最小C程序的方法:

root@1bd58893ae55:/# apt-get install -y libssl-dev

下面是一个最小的代码示例,改编自Using OpenSSL API how can I access a signer's certificate info from a signed file?,它可能不起作用(因为我的简化),但足以说明它可以编译:

// main.c

#include <openssl/cms.h>

int main(int argc, char* argv[]) {
    BIO *in = NULL;
    CMS_ContentInfo *cms = NULL;
    STACK_OF(CMS_SignerInfo) *ssi = NULL;
    CMS_SignerInfo *si = NULL;
    int ret = 1;

    in = BIO_new_file(argv[1], "r");
    if (!in)
        goto err;

    cms = d2i_CMS_bio(in, NULL);
    if (!cms)
        goto err;

    ssi = CMS_get0_SignerInfos(cms);

    return 0;

err:
    return 1;
}

下面是我如何编译和链接的:

root@1bd58893ae55:/# g++ --version && g++ ./main.c -lcrypto
g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@1bd58893ae55:/#

希望能有所帮助。

相关问题