我正在互联网上寻找PK11_GenerateRandom()函数的来源,看看为什么这个函数会失败。我有一个程序完美地使用了这个函数,但是当我们转向新版本的Linux时,它在分叉(fork())之后就失败了,因为我不认为NSS有问题,我怀疑我们做了一些错误的事情,这在以前的Linux版本中被忽略了,但是对于新的版本,存在一个问题。
OpenSSL包在‘好事’和‘坏’服务器上是相同的:
OpenSSL 0.9.8e-fips-rhel5 01 Jul然而,NSS rpm有所不同。“好”
nss-3.12.2.0-2.el5巴斯有这个版本
nss-3.15.3-4.el5_10“good”服务器使用了相当过时的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发布于 2014-03-10 16:19:36
PK11_GenerateRandom()函数的来源:http://mxr.mozilla.org/mozilla-central/source/security/nss/lib/pk11wrap/pk11slot.c#2285
根据我的计算,-8023对应误差SEC_ERROR_PKCS11_DEVICE_ERROR。
原因(感谢jariq的提示)在这里描述:bug.cgi?id=331096
在过去,分叉和继续使用PKCS11函数是可以的。他们决定不能这样做,现在的结论是,如果孩子在分叉后被期望使用这些函数,家长就不应该初始化这些函数。
PKCS11内部函数正在检查是否存在分叉(它们使用各种方法依赖于构建代码的平台)。例如,它们将进程的pid存储在内部内存中,并且在一些昂贵的函数中或调用不经常,它们将保存的pid与当前的getpid()进行比较。
解决我们的问题需要重新设计代码。
https://stackoverflow.com/questions/22303198
复制相似问题