FIPS支持OpenSSL交叉编译:incore指纹问题

我在尝试使用编译为MIPS设备上的FIPSfunctionOpenSSL共享库(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: 

debuggingFIPS代码,我发现问题出在FIPS_check_incore_fingerprint(void)函数中:
检查memcmp(FIPS_signature,sig,sizeof(FIPS_signature))失败。
进一步深入debugging,我发现FIPS_signature值仍然是默认值,所以我怀疑由fipsld实用程序调用的incore脚本没有正确地将指纹embedded到OpenSSL共享对象中。
如何检查incore脚本是否将指纹embedded到共享对象中?
如何打印预期的指纹?
我需要修改incore脚本吗? (我想这是不允许的)
你有什么build议吗?
非常感谢!

PS:我正在使用x86 Linux机器进行交叉编译。

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

介绍:

当OpenSSL被配置为具有FIPS功能时,在编译过程中,Makefile调用一个实用程序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脚本incore ,用于将FIPS对象模块的预期指纹嵌入到OpenSSL共享对象中。 通过FIPS_SIG env变量指定incore路径很重要,例如:

 export FIPS_SIG=$PWD/opensslfips2.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 并使do_linux-shared命令负责以错误的方式更改共享对象。
注意make 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