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

我在尝试使用在MIPS设备上编译为FIPS的OpenSSL共享库(libcrypto)时遇到问题.

我以下面的方式交叉编译FIPS对象模块,然后是OpenSSL库(总结):

export FIPS_SIG=/incore

./config fips --with-fipsdir=/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)

all

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)

build-shared

rm $(PKG_BUILD_DIR)/libssl.so.*.*.*

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)

do_linux-shared

$(MAKE) -C $(PKG_BUILD_DIR)

install

正如所怀疑的那样,make build-shared和make do_linux-shared命令负责以错误的方式更改共享对象.

注意在不使用适当的环境变量的情况下调用了build-shared.

我更改了包Makefile:

$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)

all

$(MAKE) -C $(PKG_BUILD_DIR)

install

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

注意:

标签:linux,openssl,cross-compiling,mips,fips

来源: https://codeday.me/bug/20190622/1265633.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值