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

C 在openssl包中找不到FIPS_mode_set()代码,c,openssl,fips,C,Openssl,Fips,我是openssl新手,我从openssl下载了openssl-fips-2.0.1代码,但是,我无法跟踪文档和安全策略中所述的fips_mode_set()的定义。然而,我确实在fips.c中找到了fips_set_mode(),但它们指的不是同一个,对吗 定义在哪里? 请通知我。请参阅头文件crypto.h。我可以在第566行找到它的定义,如下所示: int FIPS_mode_set(int r); 清楚地提到它在头文件中 因此,在代码中,包含openssl/crypto.h以包含此函数

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

定义在哪里?
请通知我。

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

int FIPS_mode_set(int r);
清楚地提到它在头文件


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

有关链接
FIPS\u mode\u set()
应可从
libcrypto
获得(
*.a
用于静态链接,
*.so
用于运行时链接)

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

您可以在文件
crypto/o_FIPS.c
中的
openssl-x.y.z
的源代码中找到
FIPS\u mode\u set()的源代码

在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$ 
声明位于
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\u mode\u set
以通过特殊设置进入“FIPS mode”或切换某些算法,则此步骤不会发生这种情况

链接时会更早发生。引擎盖下发生的是
fipsld
是您的编译器,它会查找
LD
的调用。如果未调用
LD
,则
fipsld
只调用常规编译器(可能是
/usr/bin/gcc
)。如果它看到调用
LD
,那么它会做三件事

首先,它编译
fips\u premin.c
。然后它调用real
ld
来执行与所有对象文件的最终链接,以及它生成的
fips\u premain.o
。最后,它调用
incore
在FIPS对象模块中交换,计算相关
文本
数据
(相关表示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
现在,执行标准的
config
make
。有时您必须执行
config
,然后调整
CC
FIPSLD\u CC
,然后运行
make
,因为一些
config
文件在排列时阻塞。有时您必须在
config
之后打开
Makefile
,并将
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 NNN
,那么您可能没有使用fips验证的加密技术。有一个过程要遵循,其中包括获取源代码的“可信”副本。您可以下载并验证签名,但您需要一个FIPS验证签名检查器,这会造成鸡和蛋的问题,因为您无法从源代码构建它。因此,实际的解决方案是从OpenSSL基金会订购CD。这很奇怪,但却是事实。例如,参见或附录B受控分发文件指纹

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

支持FIPS的库版本只是
openssl NNN
,例如
openssl-1.0.1e
openssl-1.0.1f
。这就是你所知道和爱的



你也可以考虑一些诸如“代码> CTAGS < /Cord>”作为源代码浏览器来帮助你找到事物并跳转。请参阅Sourceforge上的。

相对于包的根,它的原型是
include/openssl/crypto.h
头中没有定义代码,只有声明。文档中没有用于定义的代码,仅使用示例。我在寻找int-FIPS_mode_set(int r){::}这里的关键点是它不在openssl-FIPS-2.0.1中,而是在openssl-1.0.1e.tar.gz中。我说得对吗?这两个来源有什么不同,这是如何使用的?是的,你是对的@乌萨马乔:你可能喜欢在这里和这里阅读:我读了指南,感到困惑。我相信你是对的,它可能在另一个包裹里。我想我不需要它,因为我有fips.tar.gz。这个问题我得了-1分,看到人们有多挑剔真让人沮丧@它说,我可以在6小时内奖励它。你应该得到+50和+1的正确答案,我给你。:)我希望你能给我更多关于如何编译和运行fips测试的指导。几秒钟前授予@alk。嗨,noloader,我希望这个答案来得更早。我会给你赏金的。我会