在OpenSSL FIPS模式下,RAND_字节始终返回0

在OpenSSL FIPS模式下,RAND_字节始终返回0,openssl,shared-libraries,fips,Openssl,Shared Libraries,Fips,我试图理解为什么在OpenSSL FIPS模式下使用时,RAND_bytes()总是返回0。我正在使用OpenSSL-FIPS-2.0.9 要启用FIPS模式,我的代码首先调用openssl-1.0.2j/crypto/o_FIPS.c中定义的FIPS模式集(1)。这可确保设置FIPS模式。此后,如果我调用RAND_bytes(),这会在内部触发openssl-FIPS-2.0.9/FIPS/RAND/FIPS_RAND_lib.c中定义的FIPS_RAND_bytes(),它总是返回0(基本上

我试图理解为什么在OpenSSL FIPS模式下使用时,
RAND_bytes()
总是返回0。我正在使用OpenSSL-FIPS-2.0.9

要启用FIPS模式,我的代码首先调用
openssl-1.0.2j/crypto/o_FIPS.c
中定义的
FIPS模式集(1)
。这可确保设置FIPS模式。此后,如果我调用
RAND_bytes()
,这会在内部触发
openssl-FIPS-2.0.9/FIPS/RAND/FIPS_RAND_lib.c
中定义的
FIPS_RAND_bytes()
,它总是返回0(基本上没有随机字节)

在进一步调试时,我注意到“
fips\u rand\u meth
”被设置为NULL,我无法解释这一点

我试着使用一个gdb并观察这个函数指针的值,以及它可以设置为NULL的位置,但结果是它被设置为
static RAND\u METHOD*fips\u RAND\u meth=NULL
开始时,然后在
fips\u RAND\u set\u METHOD()中将其设置为
fips\u RAND\u meth=meth

正如建议的那样,我甚至在调用
RAND\u bytes()
后立即尝试使用
ERR\u get\u error()
调用检查错误代码(如果有)。但是,它返回0(这表明没有错误)


我对设置FIPS模式然后调用其API的这种交互的理解肯定存在一些差距。如果有人能帮忙,那就太好了。提前谢谢。

这是一个愚蠢的问题,但您确定FIPS\u mode\u set()返回非零吗?调用该方法是不够的,它还必须返回传入的值(即1)。是的,它返回的是非zeroPer,RAND_bytes()中的错误代码为0表示返回的字节在加密方面不强。因此,返回值为0(失败),错误为0(字节加密不强)。让我看一看fips_rand_meth。我怀疑fips_rand_set_method()中的“if(!fips_rand_bits)”语句没有解析为true,您正在跳过meth赋值。你能跟踪fips_rand_bits值在做什么吗?我想如果你在FIPS模式下运行,这里应该是零。