我正在努力将openssl库移植到uwp(通用Windows 10平台)。标准的rand_poll实现似乎不适用于uwp。我在想添加一个自定义的实现。为此,我创建了一个.cpp文件(命名空间的支持在C中不存在,所以我不得不添加一个cpp文件),其中包含我自定义的rand_poll()实现。如何将此文件添加到openssl构建系统,以便从我的文件而不是rand_win.c中使用rand_poll功能?
非常感谢任何指示和建议。
答案 0 :(得分:0)
首先,您需要阻止将原始实现链接到项目中。为此,您可以使用条件编译,例如在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 ++异常逃脱你的功能。
答案 1 :(得分:0)
为此,我创建了一个.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
...