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

时间:2013-12-19 19:07:42

标签: c openssl fips

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

定义在哪里? 请告诉我。

3 个答案:

答案 0 :(得分: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$ 

声明位于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。然后它调用真实ld来执行与您的所有目标文件及其生成的fips_premain.o的最终链接。最后,它调用incore交换FIPS对象模块,计算相关textdata上的签名(相关意味着FIPS代码和数据),然后将签名嵌入可执行文件。

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


如果您在构建可执行文件时没有采取特殊步骤,那么您可能错过了一些步骤。以下是使用fipsldincore的步骤:

$ 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个文件会阻塞该排列。有时您必须在Makefile之后打开config并将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- Security Policy at here

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

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

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


您可能还会考虑使用ctags这样的源代码浏览器来帮助您查找和跳转。请参阅Sourceforge上的Exuberant Ctags

答案 1 :(得分:2)

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

int FIPS_mode_set(int r);

Documentation清楚地提到它位于头文件<openssl/crypto.h>中。

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

答案 2 :(得分:2)

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

libcrypto.a/.so附带您的发行版的openssl开发人员资料包,或者是您自己建设openssl-x.y.z的结果。

您可以在FIPS_mode_set()文件的openssl-x.y.z来源中找到crypto/o_fips.c的来源。