ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – FIPS Capable OpenSSL交叉编译:内容指纹问题

2019-06-22 17:37:53  阅读:413  来源: 互联网

标签:linux openssl cross-compiling mips fips


我在尝试使用在MIPS设备上编译为FIPS的OpenSSL共享库(libcrypto)时遇到问题.
我以下面的方式交叉编译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实用程序调用的incore脚本没有正确嵌入OpenSSL共享对象中的指纹.
如何检查incore脚本是否将指纹嵌入共享对象中?
如何打印预期的指纹?
我需要调整incore脚本吗? (我想这是不允许的)
你有什么建议吗?
非常感谢!
P.S.:我正在使用x86 Linux机器进行交叉编译.

解决方法:

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

介绍:

当OpenSSL配置为支持FIPS时,在编译期间Makefile调用一个实用程序fipsld,它们都执行FIPS检查
对象模块并为应用程序可执行文件生成新的HMAC-SHA-1摘要(如官方OpenSSL用户指南https://www.openssl.org/docs/fips/UserGuide-2.0.pdf中所述)
fipsld命令要求设置CC和FIPSLD_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 env变量指定incore路径很重要,例如:

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

调试:

调试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处找到生成的签名,因此我得出结论,共享对象是在其他进程的签名嵌入过程之后编辑的.

解:

我正在使用以下方式格式化OpenSSL数据包的Makefile包:

$(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

正如所怀疑的那样,make build-shared和make do_linux-shared命令负责以错误的方式更改共享对象.
注意在不使用适当的环境变量的情况下调用了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

标签:linux,openssl,cross-compiling,mips,fips
来源: https://codeday.me/bug/20190622/1265633.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有