我正在通过互联网查找PK11_GenerateRandom()
函数的来源,以了解该函数失败的原因。我有一个完美地使用这个函数的程序但是当我们转向Linux的新版本时,它在分叉后失败了(fork()
)
由于我不相信NSS存在问题,我怀疑我们做的事情是错误的,在旧版本的Linux中被忽略了但是新版本存在问题。
OpenSSL包在'good'和'bad'服务器上是相同的:
OpenSSL 0.9.8e-fips-rhel5 01 Jul
NSS rpm虽然有所不同。 “好”有
nss-3.12.2.0-2.el5
并且bas有这个版本
nss-3.15.3-4.el5_10
'好'服务器使用相当陈旧的Linux:
Linux GOOD 2.6.18-128.el5 #1 SMP Wed Jan 21 08:45:05 EST 2009 x86_64 x86_64 x86_64 GNU/Linux
Enterprise Linux Enterprise Linux Server release 5.3 (Carthage)
Red Hat Enterprise Linux Server release 5.3 (Tikanga)
'坏'服务器更新:
Linux BAD 2.6.18-371.4.1.el5 #1 SMP Wed Jan 29 11:05:49 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
Oracle Linux Server release 5.10
Red Hat Enterprise Linux Server release 5.10 (Tikanga)
任何关于我在哪里可以找到来源或者可能是失败原因(如来自fork()
的副作用)的任何线索都将非常感激。
这是代码,这很简单,我认为不需要。
/* random points to properly allocated memory, let=32 */
SECStatus rv = PK11_GenerateRandom((unsigned char *)random, (int)len);
if ( rv != SECSuccess )
printf( "PK11_GenerateRandom error = %d\n", PR_GetError()) ;
,输出信息当然是:
PK11_GenerateRandom error = -8023
答案 0 :(得分:1)
PK11_GenerateRandom()
函数的来源:http://mxr.mozilla.org/mozilla-central/source/security/nss/lib/pk11wrap/pk11slot.c#2285
根据我的计算,-8023对应错误SEC_ERROR_PKCS11_DEVICE_ERROR
原因(感谢jariq的提示)在此处描述:https://bugzilla.mozilla.org/show_bug.cgi?id=331096
在过去,可以分叉并继续使用PKCS11功能。他们认为它不可能是这样的,现在,结论是,如果分叉后的孩子需要使用它们,父母不应该初始化这些功能。
PKCS11内部函数正在检查是否存在分叉(它们依赖于构建代码的平台使用各种方法。)例如,它们将进程的pid存储在内部存储器中,并且存储在一些昂贵的函数中或者不是这样的他们经常将这个保留的pid与当前的getpid()
进行比较。
解决我们的问题需要重新设计代码。