2

我是 openssl 的新手,我从 openssl 下载了 openssl-fips-2.0.1 代码,但是,我无法追踪到文档和安全策略中所述的 FIPS_mode_set() 的定义。但是,我确实在 fips.c 中找到了 fips_set_mode(),但它们指的不是同一个,对吗?

定义在哪里?请给我提意见。

4

3 回答 3

3

在 openssl 包中找不到 FIPS_mode_set() 代码

你得知道怎么问...

openssl-1.0.1f$ grep -R FIPS_mode_set *
apps/openssl.c:     if (!FIPS_mode_set(1)) {
CHANGES:  *) Functions FIPS_mode_set() and FIPS_mode() which call the underlying
crypto/cpt_err.c:{ERR_FUNC(CRYPTO_F_FIPS_MODE_SET), "FIPS_mode_set"},
crypto/evp/evp_cnf.c:   if (!FIPS_mode() && !FIPS_mode_set(1))
crypto/crypto.h:int FIPS_mode_set(int r);
crypto/o_fips.c:int FIPS_mode_set(int r)
Binary file fips_premain_dso matches
ssl/ssltest.c:      if(!FIPS_mode_set(1))
util/libeay.num:FIPS_mode_set    3253    EXIST::FUNCTION:
openssl-1.0.1f$ 

声明在 in crypto/crypto.h,定义在crypto/o_fips.c. 这里来自o_fips.c

int FIPS_mode_set(int r)
    {
    OPENSSL_init();
#ifdef OPENSSL_FIPS
#ifndef FIPS_AUTH_USER_PASS
#define FIPS_AUTH_USER_PASS "Default FIPS Crypto User Password"
#endif
    if (!FIPS_module_mode_set(r, FIPS_AUTH_USER_PASS))
        return 0;
    if (r)
        RAND_set_rand_method(FIPS_rand_get_method());
    else
        RAND_set_rand_method(NULL);
    return 1;
#else
    if (r == 0)
        return 1;
    CRYPTOerr(CRYPTO_F_FIPS_MODE_SET, CRYPTO_R_FIPS_MODE_NOT_SUPPORTED);
    return 0;
#endif
    }

如果您希望FIPS_mode_set通过特殊设置进入“FIPS 模式”或切换某些算法,则在此步骤不会发生这种情况。

它在链接时发生得更早。幕后发生的fipsld是你的编译器,它会寻找对LD. 如果LD未调用,则只需fipsld调用您的常规编译器(可能/usr/bin/gcc)。如果它看到对 的调用LD,那么它会做三件事。

首先,它编译fips_premin.c. 然后它调用 realld来执行与所有目标文件及其fips_premain.o生成的最终链接。最后,它调用incore交换 FIPS 对象模块,计算相关text和的签名data(相关是指 FIPS 代码和数据),然后将签名嵌入到可执行文件中。

签名是使用 HMAC 生成的,并且密钥嵌入在可执行文件中。它没有什么特别之处,它在世界各地的所有可执行文件中都是不变的。这是使用的密钥:etaonrishdlcupfm


如果您在构建可执行文件时没有采取特殊步骤,那么您可能会遗漏一些步骤。以下是使用fipsld和的步骤incore

$ export CC=`find /usr/local -name fipsld`
$ echo $CC 
/usr/local/ssl/fips-2.0/bin/fipsld
$ export FIPSLD_CC=`find /usr/bin -name gcc`
$ echo $FIPSLD_CC 
/usr/bin/gcc

现在,做一个标准configmake. 有时你必须做config,然后调整CCFIPSLD_CC然后运行,make因为有些config文件在排列上阻塞。有时您必须打开一个Makefileafterconfig并更改CC/usr/local/ssl/fips-2.0/bin/fipsld. 有很多方法可以解决特定的包装问题。


我从 openssl 下载了 openssl-fips-2.0.1 代码,但是,我无法追踪到 FIPS_mode_set() 的定义

openssl-fips-NNN如果您根据安全策略构建 FIPS 对象模块,则提供经过 FIPS 验证的加密。您可以在此处找到 OpenSSL FIPS 1402-安全策略

如果您所做的只是下载和构建openssl-fips-NNN,那么您可能没有使用经过 FIPS 验证的加密。有一个程序要遵循,其中包括获取源代码的“可信”副本。您可以下载并验证签名,但您需要经过 FIPS 验证的签名检查器,这会产生先有鸡还是先有蛋的问题,因为您无法从源代码构建它。所以实际的解决方案是从 OpenSSL Foundation 订购 CD。这很奇怪,但它是事实。例如,请参阅OpenSSL FIPS 用户指南OpenSSL FIPS 安全策略,附录 B,受控分发文件指纹。

一旦构建并安装了 FIPS 对象模块,您就可以构建库的 FIPS Capable 版本。FIPS Capable OpenSSL 将使用 FIPS 对象模块(如果可用)。将其视为“可插拔”架构。

库的 FIPS Capable 版本很简单openssl-NNN,例如openssl-1.0.1eopenssl-1.0.1f。它是你所知道和喜爱的。


您还可以考虑ctags使用源代码浏览器之类的东西来帮助您查找内容和跳转。请参阅Sourceforge 上的Exuberant Ctags

于 2014-01-31T21:43:23.673 回答
2

请参考头文件crypto.h。我可以在第 566 行找到它的定义,如下所示:

int FIPS_mode_set(int r);

文档清楚地提到它在头文件中<openssl/crypto.h>

因此,在您的代码中,包括openssl/crypto.h包含此函数的定义。如果您遇到其他问题,您可以浏览可能对您有所帮助的 OpenSSL 问题。

于 2013-12-22T09:33:15.863 回答
2

对于链接FIPS_mode_set()应该可以从libcrypto*.a对于静态链接和*.so运行时链接)。

libcrypto.a/.so随您的发行版的openssl开发人员包一起提供,或者作为 openssl-x.y.z自己构建的结果。

您可以在文件FIPS_mode_set()的源代码中找到源代码。openssl-x.y.zcrypto/o_fips.c

于 2013-12-22T12:22:55.630 回答