如何在openssl中添加自己的rand_poll实现?

时间:2016-04-22 05:57:43

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

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

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

2 个答案:

答案 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
...