0

我正在通过互联网寻找函数的来源,PK11_GenerateRandom()看看函数为什么会失败。我有一个程序可以完美地使用这个功能,但是当我们迁移到新版本的 Linux 时,它在 fork ( fork()) 后失败了因为我不相信 NSS 有问题,我怀疑我们做错了一些在旧版本的 Linux 但使用新版本时存在问题。

OpenSSL 包在“好”和“坏”服务器上是相同的:

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
  • 格雷格
4

1 回答 1

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

就是在过去,可以 fork 并继续使用 PKCS11 函数。他们决定不能那样做,现在的结论是,如果预期分叉后的孩子使用这些函数,则父母不应该初始化这些函数。

PKCS11 内部函数正在检查是否存在分叉(它们使用各种方法,具体取决于代码构建的平台。)例如,它们将进程的 pid 存储在内部存储器中,并且在一些昂贵的函数或不经常调用的函数中进行比较这个保留的 pid 和 current getpid()

解决我们的问题需要重新设计代码。

于 2014-03-10T16:19:36.263 回答