【问题标题】:How to add your own rand_poll implementation in openssl?如何在 openssl 中添加自己的 rand_poll 实现?
【发布时间】:2016-04-22 05:57:42
【问题描述】:

我正在将 openssl 库移植到 uwp(通用 Windows 10 平台)。标准的 rand_poll 实现似乎不适用于 uwp。我正在考虑添加一个定制的实现。为此,我创建了一个 .cpp 文件(C 中不存在对命名空间的支持,因此我必须添加一个 cpp 文件),其中包含我自定义的 rand_poll() 实现。如何将此文件添加到 openssl 构建系统,以便使用我的文件而不是 rand_win.c 中的 rand_poll 功能?

非常感谢任何指针和建议。

【问题讨论】:

    标签: c++ random openssl win-universal-app


    【解决方案1】:

    首先,您需要防止将原始实现链接到您的项目中。为此,您可以使用条件编译,例如在 rand_win.c 中:

    #if ! UWP # or some other way to detect UWP
    ...original RAND_poll implementation...
    #endif
    

    然后在你的 .cpp 文件中:

    extern "C" int RAND_poll(void)
    {
    // your impl
    }
    

    需要extern "C" 位才能使编译器将此符号导出为 C 可调用函数,而无需修改 C++ 名称。您可以在实现中使用 C++ 代码。只是不要让任何 C++ 异常逃逸你的函数。

    【讨论】:

    • 感谢您的回复。这是非常有帮助的。不过我有一个疑问。如何将我的文件添加到 OpenSSL 构建系统?
    • @salman1864830:搜索rand_win.c,我猜你会找到合适的makefile或其他配置文件,你需要在其中添加你的.cpp文件。
    • 你能提供更多细节吗?我认为仅仅用cpp文件替换c文件是行不通的(在uwp中,cpp文件是用/ZW标志编译的。如果你指定这个标志,c文件将不会编译)
    【解决方案2】:

    为此,我创建了一个 .cpp 文件(C 中不支持命名空间,所以我必须添加一个 cpp 文件),其中包含我自定义的 rand_poll() 实现。

    您应该完全避免使用rand_poll。请参阅 OpenSSL wiki 上的 Random Numbers | Windows Issues

    相反,您应该:

    IBuffer buffer = CryptographicBuffer.GenerateRandom(length);
    

    然后将缓冲区传递给 OpenSSL 的RAND_seed


    如何将此文件添加到 openssl 构建系统,以便从我的文件而不是 rand_win.c 中使用 rand_poll 功能?

    制作补丁并就地替换它可能是最简单的方法。你可以在<openssl dir>/crypto/rand/rand_win.c找到源代码。

    或者,创建一个 ENGINE,然后用您的引擎的方法替换默认的随机方法。一个易于理解的例子是英特尔的 RDRAND 引擎。以下是添加类似引擎时感兴趣的文件:

    $ grep -IR _rdrand * | cut -f 1 -d ':' | sort | uniq
    crypto/engine/Makefile
    crypto/engine/eng_all.c
    crypto/engine/eng_rdrand.c
    crypto/engine/engine.h
    crypto/x86_64cpuid.pl
    crypto/x86cpuid.pl
    include/openssl/engine.h
    ...
    

    【讨论】:

    • 为uwp编译c文件和cpp文件的方式不同。仅仅修补和替换它是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多