我在 MIPS 设备上尝试使用 OpenSSL 共享库(libcrypto)编译为支持FIPS 时遇到问题。
我以下列方式交叉编译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 值仍然是默认值,所以我怀疑 incore 脚本,由 fipsld 实用程序,未将指纹正确嵌入OpenSSL共享对象中
如何检查 incore 脚本是否将指纹嵌入共享对象中?
如何打印预期的指纹?
我是否需要调整 incore 脚本? (我想这是不允许的)
你有什么建议吗?
非常感谢!
P.S。:我正在使用x86 Linux机器进行交叉编译。
答案 0 :(得分:4)
我发现了这个问题!我将尝试解释整个调试过程和解决方案。
<强>引言强>
当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脚本 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 处找到生成的签名,因此我得出结论,共享对象是在其他进程的签名嵌入过程之后编辑的。
<强> SOLUTION:强>
我正在使用以下方式格式化的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