2017-03-24 44 views
3

我有一个问题试图使用编译上一些MIPS设备能够FIPS的的OpenSSL共享库(libcrypto)。
我交叉编译的FIPS对象模块,然后OpenSSL库按以下方式(总结):
FIPS有能力OpenSSL的交叉编译:堆芯指纹问题

export FIPS_SIG=<my_path>/incore 
./config fips --with-fipsdir=<my_path>/fips-2.0 
make depend 
make 
make install 

我做了所有必要的步骤,所以我能够编译和安装库。
当我尝试从链接OpenSSL库的应用程序运行FIPS_mod_set(1) API时,会出现此问题。
FIPS模式初始化失败收到此错误:

2010346568:error:2D06B06F:lib(45):func(107):reason(111):NA:0: 

调试FIPS代码,我发现这个问题是FIPS_check_incore_fingerprint(void)函数内部:
检查memcmp(FIPS_signature,sig,sizeof(FIPS_signature))失败。
中我发现,FIPS_signature值仍然是默认的,所以我有怀疑,堆芯脚本,由fipsld实用叫,没有嵌入正确的指纹内OpenSSL的共享调试不断深入目的。
如何检查incore脚本是否将指纹嵌入共享对象内?
如何打印预期的指纹?
我需要修改incore脚本吗? (我想这是不允许的)
你有什么建议吗?
非常感谢!

P.S .:我使用x86 Linux机器进行交叉编译。

+0

只是一个FYI ...只有一个MIPS平台已被验证。其采用TI TNETV1050处理器的VxWorks 6.8操作环境。另请参阅[OpenSSL FIPS 140-2安全策略2.0版。第9-10页](https://www.openssl.org/docs/fips/SecurityPolicy-2.0.pdf)。 – jww

+0

[这里](https://stackoverflow.com/questions/35664412/unable-to-build-a-working-fips-capable-openssl-on-hp-ux)是一个问题,我问了一阵子之前,当我有一个相关的问题。出于调试的目的,你可以修改任何文件(我为_fips \ _premain.c_,_fips.c_,_fipsld_做过),但是在构建“官方”版本时,你不能改变任何东西(实际上有很多限制)。另外,请确保您的平台/体系结构对受支持。 – CristiFati

+0

可能有用的问题缺少相当数量的信息。与其猜测潜在的问题,可能[OpenSSL FIPS对象模块2.0版用户指南](https://www.openssl.org/docs/fips/UserGuide-2.0.pdf)将是一个好的开始。 – jww

回答

1

我发现了这个问题!我将尝试解释整个调试过程和解决方案。

引言:

当OpenSSL的构成为FIPS能,生成文件调用实用程序编译过程中,fipsld,其中两个执行FIPS 对象模块的校验和生成新的HMAC -SHA-1摘要为应用程序的可执行文件(如官方OpenSSL的用户指南https://www.openssl.org/docs/fips/UserGuide-2.0.pdf中说明)

fipsld命令要求CCFIPSLD_CC设置环境变量, ,后者优先。
在Makefile中,你会发现这样的事情:

libcrypto$(SHLIB_EXT): libcrypto.a fips_premain_dso$(EXE_EXT) 
    @if [ "$(SHLIB_TARGET)" != "" ]; then \ 
     if [ "$(FIPSCANLIB)" = "libcrypto" ]; then \ 
      FIPSLD_LIBCRYPTO=libcrypto.a ; \ 
      FIPSLD_CC="$(CC)"; CC=$(FIPSDIR)/bin/fipsld; \ 
      export CC FIPSLD_CC FIPSLD_LIBCRYPTO; \ 
     fi; \ 
     $(MAKE) -e SHLIBDIRS=crypto CC="$${CC:-$(CC)}" build-shared && \ 
     (touch -c fips_premain_dso$(EXE_EXT) || :); \ 
    else \ 
     echo "There's no support for shared libraries on this platform" >&2; \ 
     exit 1; \ 
    fi 

然后,fipsld实用程序将调用一个shell脚本,堆芯,用来嵌入FIPS目标模块的预期指纹OpenSSL的共享对象。通过FIPS_SIG环境变量来指定堆内的路径是很重要的,如:

export FIPS_SIG=$PWD/openssl­fips­2.0/util/incore 

调试:

调试堆芯脚本,我可以看到,该脚本试图嵌入签名成共享对象位于偏移量0x001EE6B0而共享对象内部的FIPS_signature符号位于不同的偏移量处,更具体的位于0x001F0630

objdump -t libcrypto.so.1.0.0 | grep FIPS_signature 
001f0630 g  O .data 00000014    FIPS_signature 

readelf -a libcrypto.so.1.0.0 | grep FIPS_signature 
    870: 001f0630 20 OBJECT GLOBAL DEFAULT 18 FIPS_signature 
    3925: 001f0630 20 OBJECT GLOBAL DEFAULT 18 FIPS_signature 

此外倾倒共享对象我无法在偏移0x001EE6B0找到所生成的签名,所以我得出的结论是共享对象被该签名通过一些嵌入过程之后编辑其他过程。

SOLUTION:

我使用的包生成文件用于以下面的方式格式化的OpenSSL分组:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) 
    <options> 
    all 
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) 
    <options> 
    build-shared 
rm $(PKG_BUILD_DIR)/libssl.so.*.*.* 
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) 
    <options> 
    do_linux-shared 
$(MAKE) -C $(PKG_BUILD_DIR) 
    <options> 
    install 

作为怀疑,化妆积聚共享化妆do_linux共享命令负责以错误的方式更改共享对象。
注意不要使用适当的环境变量来调用build-shared。

我改变了包的Makefile:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) 
    <options> 
    all 
$(MAKE) -C $(PKG_BUILD_DIR) 
    <options> 
    install 

现在FIPS_check_incore_fingerprint(void)函数成功,一切正常返回!

注:

以下指南适用于Android设备是非常有益的,找到妥善的解决办法。 https://wiki.openssl.org/index.php/FIPS_Library_and_Android

+0

“我可以看到脚本试图将签名嵌入到偏移量为0x001EE6B0的共享对象中”您是否介意解释如何找到它?谢谢! – zachwhaley

+1

我打印了incore脚本中使用的偏移量(修补代码),并将偏移量与objdump检查结果进行了比较 – neoben